Nginx 反向代理与负载均衡:从配置到生产级部署
Nginx 是大多数 Web 架构的入口。用好反向代理和负载均衡,是运维的基本功。
一、反向代理基础
把请求转发给后端服务:
server {
listen 80;
server_name www.owai.cc;
location /api/ {
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 X-Forwarded-Proto $scheme;
}
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
}
}
关键点:
- `proxy_pass` 末尾有 `/` 时会替换 `location` 的路径前缀
- `X-Real-IP` 让后端拿到真实客户端 IP
- `try_files` 是 SPA 应用的标准配置
二、负载均衡策略
2.1 轮询(默认)
upstream backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
server 10.0.0.3:8080;
}
2.2 加权轮询
upstream backend {
server 10.0.0.1:8080 weight=5;
server 10.0.0.2:8080 weight=3;
server 10.0.0.3:8080 weight=2;
}
2.3 IP Hash(会话保持)
upstream backend {
ip_hash;
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
同一客户端 IP 始终访问同一后端,适合有状态服务。
2.4 最少连接
upstream backend {
least_conn;
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
请求发给当前连接数最少的后端。
三、健康检查
upstream backend {
server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.2:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.3:8080 backup;
}
- `max_fails=3`:连续 3 次失败后标记为不可用
- `fail_timeout=30s`:30 秒后重新尝试
- `backup`:只有其他节点都不可用时才使用
四、HTTPS 配置
server {
listen 443 ssl http2;
server_name www.owai.cc;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# HSTS
add_header Strict-Transport-Security "max-age=31536000" always;
location / {
proxy_pass http://backend;
}
}
# HTTP 跳转 HTTPS
server {
listen 80;
server_name www.owai.cc;
return 301 https://$host$request_uri;
}
五、限流配置
# 定义限流区域
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend;
}
}
- `rate=10r/s`:每秒 10 个请求
- `burst=20`:允许突发 20 个
- `nodelay`:突发请求不排队,直接处理
六、缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
server {
location /static/ {
proxy_cache my_cache;
proxy_cache_valid 200 1h;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating;
proxy_pass http://backend;
}
}
七、常见问题排查
# 测试配置语法
nginx -t
# 查看错误日志
tail -f /var/log/nginx/error.log
# 平滑重载
nginx -s reload
# 查看连接状态
curl http://localhost/nginx_status
Nginx 的配置看起来简单,但每一行都有讲究。生产环境的 Nginx 配置,应该经过压力测试和安全审查后再上线。


钱哆哆♥官方正规流量卡♥1 个月前
生死门虽繁星灿烂,但活着的人才是最重要。
钱哆哆♥官方正规流量卡♥1 个月前
《技术博客图文文章怎么做得不单一:封面、结构图与场景插图的组合方法》已更新:技术博客图文文章怎么做得不单一:封面、结构图与场景插图的组合方法 很多技术博客的正文其实不差,问题常常出在视觉层太单一。首页列表里大家都只有一张封面,点进去以后又是一大段连续文字,读者很难在几秒钟内判断这篇文章到底值不值得继续看。内容本身也许很扎实,但呈现方式没有把价值推出来。…
钱哆哆♥官方正规流量卡♥1 个月前
《技术博客图文文章怎么做得不单一:封面、结构图与场景插图的组合方法》已更新:技术博客图文文章怎么做得不单一:封面、结构图与场景插图的组合方法 很多技术博客的正文其实不差,问题常常出在视觉层太单一。首页列表里大家都只有一张封面,点进去以后又是一大段连续文字,读者很难在几秒钟内判断这篇文章到底值不值得继续看。内容本身也许很扎实,但呈现方式没有把价值推出来。…
钱哆哆♥官方正规流量卡♥1 个月前
《技术博客图文文章怎么做得不单一:封面、结构图与场景插图的组合方法》已更新:技术博客图文文章怎么做得不单一:封面、结构图与场景插图的组合方法 很多技术博客的正文其实不差,问题常常出在视觉层太单一。首页列表里大家都只有一张封面,点进去以后又是一大段连续文字,读者很难在几秒钟内判断这篇文章到底值不值得继续看。内容本身也许很扎实,但呈现方式没有把价值推出来。…
钱哆哆♥官方正规流量卡♥1 个月前
你和学霸的区别就是,你所有的灵光一闪,都是他的基本题型。