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. 其他请求默认返回404
location / {
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
地址、端口和路径即可。