【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;
}
}