怎么在 EC2 Ubuntu 20.04 上配置 Nginx 反向代理 HTTPS

文章导读
在 EC2 Ubuntu 20.04 上配置 Nginx 反向代理 HTTPS,核心是先安装 Nginx、准备 SSL 证书、配置反向代理规则,最后验证服务状态。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在 EC2 Ubuntu 20.04 上配置 Nginx 反向代理 HTTPS,核心是先安装 Nginx、准备 SSL 证书、配置反向代理规则,最后验证服务状态。

先说结论:这套方案适合已有域名和后端服务的场景,用 Nginx 做 HTTPS 终止和请求转发,配置过程清晰且可回滚。

  • 适合:已有域名解析到 EC2 公网 IP,后端服务运行在本地或内网端口
  • 先准备:SSL 证书文件(.crt 和.key)或使用 Certbot 自动申请、后端服务地址和端口、安全组放行 80 和 443
  • 验收:用 curl 或浏览器访问 HTTPS 地址,确认证书有效且请求能转发到后端
  • 建议:修改配置前先备份,生产环境安全组尽量限制来源 IP

命令速用版

下面命令可直接在 EC2 Ubuntu 20.04 实例上执行,每步都有检查点。

安装 Nginx:

sudo apt update
sudo apt install nginx
nginx -v

放行防火墙端口:

sudo ufw allow 'Nginx Full'
sudo ufw status

创建 SSL 目录并上传证书:

sudo mkdir -p /etc/nginx/ssl
# 将 cert.crt 和 cert.key 上传到 /etc/nginx/ssl/

备份并创建反向代理配置文件:

sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
sudo nano /etc/nginx/conf.d/harbor.conf

测试配置并重启:

sudo nginx -t
sudo systemctl restart nginx
sudo systemctl status nginx

为什么会这样

Nginx 反向代理 HTTPS 的本质是让 Nginx 作为中间层:客户端用 HTTPS 访问 Nginx,Nginx 解密后用 HTTP 或 HTTPS 转发给后端服务。这样做有几个好处:SSL 证书只需在 Nginx 上配置,后端服务不用处理加密;可以在 Nginx 层统一做访问控制、日志记录;后端服务可以跑在内网,不直接暴露公网。

在 EC2 上还需要注意安全组设置,AWS 安全组相当于实例级别的防火墙,必须放行 80 和 443 端口,否则即使 Nginx 配置正确也无法访问。

分步处理

第一步:安装并验证 Nginx

怎么在 EC2 Ubuntu 20.04 上配置 Nginx 反向代理 HTTPS

使用 apt 从 Ubuntu 默认仓库安装,安装后检查版本确认成功。

sudo apt update
sudo apt install nginx
nginx -v

检查点:看到 nginx version 输出即表示安装成功。

第二步:配置 AWS 安全组

在 AWS 控制台找到你的 EC2 实例关联的安全组,添加入站规则:

  • 类型:HTTP,端口:80,来源:0.0.0.0/0(生产环境建议限制特定 IP)
  • 类型:HTTPS,端口:443,来源:0.0.0.0/0(生产环境建议限制特定 IP)

检查点:在本地浏览器访问 EC2 公网 IP,能看到 Nginx 默认欢迎页。

第三步:准备 SSL 证书

证书有两种获取方式:用 Let's Encrypt 免费申请(推荐 Certbot 自动管理),或从证书提供商购买。证书文件通常包含.crt(证书)和.key(私钥)两个文件。

将证书上传到服务器:

sudo mkdir -p /etc/nginx/ssl
# 使用 scp 或 SFTP 工具上传 cert.crt 和 cert.key 到 /etc/nginx/ssl/

检查点:确认文件权限,私钥建议设为 600。

sudo chmod 600 /etc/nginx/ssl/*.key

可选:使用 Certbot 自动申请和管理证书

sudo apt install certbot python3-certbot-nginx
sudo certbot `--nginx` -d your-domain.com

第四步:编写反向代理配置

怎么在 EC2 Ubuntu 20.04 上配置 Nginx 反向代理 HTTPS

在/etc/nginx/conf.d/下创建配置文件,例如 harbor.conf。注意:修改前建议备份原文件。

server {
    listen 443 ssl;
    server_name your-domain.com;

    ssl_certificate /etc/nginx/ssl/cert.crt;
    ssl_certificate_key /etc/nginx/ssl/cert.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    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_connect_timeout 15;
        proxy_read_timeout 15;
    }
}

检查点:proxy_pass 地址必须改成你的后端服务实际地址和端口,否则会导致 502 错误。

第五步:可选配置 HTTP 重定向到 HTTPS

新建一个监听 80 端口的 server 块,强制跳转:

server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$server_name$request_uri;
}

第六步:测试并启用配置

sudo nginx -t
sudo systemctl restart nginx
sudo systemctl status nginx

检查点:nginx -t 输出 syntax is ok 和 test is successful。

怎么验证是否生效

用 curl 测试 HTTPS 连接:

curl -I https://your-domain.com

检查点:返回 HTTP/1.1 200 OK 或 301/302 跳转,且证书信息正常。

用 openssl 检查证书:

echo | openssl s_client -connect your-domain.com:443 2>/dev/null | openssl x509 -noout -dates

检查点:能看到证书的 notBefore 和 notAfter 日期。

怎么在 EC2 Ubuntu 20.04 上配置 Nginx 反向代理 HTTPS

查看 Nginx 访问日志:

sudo tail -f /var/log/nginx/access.log

检查点:访问时能看到新的日志条目,说明请求已到达 Nginx。

浏览器访问验证:

在浏览器输入 https://your-domain.com,地址栏应显示锁形图标,点击可查看证书详情。如果后端服务有页面,应能正常显示。

常见坑

安全组没放行 443 端口:这是 EC2 特有的问题,Nginx 配置正确但浏览器无法访问,先检查 AWS 安全组入站规则。

证书路径写错:Nginx 启动会失败,nginx -t 会提示 cannot load certificate。确认路径和文件名完全一致,包括大小写。

域名未解析到 EC2 IP:在本地 ping your-domain.com,确认解析到的是 EC2 公网 IP。DNS 生效可能需要几分钟到几小时。

后端服务不可达:Nginx 能启动但访问返回 502 Bad Gateway。务必确认 proxy_pass 指向的服务正在运行且端口正确

证书权限过宽:私钥文件权限如果是 644 或更宽,Nginx 可能拒绝加载。用 chmod 600 限制私钥权限。

配置修改后没重启:Nginx 不会自动重载配置,每次修改后都要执行 nginx -t 测试和 systemctl restart nginx。

参考来源

  • Nginx 官方文档:https://nginx.org/en/docs/
  • AWS 安全组规则:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html
  • Ubuntu 服务器指南 - Nginx:https://ubuntu.com/server/docs/web-servers-nginx
  • Certbot 官方文档:https://certbot.eff.org/