nginx入门——http反向代理

143 阅读1分钟

静态网页

静态网页配置

配置一个静态的AdminLTE后台系统。 Free Bootstrap Admin Template - AdminLTE.IO

配置文件实例:

server {
    
    listen 8000;
    server_name localhost
    
    location / {
        root /home/AdminLTE-3.2.0;
        index index.html index2.html index3.html;
    }
}

虚拟主机server通过listenserver_name 进行区分,如果有多个server配置,listen + server_name 不能重复。

listen

监听可以配置成IP 或着端口 或者IP+端口

eg:

listen 127.0.0.1:8000;
listen 127.0.0.1;(默认为80端口)
listen 8000;
listen *:8000;
listen localhost:8000;

server_name

server_name 主要用于区分,可以随便起名字;

也可以使用变量 $hostname 配置成主机名;

或者配置成域名:www.example.comexample.com;

如果多个server的端口重复,那么根据 域名 或者主机名去匹配server_name进行选择。

eg:

curl http://localhost:80会访问/usr/share/nginx/html

curl http://nginx-dev:80会访问/home/AdminLTE-3.2.0

# curl http://localhost:80 会访问这个
server {
    listen       80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

 # curl http://nginx-dev:80 会访问这个
server{
    listen 80;
    server_name nginx-dev;#主机名
    
    location / {
        root /home/AdminLTE-3.2.0;
        index index.html index2.html index3.html;
    }
  
}

location

/ 请求指向root目录

location 总是从 / 目录开始匹配,如果存在子目录,例如 /css ,会指向 /static/css

location /css {
  root /static;
}

HTTP 反向代理

  • 正向代理

客户端代理转发请求称为正向代理。例如VPN。

  • 反向代理

服务器端代理转发请求称为反向代理。例如nginx

image.png

  • 配置代理服务

image.png

启动ruoyi后台服务,端口为8088;

java -jar ruoyi-admin.jar

nginx配置

server {
  
  listen 8001;
  
  server_name ruoyi.localhost;
  
  location / {
    proxy_pass http://localhost:8088;
  }

}

proxy_pass配置说明:

location /some/path/ {
    proxy_pass http://localhost:8080;
}
  • 如果proxy-pass的地址只配置到端口,不包含/或其他路径,那么location将被追加到转发地址中 如上所示,访问 http://localhost/some/path/page.html 将被代理到 http://localhost:8080/some/path/page.html
location /some/path/ {
    proxy_pass http://localhost:8080/zh-cn/;
}

设置代理请求headers

‎用户可以重新定义或追加header信息传递给后端‎服务器。可以包含文本、变量及其组合。默认情况下,仅重定义两个字段:

proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

由于使用反向代理之后,后端服务无法获取用户的真实IP,所以,一般反向代理都会设置以下header信息。

location /some/path/ {
    #nginx的主机地址
    proxy_set_header Host $http_host;
    #用户端真实的IP,即客户端IP
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_pass http://localhost:8088;
}

常用变量的值:

$host:nginx主机IP,例如192.168.56.105

$http_host:nginx主机IP和端口,192.168.56.105:8001

$proxy_host:localhost:8088,proxy_pass里配置的主机名和端口

$remote_addr:用户的真实IP,即客户端IP。

非HTTP代理

如果要将请求传递到非 HTTP 代理服务器,可以使用下列指令:

  • fastcgi_pass 将请求转发到FastCGI服务器(多用于PHP)
  • scgi_pass 将请求转发到SCGI server服务器(多用于PHP)
  • uwsgi_pass 将请求转发到uwsgi服务器(多用于python)
  • memcached_pass 将请求转发到memcached服务器

参考文档: 3.HTTP反向代理 (yuque.com)