【Linux基础服务教程】Nginx的反向代理和负载均衡功能

一、Nginx反向代理功能

  • 应用范围:
    • web服务
    • mail服务
    • 数据库服务

1.语法

location /  {
	proxy_pass    后端服务器地址
}

2.示例

  • Nginx服务器IP:192.168.140.10
  • 后端web服务器IP:192.168.140.11

A.将192.168.140.10/mp3的请求,通过反向代理交给192.168.140.11/music

我们前端浏览器的地址还是192.168.140.10/mp3,但是内容却是192.168.140.11/music下的内容

location /mp3 {
     proxy_pass http://192.168.140.11/music;
}

B.Nginx默认会把用户的访问地址,拼接到反向代理地址的后面

如下所示,我们前端浏览器访问192.168.140.10/testA的时候,后端反向代理交给的地址是192.168.140.11/testA

location /testA {
            proxy_pass http://192.168.140.11;
        }

C.当location以正则的方式匹配的时候,后端反向代理仅支持写IP地址

location ~ /testB {
             proxy_pass http://192.168.140.11;
        } 

3.显示前端真实IP

不加参数的时候,后端web服务器访问日志会记录Nginx的IP地址

location /mp3 {
            proxy_pass http://192.168.140.11/music;
            proxy_set_header X-REAL-IP $remote_addr;
        }

$remote_addr
nginx内置变量,真实客户端地址

修改httpd的日志(当后端web服务器为Apache时)

[root@web01 ~]# grep "LogFormat" /etc/httpd/conf/httpd.conf 
    LogFormat "%{X-REAL-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

修改第一个记录客户端IP的变量

反向代理到https链接

location / {
       proxy_pass https://wsjj.top;
       proxy_set_header X-REAL-IP $remote_addr;
       proxy_ssl_server_name on;	#开启支持https,同样适用站点接入了Cloudflare
   }

二、upstream模块应用(实现负载均衡)

1.upstream模块的作用

  • 实现后端服务的负载均衡
  • 实现对后端服务的健康状态检查

2.upstream模块调度算法

  • rr轮询(默认)
    • 将不同的请求转交到不同的后端服务器处理
    • 支持权重weight
    • 解决会话保持/持久
  • ip_hash
    • 根据客户端地址进行hash运算
    • 将同一个客户端的请求在一段时间内转交到同一个后端服务器处理
    • 权重越高,Nginx自动分配的请求越多
  • least_conn
    • 最少连接
    • 会根据不同服务器收到的连接,把请求交给收到连接最少的服务器

3.语法

upstream不能定义在某个server{}虚拟主机内部!!!

upstream  组名 {
    [调度算法];
    server  IP:port  [weight=数字]  [max_fails=2]  [fail_timeout=2];
    server  IP:port  [weight=数字]  [max_fails=2]  [fail_timeout=2];
    server  IP:port  [weight=数字]  [max_fails=2]  [fail_timeout=2] [backup];
}		#backup为备用服务器

location {
    proxy_pass  http://组名;
}
  • IP:port
    • 后端真实服务器的地址
  • weight
    • 权重,默认为1,数字越大,权重越高
  • max_fails
    • 健康状态检查时,最大的失败次数
  • fail_timeout
    • 失败次数的间隔时间,单位为秒
  • backup
    • 指定备份服务器
upstream webserver {
       server 192.168.140.11:80 weight=1 max_fails=2 fail_timeout=2;
       server 192.168.140.12:80 weight=1 max_fails=2 fail_timeout=2;
       server 127.0.0.1:8000 backup;
    }
location / {
           proxy_pass http://webserver;		#反向代理到自定义的组名
           proxy_set_header X-REAL-IP $remote_addr;
        }
server {
        listen       8000;
        server_name  localhost;

        location / {
            root   /test2;
            index  index.html index.htm;
        }
    }