Nginx反向代理这5种配置,负载均衡+HTTPS一站搞定
|
admin
2026年11月10日 21:0
本文热度 45
|
💥 项目要上线了,前端一个域名、后端三个服务实例、还要配HTTPS、WebSocket也得支持——运维同事请假了,这些配置全落到你头上。打开Nginx配置文件,看着一堆指令直接懵了。
💥 Nginx是后端工程师必须掌握的运维技能,反向代理、负载均衡、HTTPS配置、动静分离这些场景几乎每个项目都会遇到。不需要你精通运维,但基本的配置必须会写、能改、敢上线。
💥 今天把生产环境最常用的5种Nginx配置场景整理出来,每种都附带完整可用的配置文件,直接复制改改域名和IP就能用。看完这篇,运维不在你也能搞定。
一、场景1:简单反向代理(最基础)
把域名请求转发到后端服务,这是Nginx最基本的用法。用户访问 api.example.com,Nginx把请求转发到本地的8080端口。
# /etc/nginx/conf.d/api.conf
server{
listen 80;
server_name api.example.com;
location/ {
proxy_pass http://127.0.0.1:8080;
# 传递真实客户端信息给后端
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
💡 三个proxy_set_header必须加
不加这三个头信息,后端拿到的客户端IP全是127.0.0.1,日志记录、限流、地域判断全废了。生产环境这三行是标配,别漏掉。
二、场景2:负载均衡(多实例轮询)
后端部署了多个实例,Nginx负责把请求均匀分发到各个实例上。支持三种策略:轮询(默认)、权重、ip_hash。
# 定义上游服务集群
upstream backend_cluster {
# 权重分配:配置高的服务器多分配请求
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
# 健康检查:连续3次失败标记为不可用,30秒后重试
server 192.168.1.13:8080 max_fails=3 fail_timeout=30s;
}
server{
listen 80;
server_name api.example.com;
location/ {
proxy_pass http://backend_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
⚠️ 三种负载均衡策略对比
✅ 轮询(默认):请求依次分配给每个实例,适合实例配置相同的情况
✅ 权重(weight):配置高的服务器多分请求,适合实例性能不同的场景
✅ ip_hash:同一IP的请求固定打到同一实例,适合需要Session保持的老项目(新项目建议用Redis存Session,不需要ip_hash)
三、场景3:HTTPS配置(SSL证书)
现在所有网站都要求HTTPS,Nginx配置SSL证书非常简单。用Let's Encrypt可以免费申请证书,也可以用公司购买的证书。
# HTTP自动跳转HTTPS
server{
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
# HTTPS主配置
server{
listen 443 ssl http2;
server_name 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;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
🚨 安全提醒
ssl_protocols 只保留TLSv1.2和TLSv1.3,TLSv1.0和1.1已经有已知漏洞,必须禁用。后端代码里获取请求协议要用 X-Forwarded-Proto 头,否则SpringBoot里判断HTTPS会失效。
四、场景4:WebSocket代理
项目里用到了WebSocket做实时推送(比如在线客服、消息通知),Nginx默认不支持WebSocket的协议升级,需要额外配置。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server{
listen 443 ssl;
server_name ws.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location /ws {
proxy_pass http://127.0.0.1:8080;
# WebSocket关键配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 超时时间:WebSocket长连接必须设长一些
proxy_read_timeout 3600s;
}
}
💡 WebSocket配置要点
核心是 Upgrade 和 Connection 这两个头,告诉Nginx做协议升级。proxy_read_timeout 必须设置足够长(比如3600秒),否则空闲连接会被Nginx主动断开,WebSocket就断了。
五、场景5:动静分离
前端静态文件(HTML、CSS、JS、图片)直接由Nginx返回,动态请求才转发到后端。这样能大幅减轻后端压力,提升响应速度。
server {
listen 80;
server_name www.example.com;
# 静态文件:Nginx直接返回
location /static/ {
alias /var/www/static/;
# 开启gzip压缩
gzip on;
gzip_types text/css application/javascript image/png;
# 浏览器缓存7天
expires 7d;
}
# 动态请求:转发到后端
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 前端SPA路由:全部返回index.html
location / {
root /var/www/dist;
try_files $uri $uri/ /index.html;
}
}
💡 动静分离的好处
静态文件Nginx处理性能是后端的10倍以上;开启gzip压缩能减少60%以上的传输量;设置浏览器缓存后,二次访问几乎零请求。前端Vue/React打包后的dist目录直接丢给Nginx,完美。
六、5种配置场景全景对比
一张表看清每种配置的适用场景和复杂度:
🎯 Nginx配置上线前必查清单
1️⃣ 配置完先测语法
每次改完配置文件,先执行 nginx -t 检查语法,确认没问题后再执行 nginx -s reload 热重载。不要直接restart,热重载不会断开现有连接。
2️⃣ 生产环境HTTPS是标配
HTTP跳转HTTPS的301重定向必须配,否则用户手动输入http开头会看到不安全提示。SSL证书用Let's Encrypt免费申请,每90天自动续签。
3️⃣ 日志和监控不能少
配置access_log和error_log路径,方便排查问题。生产环境建议加上 log_format 自定义日志格式,记录响应时间、上游服务器地址等关键信息。
阅读原文:原文链接
该文章在 2026/11/11 11:15:58 编辑过