想要在阿里云ECS服务器上配置Nginx的反向代理,简单来说就是让Nginx接收客户端请求后,把请求转发到服务器内部的其他服务(比如后端的Node.js、Python、Java服务,或另一台内网服务),再将响应返回给客户端。我会用具体的场景示例(如代理本地Node服务、代理远程API)带你完成配置,兼顾基础用法和阿里云环境的注意事项。
一、反向代理核心原理与前置准备
1. 核心概念
反向代理的核心是Nginx的proxy_pass指令------它指定了Nginx要把请求转发到的目标地址(可以是本地端口、内网IP、外网域名)。
2. 前置准备
- 已在ECS安装Nginx(
yum install nginx -y/apt install nginx -y); - 确认被代理的后端服务已启动(比如本地
127.0.0.1:3000的Node服务、192.168.1.100:8080的Java服务); - ECS安全组放行Nginx监听的端口(如80/443),无需放行后端服务端口(反向代理的核心优势:后端服务不暴露到公网)。
二、常见场景的反向代理配置
以下是3个最常用的反向代理场景,你可根据实际需求选择:
场景1:代理本地后端服务(如Node.js/Python服务)
需求 :用户访问http://你的ECS公网IP(或域名),Nginx将请求转发到本地127.0.0.1:3000的Node.js服务。
步骤1:创建Nginx反向代理配置文件
bash
vim /etc/nginx/conf.d/proxy-local.conf
写入配置(注释标注核心参数):
nginx
server {
listen 80; # Nginx监听80端口(对外提供访问)
server_name your-domain.com; # 替换为你的域名(无域名则填ECS公网IP)
# 所有请求都转发到本地3000端口的服务
location / {
# 核心:反向代理目标地址(本地Node服务)
proxy_pass http://127.0.0.1:3000;
# 关键:传递客户端真实IP、Host等信息(后端服务需获取真实请求信息时必须配)
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;
# 可选:超时配置(避免后端服务响应慢导致Nginx超时)
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
场景2:代理特定路径到后端服务(URL路径映射)
需求 :访问http://你的域名/api时转发到后端API服务(192.168.1.100:8080),其他路径仍访问Nginx本地静态文件。
bash
vim /etc/nginx/conf.d/proxy-path.conf
写入配置:
nginx
server {
listen 80;
server_name your-domain.com;
root /var/www/html; # 本地静态文件目录
index index.html;
# 仅/api路径转发到后端服务
location /api/ {
proxy_pass http://192.168.1.100:8080/; # 末尾的/要注意:会去掉/api前缀转发
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 其他路径访问本地静态文件
location / {
try_files $uri $uri/ =404;
}
}
注意:
proxy_pass末尾的/决定是否保留路径前缀:
- 若
proxy_pass http://192.168.1.100:8080/(带/):/api/user会转发为http://192.168.1.100:8080/user;- 若
proxy_pass http://192.168.1.100:8080(不带/):/api/user会转发为http://192.168.1.100:8080/api/user。
场景3:HTTPS反向代理(生产环境推荐)
需求 :通过https://你的域名访问,Nginx先解密HTTPS,再转发到后端HTTP服务(如127.0.0.1:8080)。
步骤1:上传阿里云SSL证书到ECS
将阿里云申请的SSL证书(.pem和.key文件)上传到/etc/nginx/cert/目录(无则创建:mkdir -p /etc/nginx/cert)。
步骤2:配置HTTPS反向代理
bash
vim /etc/nginx/conf.d/proxy-https.conf
写入配置:
nginx
server {
listen 443 ssl;
server_name your-domain.com;
# 阿里云SSL证书配置
ssl_certificate /etc/nginx/cert/your-domain.pem; # 替换为你的证书文件
ssl_certificate_key /etc/nginx/cert/your-domain.key; # 替换为你的私钥文件
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5;
ssl_session_timeout 10m;
# 反向代理到后端HTTP服务
location / {
proxy_pass http://127.0.0.1:8080;
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; # 告诉后端服务请求是HTTPS
}
}
# 强制HTTP跳转到HTTPS
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
三、验证并重启Nginx
-
检查配置语法(关键!避免配置错误导致Nginx无法启动):
bashnginx -t输出
nginx: configuration file /etc/nginx/nginx.conf test is successful表示配置无误。 -
重启Nginx使配置生效:
bashsystemctl restart nginx
四、测试反向代理
- 场景1测试:访问
http://你的ECS公网IP,应看到本地3000端口Node服务的响应; - 场景2测试:访问
http://你的域名/api/user,会转发到192.168.1.100:8080/user;访问http://你的域名,会显示/var/www/html下的静态文件; - 场景3测试:访问
http://你的域名会自动跳转到https://你的域名,并转发到8080端口服务。
五、阿里云环境特殊注意事项
-
安全组配置:仅需放行Nginx监听的端口(80/443),后端服务端口(如3000/8080)无需放行(反向代理会在服务器内部转发);
-
后端服务绑定地址 :若后端服务绑定
127.0.0.1,仅能被本地Nginx代理;若需内网其他机器访问,可绑定0.0.0.0; -
日志排查 :若代理失败,查看Nginx错误日志:
bashtail -f /var/log/nginx/error.log
总结
- Nginx反向代理的核心是
proxy_pass指令,指定请求转发的目标地址; - 必须配置
proxy_set_header系列指令,确保后端服务能获取客户端真实IP、Host等信息; - 阿里云环境中,仅需放行Nginx对外的端口(80/443),后端服务端口无需暴露,提升安全性。