请求排查Nginx Server Blocks部署Node.js API的响应异常
Nginx配置错误定位与修复
核心问题
你的配置里缺少api.tendaafrica.net对应的HTTPS(443端口)server块。当HTTP请求被301重定向到HTTPS后,Nginx找不到匹配api.tendaafrica.net的HTTPS server配置,就会默认匹配到其他HTTPS server(比如static.tendaafrica.net的块),而这个块是处理静态文件的,所以你的API请求被当成静态资源处理,无法得到Node.js服务的响应。
修复方案
需要新增api.tendaafrica.net的HTTPS server块,同时补全主域名HTTPS块的缺失部分,完整配置如下:
#Server blocks for incoming HTTP requests server { if ($host = www.tendaafrica.net) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = tendaafrica.net) { return 301 https://$host$request_uri; } # managed by Certbot # server block for 'tendaafrica.net', 'www.tendaafrica.net' domains listen 80; listen [::]:80; server_name tendaafrica.net www.tendaafrica.net; # redirect any HTTP request to HTTPS return 301 https://$http_host$request_uri; } server { if ($host = api.tendaafrica.net) { return 301 https://$host$request_uri; } # managed by Certbot # server block for 'api.tendaafrica.net' domain (HTTP) listen 80; listen [::]:80; server_name api.tendaafrica.net; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } server { # server block for 'static.tendaafrica.net' domain (HTTPS) server_name static.tendaafrica.net; root /var/www/tenda-main; index index.html index.htm; location / { try_files $uri $uri/ =404; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/tendaafrica.net/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/tendaafrica.net/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 } # 新增api.tendaafrica.net的HTTPS server块 server { server_name api.tendaafrica.net; listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/tendaafrica.net/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/tendaafrica.net/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 # 反向代理到Node.js API location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } server { # server block for all the other requests (HTTP) listen 80 default_server; listen [::]:80 default_server; return 444; } # server blocks for incoming HTTPS requests server { # server block for 'tendaafrica.net', 'www.tendaafrica.net' domains (HTTPS) listen [::]:443 ssl; listen 443 ssl; server_name tendaafrica.net www.tendaafrica.net; # SSL configuration by certbot ssl_certificate /etc/letsencrypt/live/tendaafrica.net/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/tendaafrica.net/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 # 这里可以根据主域名的需求添加location配置,比如静态文件或其他代理 # 示例:如果主域名是静态站点 # root /path/to/your/main/site; # index index.html; # location / { # try_files $uri $uri/ =404; # } }
关键修改点
- 新增了
api.tendaafrica.net的443端口server块,配置和HTTP块一致的反向代理规则,确保HTTPS请求能正确转发到Node.js服务。 - 补全了主域名HTTPS server块的SSL参数和闭合部分,避免配置语法错误。
修改后,执行以下命令生效:
sudo nginx -t # 检查配置语法 sudo systemctl reload nginx # 重新加载配置
内容的提问来源于stack exchange,提问作者Trevor kayiira
相关产品推荐
相关产品推荐

