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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:40:36