配置Nginx反向代理Docker容器失败:请求跳转至Apache默认页
问题排查与解决步骤
你的问题核心是Nginx反向代理未生效,请求被Apache接管,以下是逐步排查方案:
1. 检查80端口占用情况
Apache默认监听80端口,如果它在运行,Nginx将无法绑定80端口,所有请求都会直接到Apache。执行以下命令查看端口占用:
ss -tulpn | grep :80
如果输出中出现httpd或apache2进程,说明Apache占用了80端口。解决方式:
- 停止Apache服务:
# Systemd系统 sudo systemctl stop apache2 && sudo systemctl disable apache2 # SysVinit系统 sudo service apache2 stop && sudo update-rc.d apache2 disable - 重启Nginx确保它绑定80端口:
sudo systemctl restart nginx
2. 验证Nginx配置语法与生效状态
配置文件语法错误会导致Nginx无法加载新配置,执行语法检查:
sudo nginx -t
如果输出test is successful,再强制重载配置:
sudo nginx -s reload
3. 修正/etc/hosts的拼写错误
你提到已添加ap1.example.com到hosts,但配置文件中是api1.example.com(少了一个i),这会导致请求的域名无法匹配Nginx的server块,从而触发默认路由。修正hosts文件:
sudo nano /etc/hosts
将错误的ap1.example.com改为api1.example.com,保存后退出。
4. 确认Docker容器的端口映射与可用性
确保容器正常运行且端口映射正确:
- 查看容器状态:
确认两个容器的docker psPORTS列显示类似0.0.0.0:8000->xxxx/tcp和0.0.0.0:9000->xxxx/tcp,说明宿主机能访问容器端口。 - 测试宿主机到容器的连通性:
如果返回容器的预期内容,说明容器本身没问题;如果返回Apache页面,可能是容器内部运行了Apache,需要检查容器配置。curl localhost:8000 curl localhost:9000
5. 检查Nginx默认server优先级
Nginx会优先匹配最具体的server块,如果sites-enabled目录下存在默认配置(比如default文件),且该配置的server块未指定明确的server_name,可能会优先匹配。可以修改conf.d中的配置,添加default_server标记强制优先级:
server { server_name api1.example.com; listen 80 default_server; # 仅给其中一个server添加,避免冲突 location / { proxy_pass http://localhost:8000; } } server { server_name api2.example.com; listen 80; location / { proxy_pass http://localhost:9000; } }
修改后重载Nginx配置。
内容的提问来源于stack exchange,提问作者swaran
相关产品推荐
相关产品推荐

