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

Nginx反向代理Node.js服务,外部网络无法访问问题求助

Nginx反向代理Express HTTPS服务器外部无法访问排查与解决

问题背景

在Windows 10系统上运行基于Express的Node.js HTTPS服务器,已配置No-IP DDNS及SSL证书,服务监听3000端口。希望通过Nginx反向代理实现无需指定端口、仅通过域名访问,目前Nginx在局域网内可正常工作,但外部网络无法访问。

已完成的排查操作

  • 路由器已为服务器开放80和443端口,且临时关闭了Windows防火墙
  • DDNS可用(同服务器上的Minecraft服务可被外部正常访问)
  • 从access.log可见外部设备已成功发起请求:
    X.X.X.X - - [05/Nov/2024:20:52:40 +0100] "GET / HTTP/1.1" 301 169 "-" "Mozilla/5.0 (Android 15; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0"
    
  • error.log持续出现SSL握手错误:
    2024/11/05 21:05:46 [info] 5276#10252: *943 SSL_do_handshake() failed (SSL: error:0A000412:SSL routines::sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking, client: X.X.X.X, server: 0.0.0.0:443
    
    客户端IP为本人公网IP,已知该错误可能无关紧要。

当前Nginx配置

worker_processes 1;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name servidordelacruz.dynns.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name xxxxxx.dynns.com;

        ssl_certificate      route_to\cert.pem;
        ssl_certificate_key  route_to\cert.key;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        location / {
            proxy_pass https://localhost:3000;
            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;
        }
    }
}

解决建议

  1. 统一域名配置:两个server块的server_name不一致(一个是servidordelacruz.dynns.com,另一个是xxxxxx.dynns.com),会导致HTTPS请求无法匹配正确的服务器配置,需将两者统一为实际使用的DDNS域名。
  2. 修正证书路径格式:Windows系统下Nginx路径建议使用正斜杠/而非反斜杠\,避免路径解析错误。例如将route_to\cert.pem改为route_to/cert.pem,或使用绝对路径如C:/nginx/certs/cert.pem。
  3. 验证SSL证书有效性:确认证书与域名匹配、未过期,若为CA颁发的证书需确保包含完整证书链。可通过openssl s_client -connect 你的域名:443命令本地测试证书链完整性。
  4. 优化代理SSL配置:后端为HTTPS服务器时,可临时添加proxy_ssl_verify off;(仅测试用,生产环境不推荐),或让Nginx信任后端证书;更推荐的方案是将后端改为HTTP服务,由Nginx统一处理HTTPS,减少SSL握手层级。
  5. 确认端口转发指向:检查路由器端口转发规则,确保80、443端口明确指向服务器的内网IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:11:21