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
相关产品推荐
相关产品推荐

