阿里云ECS上配置Nginx的反向代理

想要在阿里云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

  1. 检查配置语法(关键!避免配置错误导致Nginx无法启动):

    bash 复制代码
    nginx -t

    输出nginx: configuration file /etc/nginx/nginx.conf test is successful表示配置无误。

  2. 重启Nginx使配置生效

    bash 复制代码
    systemctl restart nginx

四、测试反向代理

  1. 场景1测试:访问http://你的ECS公网IP,应看到本地3000端口Node服务的响应;
  2. 场景2测试:访问http://你的域名/api/user,会转发到192.168.1.100:8080/user;访问http://你的域名,会显示/var/www/html下的静态文件;
  3. 场景3测试:访问http://你的域名会自动跳转到https://你的域名,并转发到8080端口服务。

五、阿里云环境特殊注意事项

  1. 安全组配置:仅需放行Nginx监听的端口(80/443),后端服务端口(如3000/8080)无需放行(反向代理会在服务器内部转发);

  2. 后端服务绑定地址 :若后端服务绑定127.0.0.1,仅能被本地Nginx代理;若需内网其他机器访问,可绑定0.0.0.0

  3. 日志排查 :若代理失败,查看Nginx错误日志:

    bash 复制代码
    tail -f /var/log/nginx/error.log

总结

  1. Nginx反向代理的核心是proxy_pass指令,指定请求转发的目标地址;
  2. 必须配置proxy_set_header系列指令,确保后端服务能获取客户端真实IP、Host等信息;
  3. 阿里云环境中,仅需放行Nginx对外的端口(80/443),后端服务端口无需暴露,提升安全性。
相关推荐
有谁看见我的剑了?11 小时前
VMware OVF Tool 工具安装学习
云计算
无我198716 小时前
专业的厌氧池清淤哪家酷
阿里云
GDAL20 小时前
NJS 共享字典(ngx.shared)全解析:跨 Worker 进程的数据共享方案
nginx·shared·njs
xifangge202520 小时前
PHP 错误日志在哪里看?Apache / Nginx / PHP-FPM 一次讲清
nginx·php·apache
鸠摩智首席音效师20 小时前
如何安装和配置 Nginx 反向代理服务器 ?
运维·nginx
酒书1 天前
对接阿里云号码认证实现运营商一键登录
java·阿里云
盛夏5201 天前
Docker容器化部署SpringBoot+Vue项目:从零到一在阿里云宝塔面板的实践指南
阿里云·docker·云计算
星光不问赶路人1 天前
Nginx 的 location 路径匹配语法详解
nginx·api
GDAL1 天前
深入理解 NJS 全局对象:掌控运行时的核心工具
nginx·njs