NGINX(十三)Nginx 反向代理/负载均衡/HTTPS常用配置速查表
对于初学者来说,Nginx 配置的难点在于“记不住参数”和“不知道如何落地”。本文整理了 Nginx 最核心的三大应用场景——反向代理、负载均衡、HTTPS 配置,用“配置模板+实战例子+参数说明”的形式,帮你快速上手。所有配置均经过 Linux 环境验证,复制修改即可使用,真正做到“拿来就用”。
一、反向代理配置:隐藏后端服务的“中间层”
反向代理是 Nginx 最常用的功能之一:客户端请求先发送到 Nginx,再由 Nginx 转发到后端服务(如 Tomcat、Node.js),实现“隐藏后端地址”“统一入口”“过滤请求”等效果。
1.1 基础反向代理(转发所有请求)
场景:将 http://nginx-server:80 的所有请求,转发到后端 http://192.168.1.100:8080(如 Tomcat 服务)。
配置模板
# 虚拟主机配置(放在 /etc/nginx/conf.d/ 目录下,命名为 proxy.conf)
server {
listen 80; # Nginx 监听端口
server_name nginx-server; # Nginx 访问域名/IP(如 192.168.1.200)
# 核心:所有请求转发到后端服务
location / {
proxy_pass http://192.168.1.100:8080; # 后端服务地址(必须加 http://)
# 可选:转发客户端真实IP和请求头(后端服务能获取真实客户端信息)
proxy_set_header Host $host; # 传递客户端访问的域名
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链IP
}
}
实战例子:转发 Vue 前端请求到 Node.js 后端
假设场景:
- 前端静态资源(Vue 打包后的 dist)放在 Nginx 本地
/usr/share/nginx/vue-app; - 前端 API 请求(
/api/*)需要转发到 Node.js 服务(http://192.168.1.101:3000)。
配置代码:
server {
listen 80;
server_name vue-app.example.com; # 前端访问域名
# 1. 处理静态资源(Vue 页面)
location / {
root /usr/share/nginx/vue-app; # 前端静态资源目录
index index.html; # 默认首页
try_files $uri $uri/ /index.html; # 解决 Vue 单页应用路由问题
}
# 2. 处理 API 请求(转发到 Node.js)
location /api/ {
proxy_pass http://192.168.1.101:3000/; # 注意结尾的 /!
# 解释:如果 location 是 /api/,proxy_pass 加 /,则 /api/user 会转发为 http://xxx:3000/user
# 如果不加 /,则会转发为 http://xxx:3000/api/user(根据需求选择)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
关键参数说明
| 参数 | 作用 | 注意事项 |
|---|---|---|
proxy_pass | 后端服务地址,必须以 http:// 或 https:// 开头 | 结尾是否加 / 影响路径转发,需根据后端接口路径调整 |
proxy_set_header Host $host | 让后端服务知道客户端访问的原始域名(如 vue-app.example.com) | 不加的话,后端可能获取到 192.168.1.101:3000,导致跳转错误 |
X-Real-IP | 传递客户端真实 IP(如用户的家庭 IP) | 后端通过 request.headers['X-Real-IP'] 获取,用于日志或权限校验 |
try_files | 解决 Vue/React 单页应用刷新 404 问题 | 找不到文件时,重定向到 index.html,由前端路由处理 |
1.2 反向代理超时配置(避免后端卡死后 Nginx 挂起)
场景:后端服务响应慢或超时,Nginx 需设置合理的超时时间,避免连接长期占用。
配置模板(添加到 location 块中)
location / {
proxy_pass http://192.168.1.100:8080;
# 连接后端服务的超时时间(握手阶段)
proxy_connect_timeout 30s;
# 等待后端服务响应的超时时间(从建立连接到接收第一个字节)
proxy_read_timeout 60s;
# 后端服务发送响应的超时时间(从 Nginx 发送请求到接收完所有数据)
proxy_send_timeout 60s;
}
实战例子:文件上传超时调整
如果后端有大文件上传(如 100MB),proxy_read_timeout 需要设长一些(如 5 分钟):
location /upload/ {
proxy_pass http://192.168.1.100:8080;
proxy_connect_timeout 30s;
proxy_read_timeout 300s; # 5分钟超时(足够上传大文件)
proxy_send_timeout 300s;
}
二、负载均衡配置:让多台后端服务“分担压力”
当后端服务(如 Tomcat)单台处理能力不足时,Nginx 负载均衡可将请求分发到多台后端服务器,实现“分流减压”“高可用”。
2.1 基础负载均衡(轮询策略)
场景:2 台 Tomcat 服务(192.168.1.100:8080、192.168.1.101:8080),Nginx 按“轮询”方式分发请求(默认策略)。
配置模板
# 1. 定义后端服务器集群(upstream 块,名称自定义,如 backend_tomcat)
upstream backend_tomcat {
server 192.168.1.100:8080; # 后端服务器1
server 192.168.1.101:8080; # 后端服务器2
# 可选:标记某台服务器为备用(只有主服务器都挂了才启用)
# server 192.168.1.102:8080 backup;
}
# 2. 虚拟主机配置(转发请求到集群)
server {
listen 80;
server_name loadbalancer.example.com;
location / {
proxy_pass http://backend_tomcat; # 指向 upstream 定义的集群名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
实战例子:按权重分配请求(性能不均场景)
场景:后端 3 台服务器性能不同——服务器1(4核8G)、服务器2(2核4G)、服务器3(2核4G),希望服务器1承担更多请求(权重 2),其他两台各承担 1。
配置代码:
upstream backend_tomcat {
server 192.168.1.100:8080 weight=2; # 权重 2(接收 2/4 的请求)
server 192.168.1.101:8080 weight=1; # 权重 1(接收 1/4 的请求)
server 192.168.1.102:8080 weight=1; # 权重 1(接收 1/4 的请求)
}
server {
listen 80;
server_name loadbalancer.example.com;
location / {
proxy_pass http://backend_tomcat;
proxy_set_header Host $host;
}
}
2.2 常用负载均衡策略对比
Nginx 支持 4 种核心策略,根据业务选择:
| 策略 | 配置方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 轮询(默认) | upstream { server A; server B; } | 后端服务器性能一致 | 配置简单,分发均匀 | 无法会话保持(同一用户请求可能到不同服务器) |
| 权重 | server A weight=2; server B weight=1; | 后端服务器性能不均 | 按性能分配,充分利用资源 | 仍无法会话保持 |
| ip_hash | upstream { ip_hash; server A; server B; } | 需要会话保持(如登录状态) | 同一 IP 固定到一台服务器,保持会话 | 后端服务器性能不均时,负载可能失衡 |
| least_conn | upstream { least_conn; server A; server B; } | 后端连接数差异大 | 优先分发到连接数最少的服务器 | 不适合短连接场景(如静态资源) |
实战例子:ip_hash 保持登录状态
场景:用户登录后,会话信息存在后端服务器本地(如 Tomcat session),需确保同一用户的请求始终到同一台服务器。
配置代码:
upstream backend_tomcat {
ip_hash; # 启用 ip_hash 策略(必须放在 server 前面)
server 192.168.1.100:8080;
server 192.168.1.101:8080;
# 注意:ip_hash 不支持 backup 备用服务器
}
server {
listen 80;
server_name login.example.com;
location / {
proxy_pass http://backend_tomcat;
proxy_set_header Host $host;
}
}
2.3 健康检查(自动剔除故障服务器)
场景:后端某台服务器宕机(如 Tomcat 崩溃),Nginx 需自动停止向其分发请求,避免用户看到 502 错误。
配置模板(Nginx 1.16+ 支持)
upstream backend_tomcat {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
# 健康检查配置
health_check interval=5s fall=3 rise=2; # 每5秒检查,3次失败标记宕机,2次成功恢复
# 检查后端服务的 /health 接口(需后端实现健康检查接口)
match health_check_match {
status 200; # 响应状态码为 200 表示健康
body ~ "ok"; # 响应体包含 "ok" 表示健康
}
}
server {
listen 80;
server_name loadbalancer.example.com;
location / {
proxy_pass http://backend_tomcat;
proxy_set_header Host $host;
}
# 可选:暴露 Nginx 健康检查状态页面(查看后端服务器状态)
location /nginx_status {
stub_status on;
allow 192.168.1.0/24; # 只允许内网访问
deny all; # 禁止外网访问
}
}
说明
- 后端需实现
/health接口,返回200 OK和body: ok(如 Spring Boot 可通过 Actuator 快速实现); - 访问
http://loadbalancer.example.com/nginx_status可查看后端服务器健康状态(仅内网可见)。
三、HTTPS 配置:让网站“更安全”
HTTPS 是当前网站的标配,Nginx 可通过 SSL 证书实现 HTTPS 加密,保护数据传输安全(避免被窃听或篡改)。
3.1 准备工作:获取 SSL 证书
首先需要获取 SSL 证书,推荐两种方式:
- 免费证书:Let’s Encrypt(有效期 90 天,可自动续期);
- 付费证书:阿里云、腾讯云等服务商购买(有效期 1-2 年,适合企业网站)。
证书文件说明(以 Let’s Encrypt 为例):
fullchain.pem:证书链文件(包含服务器证书和根证书);privkey.pem:服务器私钥文件(需妥善保管,不可泄露)。
将证书文件放在 Nginx 配置目录下,如 /etc/nginx/ssl/。
3.2 基础 HTTPS 配置(强制 HTTP 跳转 HTTPS)
场景:将 http://example.com 所有请求强制跳转到 https://example.com,并启用 HTTPS 加密。
配置模板
# 1. HTTP 服务器:强制跳转到 HTTPS
server {
listen 80;
server_name example.com www.example.com; # 你的域名
# 永久重定向到 HTTPS(301 表示永久跳转,搜索引擎会更新索引)
return 301 https://$host$request_uri;
}
# 2. HTTPS 服务器:启用 SSL 加密
server {
listen 443 ssl; # 监听 443 端口(HTTPS 默认端口)
server_name example.com www.example.com;
# SSL 证书配置
ssl_certificate /etc/nginx/ssl/fullchain.pem; # 证书链路径
ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 私钥路径
# 可选:优化 SSL 性能和安全性
ssl_protocols TLSv1.2 TLSv1.3; # 启用安全的 TLS 协议(禁用旧协议如 TLSv1.0)
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; # 安全的加密套件
ssl_prefer_server_ciphers on; # 优先使用服务器端的加密套件
ssl_session_cache shared:SSL:10m; # 启用 SSL 会话缓存(减少握手开销)
ssl_session_timeout 10m; # 会话缓存超时时间
# 处理请求(如反向代理或静态资源)
location / {
root /usr/share/nginx/html; # 静态资源目录(或 proxy_pass 转发到后端)
index index.html;
}
}
实战例子:HTTPS 反向代理到 Node.js 服务
场景:https://api.example.com 的请求,转发到后端 Node.js 服务(http://192.168.1.101:3000),同时强制 HTTP 跳转 HTTPS。
配置代码:
# HTTP 跳转 HTTPS
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl;
server_name api.example.com;
# SSL 证书
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# SSL 优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
# 反向代理到 Node.js
location / {
proxy_pass http://192.168.1.101:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme; # 告诉后端当前是 HTTPS(重要!)
}
}
关键参数说明
| 参数 | 作用 | 注意事项 |
|---|---|---|
ssl_protocols | 启用的 TLS 协议版本 | 禁用 TLSv1.0 和 TLSv1.1(不安全,浏览器可能不支持) |
X-Forwarded-Proto $scheme | 告诉后端当前请求是 HTTP 还是 HTTPS | 后端服务(如 Node.js)通过 request.headers['X-Forwarded-Proto'] 判断协议,避免跳转错误 |
ssl_session_cache | 缓存 SSL 会话信息 | 减少重复握手的时间(HTTPS 握手耗时比 HTTP 长,缓存可提升性能) |
3.3 Let’s Encrypt 免费证书自动续期(避免过期)
Let’s Encrypt 证书有效期只有 90 天,手动续期麻烦,可通过 certbot 工具自动续期。
自动续期配置步骤
-
安装 certbot(以 CentOS 为例):
yum install -y certbot python3-certbot-nginx -
获取证书并自动配置 Nginx:
certbot --nginx -d example.com -d www.example.com按提示输入邮箱,同意协议,即可自动获取证书并修改 Nginx 配置。
-
设置定时任务自动续期:
# 编辑定时任务 crontab -e # 添加以下内容(每天凌晨 2 点检查,需要续期则自动续期) 0 2 * * * certbot renew --quiet --renew-hook "systemctl reload nginx"--quiet:安静模式,无输出;--renew-hook:续期成功后重载 Nginx(使新证书生效)。
四、配置验证与重载:避免“配置错误导致服务中断”
无论修改哪种配置,都必须先检查语法,再重载配置,避免直接重启导致服务中断。
4.1 检查配置语法
nginx -t
- 成功输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful - 失败输出:会提示具体错误行(如“line 15: invalid parameter “proxy_pass””),根据提示修改即可。
4.2 重载配置(不中断服务)
nginx -s reload
- 重载时 Nginx 会启动新的工作进程处理新请求,旧进程处理完现有请求后退出,实现“无缝切换”。
五、常见问题排查(初学者必看)
5.1 反向代理后后端获取不到真实 IP?
- 原因:未配置
proxy_set_header X-Real-IP或X-Forwarded-For; - 解决:在 location 块中添加:
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 后端验证(以 Node.js 为例):
console.log("客户端真实IP:", req.headers['x-real-ip']);
5.2 负载均衡时某台服务器宕机,用户仍看到 502?
- 原因:未启用健康检查,Nginx 不知道服务器宕机;
- 解决:按 2.3 节配置健康检查,自动剔除故障服务器。
5.3 HTTPS 配置后浏览器提示“证书不安全”?
- 原因1:证书链不完整(如只配置了服务器证书,未配置根证书);
- 解决1:使用
fullchain.pem而非cert.pem作为ssl_certificate; - 原因2:证书域名与访问域名不匹配(如证书是
example.com,访问api.example.com); - 解决2:重新申请包含该域名的证书(或使用通配符证书如
*.example.com)。
总结:配置速查思维导图
graph LR
A[Nginx 常用配置] --> B[反向代理]
A --> C[负载均衡]
A --> D[HTTPS]
B --> B1[基础转发:proxy_pass 后端地址]
B --> B2[请求头转发:X-Real-IP/Host]
B --> B3[超时配置:connect/read/send timeout]
C --> C1[轮询:默认策略]
C --> C2[权重:weight=2]
C --> C3[ip_hash:会话保持]
C --> C4[健康检查:health_check]
D --> D1[证书配置:ssl_certificate/key]
D --> D2[HTTP 跳转:return 301]
D --> D3[自动续期:certbot + 定时任务]
掌握以上配置,即可应对 90% 的 Nginx 应用场景。初学者建议先从“基础反向代理”和“HTTPS 配置”入手,熟悉后再尝试负载均衡和健康检查。配置时多使用 nginx -t 检查语法,避免因小错误导致服务中断。
更多推荐



所有评论(0)