在 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
使用 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
第四步:编写反向代理配置
在/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 日期。
查看 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/