Nginx反向代理与负载均衡配置实战:从入门到生产部署

时间:2026-06-18 12:15:38   阅读:63

一、反向代理到底解决什么问题

Nginx最经典的使用场景就是反向代理。所谓反向代理,简单说就是用户访问的不是真正的后端服务器,而是Nginx这个"中转站"。Nginx接收请求后,根据自己的规则把请求转发给后端服务器,再把结果返回给用户。这样做的好处很直接:后端服务器不用暴露在外网,安全性大幅提升;同时Nginx可以在转发过程中做缓存、限流、HTTPS卸载等一系列处理,减轻后端服务的压力。

二、最简单的反向代理配置

假设你的后端应用跑在本地3000端口,想让用户通过80端口访问,配置只需要几行:

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
        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那几行。如果不传Host头的话,后端服务器拿到的Host可能是127.0.0.1:3000,这会导致一些依赖域名做判断的应用出问题。X-Real-IP和X-Forwarded-For则是用来传递用户的真实IP,否则后端看到的IP全是Nginx服务器的地址,日志和限流都会不准。

三、负载均衡:多台服务器分摊压力

当一台后端服务器扛不住流量了,就需要把请求分散到多台服务器上。Nginx的upstream模块专门做这件事:

upstream backend {
    server 192.168.1.10:3000 weight=3;
    server 192.168.1.11:3000 weight=2;
    server 192.168.1.12:3000 backup;
}

weight参数控制权重,数值越大分配的请求越多。标记为backup的服务器平时不参与负载,只有当其他服务器都挂了之后才接管,相当于冷备。Nginx支持的负载均衡算法包括轮询(默认)、最少连接数、IP哈希等。IP哈希可以保证同一个用户的请求始终落在一台服务器上,适合需要会话保持的场景。

四、缓存配置,让响应飞起来

Nginx的proxy_cache可以实现反向代理级别的缓存。对于那些不频繁变动的接口或静态数据,开启缓存后,相同请求直接从Nginx内存返回,不再打到后端:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m;
server {
    location / {
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_pass http://backend;
    }
}

keys_zone=mycache:10m表示分配10MB共享内存来存储缓存索引,大约能管理8万个缓存键。max_size=1g限制缓存文件总大小,超过后Nginx会自动淘汰最久未使用的缓存。inactive=60m表示60分钟内没有被访问的缓存会被清理。

五、HTTPS卸载与SSL配置

另一个常见用法是在Nginx上统一处理SSL证书,后端服务跑HTTP就够了,省去每台服务器配置证书的麻烦:

server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/example.com.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    location / {
        proxy_pass http://backend;
    }
}

启用http2可以进一步优化性能,特别是在大量并发请求时效果显著。SSL协议只开启TLSv1.2和TLSv1.3,老旧的TLSv1.0和TLSv1.1存在安全漏洞,应该禁用。

六、实战中的常见坑

第一是超时设置。如果后端的某个接口处理时间较长,默认的60秒超时可能会触发504错误,需要调大proxy_read_timeout。第二是WebSocket代理,需要额外配置Upgrade头:proxy_set_header Upgrade $http_upgrade和proxy_set_header Connection "upgrade"。第三是缓冲区大小,大文件下载时要调整proxy_buffer_size和proxy_buffers,否则可能收到502错误。把这些配置吃透,Nginx在生产环境中的表现会稳定得多。

上一篇:Linux服务器性能监控常用工具:htop、iotop、netstat等使用指南

下一篇:MySQL性能优化从入门到实战:慢查询分析与索引优化指南