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.pemprivkey.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

火山引擎 最新活动