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

Docker环境新增Nginx第二server块作反向代理后所有服务无法访问

故障原因排查

你配置错误的核心原因有4个:

  1. Nginx配置校验不通过直接启动失败,是无响应的首要原因:你新增的Next.js服务块用了相对路径logs/nextjs.access.log,Nginx容器内不存在该相对路径,启动直接报错
  2. 你把宿主机8088、3000两个端口都映射到Nginx容器的80端口,Nginx无法区分请求来源;两个服务块都监听80仅靠server_name区分,你访问localhost时Host头为localhost,只会匹配到Laravel的服务块,永远不会走Next.js的配置
  3. proxy_pass没有加http://协议头,Nginx无法识别转发规则,也会导致配置校验失败
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:39:02