You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AWS EC2 Ubuntu实例配置Nginx SSL遇超时问题求助

Troubleshooting HTTPS Timeout on Ubuntu EC2 with Nginx

从你的描述和配置来看,HTTPS超时但HTTP能正常访问的情况,大概率是443端口的流量没有真正到达Nginx或者存在隐性的配置/权限问题,咱们一步步来排查:

1. 验证Nginx是否正确监听443端口

首先确认Nginx有没有成功加载443端口的配置:

  • 先检查配置语法是否合法:
    sudo nginx -t
    
    如果有报错(比如证书路径错误、语法拼写问题),先修复这些错误再重启Nginx。
  • 再查看端口监听状态:
    sudo ss -tulpn | grep 443
    
    你应该能看到Nginx进程(nginx: master process或者nginx: worker process)在监听0.0.0.0:443和[::]:443,如果看不到,说明Nginx没成功启动443的监听,优先解决配置语法问题。

2. 检查EC2网络层面的限制

你已经开了安全组的443端口,但还有两个容易忽略的点:

  • VPC网络ACL:如果你的EC2在自定义VPC里,要确认网络ACL的入站和出站规则都允许TCP 443流量。网络ACL是无状态的,所以出站规则也要放行443(SSL握手需要返回流量)。
  • Ubuntu本地防火墙(ufw):Ubuntu默认启用ufw,可能默认没开放443端口。检查状态:
    sudo ufw status
    
    如果443不在允许列表里,添加规则并重启:
    sudo ufw allow 443/tcp
    sudo ufw reload
    
    这是Ubuntu和Amazon AMI的常见差异——Amazon AMI默认用iptables且规则更宽松,而Ubuntu的ufw默认会限制非常用端口。

3. 验证SSL证书的权限与路径

Nginx进程通常以www-data用户运行,要确保它能读取证书文件:

  • 查看证书目录的权限:
    sudo ls -l /etc/letsencrypt/live/mydomain.com/
    
    确保fullchain.pem和privkey.pem的权限允许www-data读取(至少是其他用户有读权限)。
  • 有时候certbot生成的符号链接可能有问题,可以尝试直接使用/etc/letsencrypt/archive/mydomain.com/下的真实证书文件路径替换配置中的路径,再重启Nginx测试。

4. 修正后端代理的协议头配置

你的配置里有一个小问题(虽然不一定直接导致超时,但会影响后端服务的协议判断):

proxy_set_header X-Forward-Proto http;

应该改成:

proxy_set_header X-Forward-Proto https;

因为当前是HTTPS访问,后端服务如果依赖这个头来判断用户的访问协议,会出现逻辑错误。

5. 本地测试HTTPS连接

在EC2实例内部直接测试HTTPS访问:

curl -v https://localhost
# 或者用域名测试
curl -v https://mydomain.com
  • 如果本地能正常返回内容,说明问题出在外部网络(安全组/ACL/路由);
  • 如果本地也超时,查看Nginx错误日志找线索:
    sudo tail -f /var/log/nginx/error.log
    
    日志里通常会显示SSL握手失败、证书加载失败等具体错误信息。

修正后的完整Nginx配置

server {
 listen 80;
 listen [::]:80;
 server_name mydomain.com;
 return 301 https://$server_name$request_uri;
}
server {
 listen 443 ssl;
 listen [::]:443 ssl;
 server_name mydomain.com;
 root /home/ubuntu/myproject;
 add_header Strict-Transport-Security "max-age=15768000";
 ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
 include /etc/letsencrypt/options-ssl-nginx.conf;
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
 location / {
 proxy_pass http://127.0.0.1:8000;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forward-Proto https; # 修正为HTTPS协议
 proxy_set_header X-Nginx-Proxy true;
 proxy_redirect off;
 }
}

按这个步骤排查下来,大部分HTTPS超时的问题都能解决。如果还是有问题,把Nginx错误日志里的关键信息贴出来,咱们再进一步分析。

内容的提问来源于stack exchange,提问作者user2997001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:44:08