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
相关产品推荐
相关产品推荐

