如何配置Nginx让localhost/tut/映射到容器且避免404错误
解决方案
第一步:关闭测试容器的端口暴露
修改docker-compose.yml,删除my-test服务中的ports配置项——同一Docker网络内的服务可直接通过服务名访问,无需暴露端口给主机:
version: '3' services: my-nginx: container_name: my-nginx build: ./nginx/. ports: - "80:80" - "443:443" networks: - my-network my-test: container_name: my-test image: docker/getting-started # 移除ports配置,不再暴露4444端口 networks: - my-network networks: my-network: name: my-network driver: bridge
第二步:调整Nginx配置实现路径映射
根据你的需求,提供两种配置方案:
方案一:通过/tut/访问教程容器(基础需求)
修改nginx.conf中的location /tut/配置,将请求代理到测试容器的/tutorial/路径,并修正重定向地址:
events {} http { server { listen 80; listen [::]:80; location / { root /usr/share/nginx/html; index index.html index.htm; } location /tut/ { # 将/tut/路径代理到测试容器的/tutorial/ proxy_pass http://my-test:80/tutorial/; # 修正测试容器返回的重定向地址,把/tutorial/替换为/tut/ proxy_redirect http://my-test:80/tutorial/ /tut/; # 传递原始请求头,避免测试容器路径识别错误 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
方案二:通过/tutorial/直接访问(最优需求)
如果希望直接用/tutorial/路径访问,配置更简洁,无需路径转换:
events {} http { server { listen 80; listen [::]:80; location / { root /usr/share/nginx/html; index index.html index.htm; } location /tutorial/ { # 直接代理到测试容器的/tutorial/路径 proxy_pass http://my-test:80/tutorial/; # 传递必要请求头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
第三步:重新部署服务
执行以下命令重启容器,使配置生效:
docker-compose down docker-compose up -d --build
原配置404的原因
你之前的proxy_pass http://my-test:80/会把/tut/请求转发到测试容器的根路径,而测试容器根路径会自动重定向到/tutorial/。此时浏览器地址会变成http://localhost/tutorial/,但Nginx没有配置这个路径的代理规则,所以会去本地/usr/share/nginx/html目录查找tutorial/index.html,最终导致404错误。
内容的提问来源于stack exchange,提问作者Murrah
相关产品推荐
相关产品推荐

