Nginx是目前最流行的高性能Web服务器和反向代理服务器。在搬瓦工VPS上配置Nginx反向代理,可以将外部请求转发到后端应用服务(如Node.js、Python、Java等),同时提供负载均衡、缓存和SSL终端等功能。本文详细介绍反向代理的完整配置流程。
在搬瓦工VPS上安装Nginx,根据系统版本选择对应命令:
Debian/Ubuntu 系统:
sudo apt update
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx
CentOS/AlmaLinux 系统:
sudo yum install epel-release -y
sudo yum install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx
安装完成后,访问VPS的IP地址,能看到Nginx默认欢迎页面即表示安装成功。
反向代理的核心指令是 proxy_pass,它将匹配的请求转发到指定的后端服务地址。创建站点配置文件:
sudo nano /etc/nginx/conf.d/myapp.conf
写入以下内容:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
这段配置将所有发往 example.com 的请求代理到本地 3000 端口的后端应用。proxy_set_header 指令确保后端能获取到客户端的真实IP和协议信息。
# 检查配置语法
sudo nginx -t
# 重新加载配置
sudo nginx -s reload
配置反向代理时,正确传递请求头非常重要。以下是常用的请求头设置:
location / {
proxy_pass http://127.0.0.1:3000;
# 传递原始Host头
proxy_set_header Host $host;
# 传递客户端真实IP
proxy_set_header X-Real-IP $remote_addr;
# 传递代理链路中的所有IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 传递原始请求协议(http或https)
proxy_set_header X-Forwarded-Proto $scheme;
# 连接超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲区设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
如果后端应用需要获取客户端真实IP(例如日志记录或访问控制),必须正确配置 X-Real-IP 和 X-Forwarded-For 头。
当后端运行多个应用实例时,可以使用 upstream 模块实现负载均衡:
upstream backend {
# 默认轮询策略
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
}
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;
}
}
Nginx支持多种负载均衡策略:
# 加权轮询
upstream backend_weighted {
server 127.0.0.1:3001 weight=3;
server 127.0.0.1:3002 weight=2;
server 127.0.0.1:3003 weight=1;
}
# IP Hash
upstream backend_iphash {
ip_hash;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
# 最少连接
upstream backend_least {
least_conn;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
WebSocket连接需要特殊的代理配置,因为它使用HTTP Upgrade机制建立持久连接:
server {
listen 80;
server_name ws.example.com;
location /ws {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# WebSocket连接超时(默认60秒会断开)
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}
关键配置是 proxy_http_version 1.1 和 Upgrade、Connection 头的设置。同时将 proxy_read_timeout 设置为较大值,避免空闲WebSocket连接被提前关闭。
将不同URL路径代理到不同的后端服务:
server {
listen 80;
server_name example.com;
# API请求代理到后端API服务
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态文件直接由Nginx处理
location /static/ {
alias /var/www/static/;
expires 30d;
}
# 其他请求代理到前端应用
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
注意 proxy_pass 末尾的斜杠会影响路径转发。proxy_pass http://127.0.0.1:8080/ 末尾有斜杠时,/api/users 会被转发为 /users;没有斜杠时会保留完整路径 /api/users。
配置后端健康检查,自动排除故障节点:
upstream backend {
server 127.0.0.1:3001 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3002 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3003 backup; # 备用节点
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout http_500 http_502 http_503;
proxy_next_upstream_tries 2;
}
}
max_fails=3 fail_timeout=30s 表示如果30秒内失败3次,则暂时将该节点标记为不可用。proxy_next_upstream 配置了哪些错误会触发请求转发到下一个后端。
proxy_read_timeout 值proxy_set_header Host $hostX-Real-IP 和 X-Forwarded-For 头# 查看Nginx错误日志排查问题
sudo tail -f /var/log/nginx/error.log
Tip: 更多教程请查看新手教程。