Nginx 作为代理服务器时,主要用于反向代理(最常用,转发客户端请求到后端服务)或正向代理(较少用,为客户端提供访问外部网络的代理)。以下是两种场景的具体配置示例:
一、反向代理配置(最常用)
反向代理是 Nginx 最核心的功能之一,用于将客户端请求转发到后端的应用服务器(如 Java、Node.js、Python 服务等),可隐藏后端服务地址、实现负载均衡、SSL 终结等。
基础配置示例(代理单个后端服务)
# 全局配置
worker_processes auto; # 自动设置工作进程数(通常等于CPU核心数)
events {worker_connections 1024; # 每个工作进程的最大连接数
}http {include mime.types; # 引入MIME类型映射default_type application/octet-stream;# 反向代理核心配置server {listen 80; # 监听80端口(HTTP)server_name example.com; # 代理服务器域名(客户端访问的域名)# 所有请求都转发到后端服务location / {# 后端服务地址(协议://IP:端口,如Node.js服务、Java服务等)proxy_pass http://127.0.0.1:3000; # 传递客户端真实IP和请求头(重要)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_connect_timeout 60s; # 连接后端超时proxy_read_timeout 60s; # 读取后端响应超时proxy_send_timeout 60s; # 发送请求到后端超时}}
}
配置说明:
-
proxy_pass
:指定后端服务地址(必须),格式为协议://IP:端口
或协议://域名
。- 示例:
proxy_pass http://127.0.0.1:3000
表示转发到本地3000端口的服务。 - 注意:
proxy_pass
后是否带/
影响路径拼接(见下方“路径匹配规则”)。
- 示例:
-
proxy_set_header
:传递客户端请求头到后端,避免后端服务获取不到真实客户端信息(如 IP、Host)。Host $host
:传递客户端访问的域名(如example.com
)。X-Real-IP $remote_addr
:传递客户端真实 IP。
-
超时设置:防止后端服务无响应时 Nginx 长期等待,避免连接泄露。
路径匹配规则(proxy_pass
带 /
vs 不带 /
)
-
场景1:
location /api
+proxy_pass http://backend
(不带/
)
客户端请求http://example.com/api/user
→ 转发到http://backend/api/user
(保留/api
前缀)。 -
场景2:
location /api
+proxy_pass http://backend/
(带/
)
客户端请求http://example.com/api/user
→ 转发到http://backend/user
(去掉/api
前缀)。
高级:代理多个服务(按路径区分)
server {listen 80;server_name example.com;# 1. 代理API服务(路径以/api开头)location /api {proxy_pass http://127.0.0.1:8080; # 后端API服务(如Java SpringBoot)proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}# 2. 代理前端静态资源(路径以/static开头)location /static {proxy_pass http://127.0.0.1:8000; # 前端服务(如Node.js静态服务器)proxy_set_header Host $host;}# 3. 其他请求默认返回404location / {return 404;}
}
二、正向代理配置(客户端代理)
正向代理用于为客户端提供访问外部网络的代理(如科学上网、客户端IP隐藏),配置较少见。
http {# 正向代理核心配置server {listen 8888; # 客户端需连接的代理端口# 允许客户端通过代理访问任意域名resolver 8.8.8.8; # DNS resolver(使用谷歌DNS解析外部域名)location / {# 正向代理到客户端请求的目标地址proxy_pass http://$http_host$request_uri;# 支持HTTPS代理(需配置SSL隧道)proxy_connect_timeout 10s;proxy_send_timeout 10s;proxy_read_timeout 10s;}}
}
使用方式:
客户端(如浏览器、curl)需手动设置代理为 http://代理服务器IP:8888
,即可通过该代理访问外部网络。
三、配置SSL(HTTPS代理)
若需要代理 HTTPS 请求(客户端通过 https://example.com
访问),需配置 SSL 证书:
server {listen 443 ssl; # 监听443端口(HTTPS)server_name example.com;# SSL证书配置(替换为实际证书路径)ssl_certificate /path/to/cert.pem; # 公钥证书ssl_certificate_key /path/to/key.pem; # 私钥# 代理到后端HTTP服务(Nginx终结SSL,后端用HTTP通信)location / {proxy_pass http://127.0.0.1:3000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}# 可选:HTTP自动跳转到HTTPS
server {listen 80;server_name example.com;return 301 https://$host$request_uri;
}
四、配置检查与生效
-
检查配置是否正确:
nginx -t # 输出 "syntax is ok" 表示配置无误
-
重启Nginx生效:
nginx -s reload # 平滑重启(不中断现有连接)
核心总结
- 反向代理:用于服务器端转发请求到后端服务,配置核心是
location
+proxy_pass
+ 头信息传递。 - 正向代理:用于客户端代理,需配置
resolver
和代理端口。 - 注意路径匹配规则和超时设置,生产环境建议配置 SSL 证书。
根据实际需求修改 server_name
、proxy_pass
地址、端口和路径即可。