Docker环境新增Nginx第二server块作反向代理后所有服务无法访问
故障原因排查
你配置错误的核心原因有4个:
- Nginx配置校验不通过直接启动失败,是无响应的首要原因:你新增的Next.js服务块用了相对路径
logs/nextjs.access.log,Nginx容器内不存在该相对路径,启动直接报错 - 你把宿主机
8088、3000两个端口都映射到Nginx容器的80端口,Nginx无法区分请求来源;两个服务块都监听80仅靠server_name区分,你访问localhost时Host头为localhost,只会匹配到Laravel的服务块,永远不会走Next.js的配置 proxy_pass没有加http://协议头,Nginx无法识别转发规则,也会导致配置校验失败- Next.js的匹配规则写了
location /nextjs,访问根路径无法匹配到转发规则,即使启动成功也会返回404
修复步骤
1. 修改docker-compose.yml配置
仅调整Nginx部分的端口映射,删掉不必要的Next.js代码挂载(反向代理不需要把前端代码挂载到Nginx容器):
nginx: image: nginx:stable-alpine container_name: nginx ports: - "8088:80" # Postman调用API用这个端口 - "3000:81" # 前端访问用localhost:3000 volumes: - ./laravel-api:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php - mysql - node networks: - laravel
其余服务配置保持你修改后的版本即可。
2. 替换nginx default.conf配置
# Laravel API服务块,监听80端口对应宿主机8088 server { listen 80; index index.php index.html; server_name localhost; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/html/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } # Next.js前端服务块,监听81端口对应宿主机3000 server { listen 81; server_name localhost; access_log /var/log/nginx/nextjs.access.log; error_log /var/log/nginx/nextjs.error.log; location / { proxy_pass http://node:3000; 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; # 适配Next.js热重载的WebSocket需求 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
3. 额外适配(Next.js调用API配置)
Next.js代码中调用Laravel API的地址不要写localhost:8088,直接写http://nginx:80即可,两个容器在同一网桥下可以直接用服务名通信。
4. 重启服务生效
执行以下命令重启所有容器:
docker compose down docker compose up -d --build
可以用docker ps查看Nginx容器是否正常运行,若异常执行docker logs nginx查看具体报错。
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

