
在 AWS 上部署代理服务器的大多数企业实际需要的是反向代理,而不是用于翻墙或隐藏客户端的正向代理。
两者虽然都叫代理服务器,但代理的对象和解决的问题完全不同。把这个区别搞清楚,才能判断自己需要什么架构、应该用哪种实现方案。
企业适合正向代理和反向代理
正向代理代理的是客户端——客户端把请求发给代理,由代理去访问目标服务器,目标服务器看到的是代理的 IP 而不是客户端真实 IP。
常见的企业用途是统一管控员工的上网出口,或者隐藏内部客户端身份。
反向代理代理的是服务端——客户端访问代理服务器,由代理决定把请求转发给哪个后端服务器,后端服务器对客户端不可见。
客户端以为自己在直接访问目标服务器,但实际上所有请求都经过了代理层的处理和分发。
在 AWS 上,企业部署的几乎都是反向代理。典型场景包括:
- 多个 EC2 实例运行同一个 Web 应用,通过 Nginx 统一入口分发流量,实现负载均衡
- HTTPS 证书只配置在代理层,后端实例走 HTTP 内网通信,减少证书管理成本
- API 网关前置一层代理,统一处理鉴权、限流和日志记录
- 隐藏后端真实 IP 和端口,配合 WAF 和 CloudFront 形成完整的安全防护链
两种实现方案对比:EC2 + Nginx vs AWS ALB
在 AWS 上实现反向代理有两种方式:自建 EC2 + Nginx或者使用 AWS 托管的 ALB(Application Load Balancer)。
两者本质上都是七层反向代理,差别在于灵活性、运维成本和适用场景。
| 对比项 | EC2 + Nginx | AWS ALB |
| 初始成本 | EC2 实例费用(t3.small 约 $15/月) | 按小时 + 按 LCU 双重计费(约 $20/月起) |
| 配置灵活性 | 最高,完全自定义路由和中间件 | 中等,规则数量有上限 |
| 高可用 | 需自行配置多 AZ 部署 | 原生多可用区,自动故障转移 |
| 运维工作量 | 较高,需维护 Nginx 配置和证书 | 极低,AWS 全托管 |
| SSL 证书 | 需自行配置 Certbot 或上传证书 | ACM 免费证书,自动续签 |
| 适合场景 | 复杂路由逻辑、成本敏感、定制需求多 | 生产环境、团队运维资源有限 |
EC2 + Nginx 自建反向代理
Nginx 方案灵活性最高,可以精细控制路由规则、缓存策略、请求改写和响应头修改。适合有复杂路由逻辑、需要自定义中间件、或者预算有限不希望为 ALB 支付固定时长费用的场景。代价是需要自行维护 Nginx 配置、处理证书续签、以及规划高可用部署。
AWS ALB 托管反向代理
ALB 本质上就是 AWS 托管的七层反向代理,支持按路径、按 Header、按主机名路由,支持蓝绿部署和金丝雀发布,与 ACM 深度集成实现 HTTPS 证书自动续签。
适合生产环境需要高可用、团队没有专职运维、或者业务有弹性扩缩容需求的场景。如果已经在 AWS 上运行生产业务,ALB 通常是更稳妥的选择。
在 EC2 上用 Nginx 配置反向代理
实例选型与系统选择
Nginx 反向代理本身对计算资源的消耗不大,主要消耗是网络 I/O 而非 CPU 和内存。通用型 t3.small(2 vCPU、2GB 内存)处理中等流量完全够用,高流量场景可以升级到 t3.medium 或 c6i.large。
操作系统推荐 Amazon Linux 2023 或 Ubuntu 22.04 LTS,软件包支持均完善,官方文档资料最丰富。
实例应部署在公有子网,配置弹性公网 IP 接收外部流量,或者挂在 ALB 后方接收分发下来的流量。
后端应用服务器放私有子网,不配置公网 IP。关于不同实例系列的适用场景和性能区别可以参考AWS EC2 实例类型选择指南。
Nginx 安装与基础反向代理配置
在 Amazon Linux 2023 上安装 Nginx:
sudo dnf install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx
Ubuntu 系统:
sudo apt update && sudo apt install nginx -y
sudo systemctl enable nginx
基础反向代理配置文件放在 /etc/nginx/conf.d/proxy.conf:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://10.0.1.10: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;
proxy_connect_timeout 30s;
proxy_read_timeout 60s;
}
}
几个配置项的判断逻辑:proxy_pass 填写后端应用服务器的私有 IP 和端口;X-Real-IP 和 X-Forwarded-For 头部用于向后端传递客户端真实 IP,后端日志才能记录正确来源,不配置的话后端看到的全是代理服务器的 IP;proxy_connect_timeout 和 proxy_read_timeout 根据后端响应速度设置合理值,避免因超时导致 502 报错。
配置完成后:
sudo nginx -t # 验证语法
sudo systemctl reload nginx # 热重载,不中断现有连接
HTTPS 配置与证书自动续签
如果使用 EC2 自建方案,可以通过 Certbot 免费申请 Let’s Encrypt 证书并自动完成 Nginx 配置:
sudo dnf install certbot python3-certbot-nginx -y
sudo certbot –nginx -d your-domain.com
Certbot 会自动修改 Nginx 配置,将 HTTP 请求重定向到 HTTPS,并配置 SSL 证书路径。设置自动续签:
echo “0 12 * * * root certbot renew –quiet” | sudo tee -a /etc/crontab
Let’s Encrypt 证书有效期 90 天,上述 cron 任务每天中午检查一次,证书到期前 30 天自动续签。
如果选 ALB 方案,这一步完全不需要,在 ALB 监听器上绑定 ACM 证书即可,ACM 负责自动续签。
安全组与 VPC 网络架构配置
代理服务器部署后最常见的问题是端口不通或后端无法访问,根本原因几乎都出在安全组规则或 VPC 网络配置上。
安全组规则配置
代理服务器(Nginx EC2 实例)的安全组需要分两个方向配置。
入站规则(接收外部用户请求):
- TCP 80,来源 0.0.0.0/0——接收 HTTP 请求
- TCP 443,来源 0.0.0.0/0——接收 HTTPS 请求
- TCP 22,来源管理 IP 段——SSH 管理,不要对 0.0.0.0/0 开放
出站规则(转发到后端服务器):
- TCP 后端应用端口(如 8080),目标为后端服务器安全组 ID
后端应用服务器的安全组入站规则,只允许来自代理服务器安全组的流量,完全不对公网开放。这是最关键的安全设计——即使代理层被穿透,后端服务器也没有公网入口可以直接访问。安全组的具体配置操作和常见排错方法,可以参考 AWS 安全组怎么配置? 。
VPC 网络架构:代理层与应用层分离
标准的三层架构是:代理服务器(Nginx 或 ALB)放公有子网,后端应用服务器放私有子网,数据库放独立的私有子网,通过安全组控制各层之间的访问权限。
这种架构下应用服务器和数据库不配置公网 IP,外部流量只能通过代理层进入,攻击面最小化。
代理层可以配置多个可用区实现高可用,即使单个 AZ 故障,流量自动切换到其他 AZ 的代理实例。关于 VPC 子网划分、路由表和公私网分离架构的完整设计,可以参考 AWS VPC 网络配置教程 。
出站流量成本:代理服务器的隐性费用
这是很多人部署反向代理前没有想清楚的成本问题。反向代理是所有请求的中转点,所有响应内容都通过代理服务器返回给客户端,这意味着出站流量完全由代理层承担,而不是分散在各个后端实例上。
AWS 的出站流量费约 $0.09/GB(美国区),亚太区约 $0.08–0.12/GB。
一个日均 10 万 PV、平均响应体积 200KB 的网站,每月出站流量约 600GB,仅带宽费用就接近 $60。如果是视频、大文件下载类业务,出站流量费会更高,有时会超过 EC2 实例本身的费用。
缓解出站流量成本最直接的方式是把静态资源(图片、CSS、JS、视频)交给 CloudFront CDN 分发,代理层只处理动态 API 请求和服务端渲染页面,大幅减少直接从 EC2 出站的流量。CloudFront 到终端用户的流量费比 EC2 直接出站便宜,而且 CloudFront 到 EC2 源站的回源流量走 AWS 内网,不产生额外费用。关于出站流量计费逻辑和实际降低账单的方法,可以参考 AWS 出站流量费 。
常见反向代理应用场景
多后端统一入口与路径路由
Nginx 根据 URL 路径把请求分发到不同后端服务,是微服务架构中最常见的使用方式:
server {
listen 80;
server_name api.your-domain.com;
location /api/ {
proxy_pass http://10.0.1.10:8080;
}
location /admin/ {
proxy_pass http://10.0.1.20:8090;
allow 10.0.0.0/8; # 只允许内网访问
deny all;
}
location /static/ {
proxy_pass http://10.0.1.30:80;
proxy_cache_valid 200 1d; # 静态资源缓存 1 天
}
}
负载均衡配置
Nginx 内置 upstream 模块支持多种负载均衡策略:
upstream backend {
least_conn; # 最少连接数策略
server 10.0.1.10:8080;
server 10.0.1.11:8080;
server 10.0.1.12:8080;
keepalive 32; # 保持长连接,减少握手开销
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
least_conn 策略将新请求分发给当前连接数最少的后端实例,比默认的轮询策略更适合响应时间差异较大的场景。
请求限流与防刷
在 Nginx 层配置限流比在应用层处理更高效,流量在进入业务逻辑前就被过滤:
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
}
上述配置对每个 IP 限制每秒最多 10 个请求,允许突发最多 20 个请求。超出限制的请求直接返回 429,不会到达后端应用服务器。
AWS 账号开通与代理充值
搭建 AWS 代理服务器需要有效的 AWS 账号。
官网注册需要绑定海外信用卡,这是国内用户最常见的开户门槛。
通过 AWS 代理商 渠道开户,免绑卡、支持 USDT、支付宝和对公转账,充值享折扣返点,长期项目叠加返点后的年度实际成本低于官网直充。
企业项目在正式部署代理服务器前,建议提前确认账号归属、计费方式和目标区域资源配额,避免上线后才发现配置受限。


