【Day 50 】Linux-nginx反向代理与负载均衡
概述
在现代 Web 架构中,Nginx 作为高并发、高性能的 HTTP 和反向代理服务器,被广泛应用于提升服务性能、增强系统安全性和实现负载均衡。其中,反向代理能够隐藏后端服务器信息并优化请求处理流程,负载均衡则可将请求分发到多个后端节点,大幅提升系统并发能力。
一、反向代理(proxy 模块)
1. 作用
- 性能优化:增加业务并发量。Nginx 可缓存静态资源,减少后端服务器处理压力,提升响应速度;同时通过连接复用,提高并发处理能力。
- 提高业务安全性:隐藏后端业务服务器的真实 IP 和端口信息,避免直接暴露在公网中,降低被攻击风险,
- 功能扩展:可实现请求过滤、URL 重写、SSL 终结等功能,简化后端服务器的配置复杂度。
2. 核心配置语法
反向代理的核心是通过location 块配合proxy_pass 指令,将特定请求转发至后端服务器。
location URI {proxy_pass 后端服务器地址;
}
URI:匹配路径:指定需要代理的客户端请求路径(如/mp3、/download);
proxy_pass 后端服务器地址; 指定请求转发的后端服务器地址(可包含 IP、端口及路径)
- 后端服务器地址:实际访问地址
明确目标:代理服务器正确转发 + 后端服务器正确响应
(1)路径拼接规则
Nginx 会自动将location中的匹配路径与proxy_pass的后端地址拼接,拼接方式取决于后端地址是否以斜杠结尾:
- 若后端地址无斜杠(如http://192.168.140.11/music),客户端请求路径会直接拼接在后端路径后;
- 若后端地址有斜杠(如http://192.168.140.11/music/),客户端请求路径会替换location的匹配路径后拼接。
location /test1 {
proxy_pass http://aa.linux.com; //nginx的反向代理,hosts文件需要加上dns解析
}
192.168.140.10/music // 192.168.140.10的网页目录(/var/www/html)下的music文件
192.168.140.10:8088/music //若nginx换端口
(2)不同场景下的配置示例
场景 1:带 URI 的精确匹配转发
当访问 Nginx 的任意路径时,代理到后端服务器的/music3 路径:
location / {proxy_pass http://192.168.140.20/music3;
}
# 说明:当客户端访问 Nginx 服务器的任意路径(例如http://你的Nginx地址/xxx)时,
# Nginx 会将该请求转发到 http://192.168.140.20/music3 对应的服务,
# 并将后端服务的响应返回给客户端。
场景 2:不带 URI 的路径转发
当后端服务器没有特定 URI 时,Nginx 会将 location 中的 URI 拼接到后端地址:
location /test {proxy_pass http://192.168.140.10;
}
# 说明:此时请求http://nginx-ip/test/xyz会被转发为http://192.168.140.10:9000/test/xyz
场景 3:正则表达式匹配的特殊规则
当 location 使用正则表达式(~
或~*
)匹配请求时,proxy_pass后的后端地址不允许包含任何 URI,否则会报错:
# 正确配置(无URI)
location ~ /music {proxy_pass http://192.168.140.10;
}# 错误配置(包含URI,会导致Nginx启动失败)
# location ~ /music {
# proxy_pass http://192.168.140.10/project; # 此处错误
# }
3. 后端服务器记录客户端真实 IP
默认情况下,后端服务器会将 Nginx 的 IP 识别为客户端 IP,如需记录真实客户端 IP,需通过以下配置实现:
(1)Nginx 反向代理添加标识字段
在代理规则中添加X-REAL-IP
或X-Forwarded-For
字段,传递客户端真实 IP:
location /mp3 {proxy_pass http://192.168.140.11/music;# 传递客户端真实IP给后端proxy_set_header X-REAL-IP $remote_addr;# 若后端为多代理架构,使用X-Forwarded-For记录代理链proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
(2)
① 后端为 Apache(httpd)时的配置
修改 Apache 的日志格式,使其解析X-REAL-IP
字段:
# 在httpd.conf中修改combined日志格式
LogFormat "%{X-REAL-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
② 后端为 Nginx 时的配置
修改后端 Nginx 的日志格式,使用$http_x_forwarded_for
获取真实 IP:
# 在后端Nginx的main日志格式中添加
log_format main '$http_x_forwarded_for [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent"';