You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Docker单服务器端口80部署多站点跳转异常求助

解决多Laravel项目Docker部署的端口冲突与域名跳转问题

一、解决端口80占用问题

方案1:临时端口映射(快速测试)

修改b.com的docker-compose-production.yaml中Nginx服务的端口映射,将主机端口从80改为未被占用的端口(比如8080):

services:
  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"  # 主机8080端口映射容器内80端口
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./:/var/www/html
    # 其他原有配置...

启动容器后,通过http://b.com:8080访问项目。

方案2:全局反向代理(生产环境推荐)

用独立Nginx容器作为反向代理,统一处理主机80/443端口,转发到不同项目容器:

  1. 创建共享Docker网络:
docker network create laravel-proxy
  1. 修改a.com和b.com的docker-compose-production.yaml,将服务加入该网络(删除原主机端口映射,仅保留容器内端口):
services:
  nginx:
    networks:
      - laravel-proxy
    # 移除ports字段,或仅保留容器内端口配置(如listen 80)
    # 其他原有配置...
networks:
  laravel-proxy:
    external: true
  1. 创建反向代理Nginx配置文件proxy.conf
server {
    listen 80;
    server_name a.com www.a.com;

    location / {
        proxy_pass http://a-nginx:80;  # a-nginx为a.com容器的服务名
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name b.com www.b.com;

    location / {
        proxy_pass http://b-nginx:80;  # b-nginx为b.com容器的服务名
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
  1. 启动反向代理容器:
# docker-compose-proxy.yaml
services:
  proxy:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./proxy.conf:/etc/nginx/conf.d/default.conf
    networks:
      - laravel-proxy
networks:
  laravel-proxy:
    external: true

完成后两个项目可通过各自域名直接访问,无需额外端口。

二、解决访问b.com跳转到a.com的问题

1. 修正b.com的Nginx配置

打开b.com的nginx.conf,确保server_name设置为b.com域名,清除a.com相关残留配置:

server {
    listen 80;
    server_name b.com www.b.com;  # 重点:必须匹配b.com域名
    root /var/www/html/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;  # 对应docker-compose中的PHP服务名
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

修改后重启b.com的Nginx容器:

docker-compose restart nginx

2. 修正Laravel项目配置

进入b.com的PHP容器,修改.env中的APP_URL

APP_URL=http://b.com  # 若用临时端口8080则写http://b.com:8080

清除配置缓存:

php artisan config:clear
php artisan cache:clear
php artisan route:clear

3. 清除浏览器缓存

浏览器可能缓存旧跳转记录,按Ctrl+Shift+R强制刷新,或使用无痕模式测试。

4. 检查反向代理配置(若用方案2)

确保反向代理proxy.conf中,b.com的server_nameproxy_pass正确指向b.com容器,无错误指向a.com服务的配置。

内容的提问来源于stack exchange,提问作者ysfkaya

火山引擎 最新活动