🧘 祺祺·技术笔记

← 返回首页

Nginx 反向代理配置与性能调优记录

Nginx 是目前最流行的反向代理和 Web 服务器之一。在最近的项目中,使用 Nginx 作为多个后端服务的统一入口,涉及负载均衡、SSL 终止、HTTPS 跳转、限流等配置。本文记录相关的配置要点和调优经验。

一、基本反向代理配置

最基础的反向代理配置,将请求转发到后端服务:

upstream backend {
    server 127.0.0.1:8080 weight=3;
    server 127.0.0.1:8081 weight=2;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        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;
    }
}

proxy_set_header 这几行很重要。后端应用通常需要获取客户端的真实 IP 和协议信息,如果不传递这些头信息,后端看到的请求来源全是 Nginx 的内网地址。

二、HTTPS 配置与强制跳转

使用 Let's Encrypt 或云厂商提供的免费 SSL 证书,为网站开启 HTTPS 访问:

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/example.com.pem;
    ssl_certificate_key /etc/ssl/private/example.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://backend;
    }
}

配置要点:

三、请求限流配置

为了防止恶意请求或突发流量打垮后端,可以使用 Nginx 的 limit_req 模块做请求限流:

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=api_limit burst=20 nodelay;
            proxy_pass http://backend;
        }
    }
}

这里 rate=10r/s 表示每 IP 每秒最多 10 个请求,burst=20 允许瞬间超过 20 个请求的突发,nodelay 表示突发请求不延迟处理,超出 burst 的请求直接返回 429。生产环境中 API 接口和静态页面的限流策略可以分开设置。

四、性能调优参数

以下是经过实际压测调整的一些参数:

http {
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 65;
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
}

五、日志配置与排查

合适的日志格式对排查问题很有帮助:

http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" '
                  '$upstream_addr $upstream_status $upstream_response_time';

    access_log /var/log/nginx/access.log main;
}

增加 $upstream_response_time 可以查看后端服务的响应耗时,便于定位性能瓶颈。如果发现大量 499 状态码,通常是因为客户端在 Nginx 转发请求之前断开了连接,可能需要调整 proxy_read_timeout 或排查后端响应是否过慢。

六、踩坑记录

七、总结

Nginx 配置灵活强大,但参数繁多。建议以"最小配置、迭代优化"的思路进行,先让服务跑起来,再根据监控数据逐步调优。另外,每次修改配置后记得执行 nginx -t 检查语法,避免配置错误导致服务中断。