Nginx 作为一款高性能的 HTTP 和反向代理服务器,广泛应用于互联网架构中,其代理功能更是核心能力之一,通过合理的 Nginx 代理配置,可以实现负载均衡、动静分离、HTTPS 协议转换、安全防护等多种需求,有效提升服务的稳定性、安全性和可扩展性,本文将详细介绍 Nginx 代理服务器的核心配置项、实践场景及注意事项。
Nginx 代理服务器基础配置
Nginx 的代理功能主要通过 proxy_pass 指令实现,其基本语法为 proxy_pass URL;,URL 可以是协议(http/https)+ 域名/IP + 端口,或 Unix 域套接字路径,将所有请求代理到本地 8080 端口的后端服务,配置如下:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
上述配置中,客户端访问 example.com 的请求会被 Nginx 转发至后端 http://127.0.0.1:8080,但实际场景中,代理往往需要处理更多细节,如请求头、响应头、超时时间等,这些可通过 proxy_set_header、proxy_connect_timeout 等指令精细控制。
核心代理配置详解
请求头处理
默认情况下,Nginx 不会转发原始请求的所有头部信息,需通过 proxy_set_header 添加必要字段,确保后端服务获取完整的客户端信息,常用配置包括:
proxy_set_header Host $host; # 转发原始 Host 头 proxy_set_header X-Real-IP $remote_addr; # 客户端真实 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链路 IP proxy_set_header X-Forwarded-Proto $scheme; # 协议类型(http/https)
X-Forwarded-For 是一个重要字段,记录请求经过的代理节点,格式为 客户端IP, 代理1IP, 代理2IP,$proxy_add_x_forwarded_for 会保留原有值并追加客户端 IP。
超时与缓冲区控制
代理过程中,若后端服务响应过慢或客户端网络不稳定,可能导致连接超时,可通过以下指令优化:
proxy_connect_timeout 60s; # 与后端建立连接的超时时间 proxy_send_timeout 60s; # 向后端发送请求的超时时间 proxy_read_timeout 60s; # 读取后端响应的超时时间 proxy_buffering on; # 开启缓冲区 proxy_buffer_size 4k; # 缓冲区大小 proxy_buffers 8 16k; # 设置缓冲区数量和大小
缓冲区开启后,Nginx 会先接收后端响应并缓存至本地,再逐步发送给客户端,避免因客户端网速慢导致后端服务阻塞。
负载均衡配置
当后端有多个服务实例时,可通过 upstream 模块实现负载均衡,Nginx 内置多种负载均衡算法,如下表所示:
| 算法类型 | 说明 | 配置示例 |
|---|---|---|
| 轮询(默认) | 按请求顺序依次分配到不同后端服务器 | upstream backend { server 192.168.1.1:8080; server 192.168.1.2:8080; } |
| 加权轮询 | 根据服务器权重分配请求,权重越高请求越多 | upstream backend { server 192.168.1.1:8080 weight=3; server 192.168.1.2:8080 weight=1; } |
| IP 哈希 | 根据客户端 IP 哈希值分配请求,确保同一客户端请求固定到同一服务器 | upstream backend { ip_hash; server 192.168.1.1:8080; server 192.168.1.2:8080; } |
| 最少连接 | 优先分配给当前连接数最少的服务器,适用于长连接场景 | upstream backend { least_conn; server 192.168.1.1:8080; server 192.168.1.2:8080; } |
结合 proxy_pass 使用时,只需将 URL 指向 upstream 块名称即可:
location / {
proxy_pass http://backend;
}
HTTPS 反向代理
若后端服务为 HTTP,而前端需要 HTTPS,可通过 Nginx 实现 HTTPS 协议转换,配置步骤如下:
- 安装 SSL 证书(如 Nginx 默认路径
/etc/nginx/ssl/下的example.com.crt和example.com.key)。 - 配置监听 443 端口,并开启 SSL:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://backend; # 后端仍为 HTTP
proxy_set_header X-Forwarded-Proto https; # 标记协议为 HTTPS
}
}
为 HTTP 请求跳转 HTTPS,可添加 301 重定向:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
高级代理场景
动静分离
通过 Nginx 代理将动态请求(如 PHP、Java 应用)转发到后端服务,静态请求(如 HTML、CSS、图片)直接由 Nginx 处理,减少后端服务压力:
location ~* \.(html|css|js|jpg|jpeg|png|gif)$ {
root /data/static; # 静态资源根目录
expires 7d; # 缓存 7 天
}
location / {
proxy_pass http://backend; # 动态请求代理
}
基于路径的代理
根据请求路径转发到不同的后端服务,例如将 /api 请求转发到 API 服务,/web 请求转发到前端服务:
location /api {
proxy_pass http://api_server;
proxy_set_header Host $host;
}
location /web {
proxy_pass http://web_server;
proxy_set_header Host $host;
}
注意事项
- 安全性:避免直接暴露后端服务器 IP,可通过防火墙限制 Nginx 与后端的通信端口;启用
proxy_hide_header隐藏后端敏感响应头(如X-Powered-By)。 - 日志监控:配置
access_log和error_log,记录代理请求的详细信息,便于排查问题;建议结合log_format自定义日志格式,包含$upstream_addr(后端服务器地址)和$upstream_response_time(后端响应时间)。 - 性能优化:调整
worker_processes和worker_connections参数,根据服务器 CPU 核数和并发量优化 Nginx 进程模型;开启gzip压缩减少传输数据量。
相关问答FAQs
Q1:Nginx 代理后,后端服务如何获取客户端真实 IP?
A:需要在 Nginx 配置中添加 proxy_set_header X-Real-IP $remote_addr; 和 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,将客户端 IP 写入请求头,后端服务(如 Java、PHP)需通过读取请求头中的 X-Real-IP 或 X-Forwarded-For 字段获取真实 IP,注意 X-Forwarded-For 可能包含多个 IP,需取第一个非 IP(即客户端真实 IP)。
Q2:如何解决 Nginx 代理后 504 Gateway Timeout 错误?
A:504 错误通常是由于后端服务响应超时或 Nginx 与后端连接超时导致,可通过以下方式解决:
- 调整
proxy_read_timeout(默认 60s)为更大的值,如proxy_read_timeout 120s;; - 检查后端服务性能,优化代码或增加服务器资源;
- 确认后端服务是否正常监听,防火墙是否允许 Nginx 访问后端端口;
- 若后端服务有长时间任务,可考虑启用异步处理或消息队列(如 RabbitMQ)解耦。
