使用Docker+反向代理部署Laravel时出现内部服务器错误
问题描述
尝试通过Docker部署Laravel应用,使用两台服务器:带公网IP的反向代理服务器(10.0.0.12)和Laravel应用服务器(10.0.0.81),通过IP+端口测试访问时出现内部服务器错误。
反向代理Nginx配置(10.0.0.12)
server { listen 8666; server_name 10.0.0.12; location / { proxy_pass http://10.0.0.81:8555; } }
Laravel项目Dockerfile
FROM php:7.4-apache RUN apt-get update && apt-get install -y \ git \ unzip \ libonig-dev \ libzip-dev \ libpng-dev \ libjpeg-dev \ libfreetype6-dev \ && docker-php-ext-install pdo_mysql mbstring zip exif pcntl bcmath gd RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer WORKDIR /var/www/html/laravel-cms COPY . . RUN composer install --no-scripts RUN php artisan key:generate RUN chmod -R 777 storage bootstrap/cache EXPOSE 80 RUN chown -R www-data:www-data /var/www/html/laravel-cms CMD ["apache2-foreground"]
Docker Compose配置
version: '3' services: web: build: context: . dockerfile: Dockerfile image: laravel-app container_name: laravel_cms-container restart: unless-stopped ports: - "8555:80" volumes: - .:/var/www/html/laravel-cms networks: - laravel networks: laravel:
执行docker build和docker up无报错,但访问时Nginx错误日志如下:
request: "GET / HTTP/1.1", upstream: "http://10.0.0.81:5555/", host: "10.0.0.12:8666" 2023/12/20 15:42:01 [error] 178771#178771: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 10.0.0.1, server: 10.0.0.12
错误分析与解决方案
1. 端口不匹配(核心错误)
日志显示Nginx实际转发的端口是5555,但代理配置和Docker映射的都是8555,说明Nginx配置未生效:
- 执行
nginx -t验证配置语法正确性 - 执行
systemctl restart nginx(或对应系统的重启命令)加载最新配置 - 再次检查Nginx配置文件,确认
proxy_pass后的端口为8555
2. 检查应用服务器端口开放情况
若10.0.0.81的防火墙/安全组未开放8555端口,反向代理无法建立连接:
- 用
ufw allow 8555/tcp(ufw防火墙)开放端口,或在云服务商安全组添加8555端口入站规则 - 在反向代理服务器执行
telnet 10.0.0.81 8555测试端口连通性
3. 验证Docker容器运行状态
确认Laravel容器正常监听8555端口:
- 执行
docker ps查看laravel_cms-container状态为Up - 执行
netstat -tulpn | grep 8555,确认主机8555端口被docker-proxy占用 - 进入容器执行
docker exec -it laravel_cms-container apache2ctl status,检查Apache是否正常运行
4. 修正Apache虚拟主机配置
默认php:7.4-apache镜像的根目录是/var/www/html,但项目在/var/www/html/laravel-cms,需修改Apache配置指向项目public目录:
- 在Dockerfile中添加以下内容:
RUN a2enmod rewrite RUN echo "<VirtualHost *:80>\n DocumentRoot /var/www/html/laravel-cms/public\n <Directory /var/www/html/laravel-cms/public>\n AllowOverride All\n Require all granted\n </Directory>\n</VirtualHost>" > /etc/apache2/sites-available/000-default.conf
- 重新构建镜像并启动容器:
docker-compose down && docker-compose build && docker-compose up -d
5. 修复挂载目录权限问题
因使用本地目录挂载,主机目录权限会覆盖容器内设置:
- 在Laravel项目根目录执行
chown -R www-data:www-data ./ - 确认
.env文件存在且APP_KEY已正确生成,执行docker exec -it laravel_cms-container php artisan config:cache刷新配置缓存
内容的提问来源于stack exchange,提问作者Catto
相关产品推荐
相关产品推荐

