配置Nginx反向代理是Nginx最核心、最常用的功能之一。通过反向代理,Nginx可以接收用户的请求,然后将请求转发给后端的应用服务器(如 Tomcat、Node.js、Python 应用等),再将应用服务器的响应返回给用户。
下面是配置Nginx反向代理的详细步骤和关键配置项:
一、基本原理与目标
目标: 让用户通过访问Nginx服务器(通常是 80/443端口)来间接访问运行在后端服务器(如 http://127.0.0.1:8080
)上的应用。
配置文件位置:
Nginx的配置通常在以下文件或目录中:
/etc/nginx/nginx.conf
(主配置文件)/etc/nginx/conf.d/*.conf
(自定义配置文件目录)/etc/nginx/sites-enabled/*
(网站配置文件目录,常用于Ubuntu/Debian)
二、核心配置步骤
您需要在Nginx的配置文件中找到或创建一个 server
块,并在其中添加 location
块来定义代理规则。
1. 创建或编辑配置文件
假设您要为域名 example.com 配置反向代理,可以创建一个新的配置文件:
sudo nano /etc/nginx/conf.d/example.com.conf
2. 配置 HTTP 80 端口(可选但推荐)
配置 Nginx 监听标准的 80端口,并为您的域名设置好 server_name
。
Nginx
server {
listen 80;
server_name example.com www.example.com;
# 这里可以添加重定向,将所有HTTP请求转到HTTPS(如果已配置443端口)
# return 301 https://$host$request_uri;
# 核心代理配置放在location块中
location / {
# 见步骤 3
}
}
3. 配置反向代理的核心指令
在您选择的 server
块(可以是 80 端口或 443 端口)中,使用 location
块来定义哪些请求需要被转发,并使用 proxy_pass
指令指定后端应用服务器的地址。
Nginx
location / {
# 核心指令:将所有请求(/)转发到后端的8080端口
# 这里的地址可以是本地端口,也可以是另一台服务器的IP地址和端口
proxy_pass http://127.0.0.1:8080;
# --- 以下是反向代理推荐的安全和头信息配置 ---
# 允许Nginx将客户端的真实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_send_timeout 60s;
proxy_read_timeout 60s;
}
4. 检查配置并重启 Nginx
配置完成后,请执行以下两个命令:
- 检查配置语法:sudo nginx -t如果看到 syntax is ok 和 test is successful,则表示没有语法错误。
- 重启Nginx使配置生效:sudo systemctl restart nginx
三、关键配置项详解
配置项 | 说明 | 用途 |
proxy_pass | 指定后端服务器的 协议、地址和端口。 | 核心指令。所有匹配 location 规则的请求都会被转发到此地址。 |
location / | 匹配所有进入的请求。 | 定义请求转发的范围。如果您想代理 /api/ 下的请求,则写为 location /api/ { ... } |
proxy_set_header Host $host; | 将原始的 Host 头(即用户的域名)传递给后端。 | 非常重要。许多应用依赖这个头信息来正确处理请求和生成链接。 |
proxy_set_header X-Real-IP $remote_addr; | 将用户的 真实 IP 地址 传递给后端。 | 方便后端应用进行日志记录和IP限制。 |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 记录整个请求链中所有代理服务器的 IP 地址。 | 重要。通常与上一个指令一起使用。 |
四、进阶:HTTPS(SSL)反向代理
如果您已经像前面那样配置了SSL证书,您需要在 server
块中加入 SSL 配置,并监听 443端口。
Nginx
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL 证书和私钥路径
ssl_certificate /path/to/your_domain.crt;
ssl_certificate_key /path/to/your_domain.key;
location / {
# 仍然使用 proxy_pass 将请求转发到后端应用的 http 端口
proxy_pass http://127.0.0.1:8080;
# ... 其他 proxy_set_header 配置保持不变 ...
}
}
在这种配置下:
- 用户通过HTTPS安全地连接到 Nginx (443端口)。
- Nginx 解密 请求。
- Nginx 通过 HTTP(非加密) 将请求转发给后端应用(8080端口)。
- 后端应用处理完毕后,响应返回给 Nginx。
- Nginx 加密 响应,返回给用户。
这样就实现了用户访问的加密,但后端应用无需处理证书,简化了后端的配置。