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

EC2实例配置Nginx反向代理至NodeJS服务仍显示默认页求助

问题描述

我正尝试在EC2实例上为NodeJS应用部署Nginx反向代理,之前多次配置成功,但这次访问80端口始终显示Nginx默认的“Welcome to nginx!”页面。

已执行操作

  • 安装Nginx:
    sudo yum update -y
    sudo yum install nginx
    
  • 在conf.d目录创建配置文件/etc/nginx/conf.d/testing.api.example.com,内容如下:
    server {
            listen 80 default_server;
            listen [::]:80 default_server;
            server_name testing.api.example.com;
    
            location / {
                        proxy_pass http://127.0.0.1:8082;
                        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;
    
                }
    }
    
  • 配置检查并重启Nginx:
    sudo nginx -t
    sudo systemctl restart nginx
    
  • 本地测试NodeJS服务正常:
    $ curl 127.0.0.1:8082
    Hello Node!
    
  • 已确认Nginx主配置文件nginx.conf包含conf.d目录,尝试修改server_name为域名、IP等均无效。

附nginx.conf核心内容

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    # 默认server块
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

解决方案

问题根源在于Nginx默认server块的优先级和请求匹配规则:

核心原因

你的自定义配置虽然设置了default_server,但nginx.conf中默认server块的server_name _会匹配所有未匹配到其他server块的请求;同时配置加载顺序是先加载conf.d目录的文件,再定义默认server块,当请求Host不匹配testing.api.example.com时,Nginx会优先使用默认server块返回欢迎页面。

修复步骤

方法一:让自定义配置匹配请求Host

如果通过EC2实例IP访问,修改自定义配置的server_name,添加实例IP:

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name testing.api.example.com 1.2.3.4; # 替换为你的EC2实例IP

        location / {
                    proxy_pass http://127.0.0.1:8082;
                    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;

            }
}

修改后执行sudo nginx -t检查配置合法性,再重启Nginx:sudo systemctl restart nginx。

方法二:移除默认server块

打开/etc/nginx/nginx.conf,将默认的server块注释或删除:

# server {
#     listen       80;
#     listen       [::]:80;
#     server_name  _;
#     root         /usr/share/nginx/html;
#
#     include /etc/nginx/default.d/*.conf;
#
#     error_page 404 /404.html;
#     location = /404.html {
#     }
#
#     error_page 500 502 503 504 /50x.html;
#     location = /50x.html {
#     }
# }

此操作后,Nginx会将你的自定义配置作为默认服务器,因为你在配置中指定了default_server。同样需要重启Nginx生效。

方法三:调整配置加载顺序(不推荐)

将nginx.conf中的include /etc/nginx/conf.d/*.conf移动到默认server块之后,让自定义配置覆盖默认规则,但此方式容易引发配置混淆。

验证

修改完成后,再次访问EC2实例的80端口,应该会返回NodeJS服务的Hello Node!内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:49:56