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端口,转发到不同项目容器:
- 创建共享Docker网络:
docker network create laravel-proxy
- 修改a.com和b.com的
docker-compose-production.yaml,将服务加入该网络(删除原主机端口映射,仅保留容器内端口):
services: nginx: networks: - laravel-proxy # 移除ports字段,或仅保留容器内端口配置(如listen 80) # 其他原有配置... networks: laravel-proxy: external: true
- 创建反向代理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; } }
- 启动反向代理容器:
# 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_name和proxy_pass正确指向b.com容器,无错误指向a.com服务的配置。
内容的提问来源于stack exchange,提问作者ysfkaya




