自建Nginx反向代理

如果您想要重定向现有网站到另一个网址,或者隐藏现有网址的端口号,或者实现多服务共用80/443端口等,可通过自建反向代理服务。

Nginx反向代理

Nginx反向代理转发(Reverse Proxy),是网站和服务架构中极常用的技术手段。它最大的特点是:客户端并不直接访问后端应用(如 web 服务、API 服务、Tomcat、Node.js、后端存储等),而是统一访问 Nginx,然后由 Nginx “代理转发”请求到后端,收到响应再转发给客户端。

网络架构

image
  1. 用户访问域名,LocalDNS发起递归查询,最终返回域名配置的Nginx服务器IP。

  2. 用户访问IP,Nginx根据请求头中的Host将请求转发到正确的服务(Web/API/数据库)。

自建代理服务优势

  • 隐藏服务真实IP、端口,避免服务公网暴露。

  • 完全掌控转发规则,不受云解析DNSURL转发额度限制。

  • 支持HTTPS协议,可实现HTTPS->HTTPS转发。

  • 多服务共享80/443端口。

安装Nginx

我们以阿里云ECS服务器Alinux3操作系统为例,介绍Nginx安装步骤。

  1. 参考控制台自定义购买并使用ECS实例,完成服务器创建,绑定公网IP并在安全组放行22/80/443端口等。

  2. 登录服务器,安装Nginx。

    yum install nginx
  3. 启动Nginx并设置开启启动。

    sudo systemctl start nginx
    sudo systemctl enable nginx
  4. 确认服务启动。

    sudo systemctl status nginx

    image

  5. 查看Nginx配置文件,主要关注配置文件:/etc/nginx/nginx.conf

  6. (可选)后续修改配置,需要执行命令重启服务。

    systemctl reload nginx

场景化配置

访问http://cloud-example.net直接重定向到https://aliyun.com

常见于域名升级、品牌归并、网站迁移,旧域名不再使用,新域名上线场景。公网权威解析的URL转发功能虽然也能实现重定向功能,但其本身也是通过反向代理实现,无SLA保障,且无法支持HTTPS协议。自建Nginx代理配置如下:

# 将 http://cloud-example.net 显性转发至 https://aliyun.com
server {
    listen 80;
    server_name cloud-example.net;
    location / {
        return 301 https://aliyun.com$request_uri;  # 301永久跳转
        # return 302 https://aliyun.com$request_uri;  # 302临时跳转
    }
}

如果原域名支持HTTPS协议,需要实现支持HTTPS->HTTPS跳转,则需要配置SSL证书才可进行重定向。公网权威解析的URL转发由于无法配置证书,不支持HTTPS->HTTPS跳转。自建Nginx代理配置如下:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/old.com.crt;
    
    location / {
        return 301 https://aliyun.com$request_uri;  # HTTPS到HTTPS跳转
    }
}

访问http://example.com,网址不变,直接返回http://aliyun.com站点内容

常见于分销、品牌代理,或者多个后端服务,目标网站不适合或者不具备直接向客户暴露的场景。公网权威解析的URL转发功能虽然也能实现重定向功能,但其本身也是通过反向代理实现,无SLA保障,且无法支持HTTPS协议。自建Nginx代理配置如下:

# 将 example.com 隐性转发至 aliyun.com(保留地址栏显示)
server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://aliyun.com;  # 核心指令
        proxy_set_header Host $host;   # 传递原始域名
        proxy_set_header X-Real-IP $remote_addr;
    }
}

域名解析到端口

如果你的域名:example.com,服务IP: 1.1.x.x,服务端口:3000,您想要实现的访问效果:http://example.com -> 1.1.x.x:3000。由于云解析DNSA记录只能支持到IP维度,无法基于端口配置解析记录。自建Nginx代理配置如下:

# 通过域名访问 :3000 端口服务(隐藏端口号)
server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://localhost:3000;  # 转发到本地端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
    }
}

多服务共用80/443端口

例如你有多个Web服务、API服务、静态服务等,希望都通过同一个公网 80 端口对外访问,但一台服务器的同一个端口原则上只允许一个进程监听。借助反向代理,所有外部流量都进入Nginx,由Nginx根据请求的host、URL路径等规则,把请求“代理转发”到不同的本地端口或者内网服务。自建Nginx代理配置如下:

server {
    listen 80;
    server_name api.xxx.com;
    location / {
        proxy_pass http://localhost:8080;
    }
}
server {
    listen 80;
    server_name www.xxx.com;
    location / {
        proxy_pass http://localhost:7001;
    }
}
server {
    listen 80;
    server_name img.xxx.com;
    location / {
        proxy_pass http://localhost:9000;
    }
}

后续步骤

完成了自建Nginx反向代理服务的搭建和配置后,需要根据代理的服务和关联的域名,配置DNS解析。

  1. 准备好域名,如您还没有购买域名,请前往 阿里云域名注册购买。若您域名关联的网站需要部署在中国内地,请提前完成ICP备案

  2. 获取部署Nginx反向代理所在服务器的公网IP地址,本案例中直接获取ECS实例的公网IP地址。

    image

  3. 访问云解析DNS-公网权威解析,找到要配置解析的目标域名。

  4. 添加解析记录,将域名指向Nginx服务对应的IP地址。详细表单说明请参考添加解析记录

    image