NGINX启用HTTPS后NextJS/NodeJS API POST请求SSL握手失败求助
解决HTTPS切换后NextJS API POST请求502错误及SSL握手问题
核心问题分析
你的NGINX配置存在两个关键错误:
- 针对HTTP上游服务(NextJS运行在
http://127.0.0.1:3000)添加了SSL握手配置,导致NGINX错误地尝试和上游建立SSL连接,触发bad key share错误。 - API路径的代理规则错误,导致请求路径传递异常,引发上游连接中断。
具体修复步骤
1. 移除上游SSL握手配置
删除所有location块中的proxy_ssl_server_name on;指令——该指令仅适用于上游是HTTPS服务的场景,你的NextJS服务使用HTTP监听,不需要此配置,它会强制NGINX发起SSL握手,导致失败。
2. 修正API代理路径
将location /api/中的proxy_pass改为:
proxy_pass http://127.0.0.1:3000/;
末尾添加/可以确保请求路径正确拼接:原请求https://domain/api/getAllPlates会被代理到http://127.0.0.1:3000/api/getAllPlates,而非错误的http://127.0.0.1:3000api/getAllPlates。
3. 移除API请求的WebSocket升级头
API请求不需要WebSocket协议支持,删除location /api/中的以下两行:
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade';
避免不必要的协议升级尝试,减少连接异常概率。
4. 验证NextJS服务可用性
先直接在服务器本地测试NextJS API是否正常响应:
curl -X POST http://127.0.0.1:3000/api/getAllPlates -H "Content-Type: application/json" -d '{}'
如果请求失败,检查NextJS服务日志,排查代码或服务启动问题;如果正常,再重启NGINX测试。
修正后的NGINX配置示例
# nginx config file for Nextjs App # place in /etc/nginx/sites-available/name_of_config_file server { server_name [x-redacted-x]; gzip on; gzip_proxied any; gzip_types application/javascript application/x-javascript text/css text/javascript; gzip_comp_level 5; gzip_buffers 16 8k; gzip_min_length 256; location /_next/static/ { alias /var/www/drxl-axis/.next/static/; expires 365d; access_log off; } location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; auth_basic "Restricted Content"; auth_basic_user_file /etc/nginx/.htpasswd; } location /api/ { proxy_pass http://127.0.0.1:3000/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; send_timeout 300; auth_basic off; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/[x-redacted-x]-0001/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/[x-redacted-x]-0001/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = [x-redacted-x]) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name [x-redacted-x]; return 404; # managed by Certbot }
内容的提问来源于stack exchange,提问作者V. S.
相关产品推荐
相关产品推荐

