Ubuntu26.04 使用 Docker 安装 PHP7.4 完整配置方案(适配Laravel/ThinkPHP)
一、部署前置说明:为何采用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容器:
-
在宿主机
/data/www/目录下新建其他项目站点目录; -
新建独立Nginx配置文件,修改
server_name域名和root站点根目录; -
PHP转发端口统一使用
127.0.0.1:9074,复用现有容器解析服务。
该方案可实现单容器支撑多PHP站点,节省服务器资源,统一环境版本。
更多推荐


所有评论(0)