You need to enable JavaScript to run this app. Laravel Docker单容器无法提供网站服务如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Docker单容器无法提供网站服务如何解决?

问题原因分析
  • 缺少服务启动逻辑:当前Dockerfile没有指定同时启动Nginx和PHP-FPM的入口命令,基础镜像php:7.4-fpm默认只会启动PHP-FPM服务,Nginx根本没有运行,所以访问80端口没有响应
  • Nginx配置路径错误:你当前直接把server块配置覆盖到/etc/nginx/nginx.conf,而默认Nginx主配置文件已经包含http块结构,直接放server块会导致配置语法错误,即使启动Nginx也会报错
  • 权限问题:最后你切换到了普通用户hridoy,该用户没有权限启动Nginx、PHP-FPM服务,也没有权限访问PHP-FPM的sock文件
  • 站点目录权限不足:/var/www目录以及Laravel的存储目录没有给www-data用户读写权限,Laravel运行时会报错
  • PHP-FPM配置问题:默认PHP-FPM没有配置unix sock的访问权限,Nginx无法转发请求到PHP-FPM
修正方案

1. 调整Nginx配置

将你写的server块配置文件重命名为laravel.conf,不要直接覆盖默认的nginx.conf主配置。

2. 新增supervisor配置文件

在项目根目录新建supervisord.conf,用来同时管理Nginx和PHP-FPM两个进程:

[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisord.log
pidfile=/var/run/supervisord.pid

[program:php-fpm]
command=php-fpm
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:nginx]
command=nginx -g 'daemon off;'
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

3. 修正Dockerfile

FROM php:7.4-fpm

# 安装依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    libzip-dev \
    nginx \
    supervisor

# 复制Nginx站点配置到正确路径
COPY laravel.conf /etc/nginx/conf.d/laravel.conf
# 移除Nginx默认站点配置
RUN rm /etc/nginx/conf.d/default.conf

# 复制supervisor配置
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# 安装PHP扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd xml zip

RUN pecl install -o -f redis \
    &&  rm -rf /tmp/pear \
    &&  docker-php-ext-enable redis

# 配置PHP-FPM监听权限,允许Nginx访问sock
RUN sed -i 's/^listen = .*/listen = \/var\/run\/php\/php7.4-fpm.sock/' /usr/local/etc/php-fpm.d/www.conf \
    && sed -i 's/^;listen.owner = .*/listen.owner = www-data/' /usr/local/etc/php-fpm.d/www.conf \
    && sed -i 's/^;listen.group = .*/listen.group = www-data/' /usr/local/etc/php-fpm.d/www.conf \
    && sed -i 's/^;listen.mode = .*/listen.mode = 0660/' /usr/local/etc/php-fpm.d/www.conf

# 获取最新版Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 创建系统用户运行Composer和Artisan命令
RUN useradd -G www-data,root -d /home/hridoy hridoy
RUN mkdir -p /home/hridoy/.composer && \
    chown -R hridoy:hridoy /home/hridoy

# 设置工作目录
WORKDIR /var/www

ADD . .

# 安装依赖
RUN composer install --no-interaction --optimize-autoloader --no-dev

# 调整Laravel目录权限
RUN chown -R www-data:www-data /var/www \
    && chmod -R 775 /var/www/storage /var/www/bootstrap/cache

# 暴露80端口
EXPOSE 80

# 启动supervisor管理进程
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

4. 验证方式

构建镜像启动后如果还有异常,可以执行以下命令排查:

  • 查看运行的进程:docker exec -it <容器ID> ps aux,确认nginx和php-fpm进程都在运行
  • 查看Nginx错误日志:docker exec <容器ID> cat /var/log/nginx/error.log

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 06:51:01