一、部署前置说明:为何采用Docker安装PHP7.4

Ubuntu 26.04 系统默认环境无法直接原生部署 PHP7.4,存在多重适配风险,因此本次方案采用宿主机Nginx + Docker容器PHP7.4-FPM的分离架构,规避系统兼容问题,具体原因如下:

  • 官方源版本不兼容:Ubuntu 26.04 官方软件源默认最高提供 PHP8.5,无 PHP7.4 原生安装包;

  • 版本停止维护:PHP7.4 已终止官方维护,无后续安全补丁与功能更新,原生安装易存在漏洞风险;

  • 系统适配失效:PHP7.4 未针对 Ubuntu 26.04 新内核、依赖库适配,原生安装大概率出现依赖报错、编译失败问题。

二、整体部署架构

本方案采用动静分离、容器隔离的经典Web架构,兼顾稳定性与安全性,架构明细如下:

  • Nginx:部署在 Ubuntu26.04 宿主机,负责静态资源处理、请求转发、伪静态配置;

  • PHP7.4-FPM:运行在 Docker 容器内,仅处理PHP动态解析请求;

  • 通信机制:容器9000端口映射至宿主机127.0.0.1:9074,Nginx仅本地转发请求,不对外开放PHP端口,保障服务安全。

三、Docker部署PHP7.4-FPM容器

1. 创建网站存放目录(宿主机)

统一规划站点目录,适配Laravel项目目录规范:

sudo mkdir -p /data/www/laravel

2. 启动 php7.4-fpm 容器(端口映射+目录挂载),开放 9000 端口映射到宿主机 9074

核心配置:宿主机网站目录与容器目录双向同步,端口仅本地监听,容器开机自启。

项目代码:宿主机 /data/www为所有php项目地址,/data/www/laravel为本项目地址,

public 目录:/data/www/laravel/public

docker run -d \
    --name php74 \
    --restart always \
    -p 127.0.0.1:9074:9000 \
    -v /data/www:/usr/share/nginx/html \
    php:7.4-fpm

参数解释:

  • --name php74:自定义容器名称,方便后续管理操作;

  • --restart always:设置容器开机自启、异常重启,保障服务常驻;

  • -p 127.0.0.1:9074:9000:端口映射,仅允许宿主机本地访问9074端口,杜绝外网非法请求,提升安全性;

  • -v /data/www:/usr/share/nginx/html:目录挂载,宿主机网站代码同步至容器,实现代码实时更新、无需重启容器。

3. 安装常用 PHP 扩展(容器内执行)

进入容器终端,安装Laravel、ThinkPHP必备扩展,包含数据库、文件、加密、Redis等常用组件:

# 进入PHP7.4容器终端
docker exec -it php74 bash

# 更新软件源并安装依赖
apt update && apt install -y libpng-dev libzip-dev libonig-dev

# 安装核心PHP扩展
docker-php-ext-install pdo_mysql mysqli gd zip mbstring bcmath

# 可选:安装Redis扩展(缓存场景必备)
pecl install redis && docker-php-ext-enable redis

# 退出容器
exit

4. 验证 PHP 容器运行正常

确认容器正常启动、端口正常监听,无异常报错:

# 查看PHP容器运行状态
docker ps | grep php74

# 检查宿主机9074端口监听情况
ss -tulpn | grep 9074

正常输出则代表PHP容器部署、端口映射全部成功。

二、配置宿主机 Nginx 站点

1. 新建站点配置文件

在Nginx配置目录下新建Laravel专属站点配置:

sudo nano /usr/local/nginx/conf/conf.d/laravel.conf

写入以下完整可直接使用的配置(适配PHP7.4容器架构,包含伪静态、缓存、安全限制):

server {
    listen 80;
    server_name 域名.com; # 替换为自己的域名
    root /data/www/laravel/public;
    index index.php index.html index.htm;

    # 日志文件配置
    access_log /var/log/nginx/php74-laravel-access.log;
    error_log /var/log/nginx/php74-laravel-error.log;

    # 伪静态,Laravel/ThinkPHP通用伪静态规则
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # 静态资源缓存配置(提升访问速度)
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
        access_log        off;
        log_not_found     off;
        expires           1d;
    }

    # PHP动态请求转发核心配置
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9074; # 和docker映射端口对应
        fastcgi_index index.php;
        # 必须填写容器内绝对路径(核心容错点)
        # /usr/share/nginx/html为容器目录
        # 目录/usr/share/nginx/html/laravel/public对应宿主机/data/www/laravel/public
        fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/laravel/public$fastcgi_script_name;
        include fastcgi_params;
    }

    # 禁止访问 .htaccess
    location ~ /\.ht {
        deny all;
    }
}

2. 检查 Nginx 配置语法 + 重载

# 校验Nginx配置语法
sudo /usr/local/nginx/sbin/nginx -t
# 平滑重载Nginx配置
sudo /usr/local/nginx/sbin/nginx -s reload

五、PHP环境可用性测试

1. 创建 phpinfo 测试文件

echo "<?php phpinfo(); ?>" | sudo tee /data/www/info.php

2. 浏览器访问

访问地址:http://域名.com/info.php,页面正常显示 PHP 7.4.x 版本信息、已安装扩展列表,即代表整套环境配置成功。

六、高频报错排错方案(必看)

1. 报错 File not found

故障原因:Nginx转发的脚本路径与容器内路径不匹配

解决方案:严格使用本文配置,SCRIPT_FILENAME 必须填写容器内路径/usr/share/nginx/html/laravel/public,不可填写宿主机路径。

2. 报错:502 Bad Gateway

常见原因&修复

  • PHP容器未启动:执行 docker restart php74 重启容器;

  • 端口映射不匹配:确认Nginx转发端口为9074,与Docker映射端口一致;

  • 端口访问异常:本端口仅本地监听,无需放行外网防火墙,无需额外配置。

3. 报错:文件读写失败(权限不足)

故障原因:容器内www-data用户UID与宿主机用户权限不统一

解决方案:统一站点目录权限,生产环境必备:

# 生产环境建议修改容器www-data uid和宿主机统一
sudo chown -R www-data:www-data /data/www/laravel

七、环境常用管理命令

# 重启PHP7.4容器
docker restart php74

# 查看PHP容器运行日志(排错专用)
docker logs php74

# 进入PHP容器终端
docker exec -it php74 bash

# 重启Nginx服务(两种方式)
sudo systemctl restart nginx
# 或
/usr/local/nginx/sbin/nginx -s stop && /usr/local/nginx/sbin/nginx

八、多站点扩展方案

如需部署多个PHP站点,无需新建PHP容器,可共用当前php74容器:

  1. 在宿主机 /data/www/ 目录下新建其他项目站点目录;

  2. 新建独立Nginx配置文件,修改 server_name 域名和 root 站点根目录;

  3. PHP转发端口统一使用 127.0.0.1:9074,复用现有容器解析服务。

该方案可实现单容器支撑多PHP站点,节省服务器资源,统一环境版本。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐