京东云CloudOS 4默认PHP版本低于8.1,不满足Laravel 10要求,需启用Remi源安装PHP 8.2,配置nginx与PHP-FPM Unix socket,修复SELinux上下文及MariaDB socket连接。

京东云 CloudOS 4 是基于 CentOS Stream / Rocky Linux 的企业级操作系统,预装了 nginx、PHP-FPM 和 MariaDB 等组件,但默认不满足 Laravel 10 的最低要求——它自带的 PHP 版本通常是 8.0 或更低,而 Laravel 10 强制要求 PHP >= 8.1。直接部署会卡在 composer create-project 阶段或启动时报 ParseError: syntax error, unexpected token "enum"(因 Laravel 10 大量使用 PHP 8.1+ 的 enum)。
确认并升级 PHP 到 8.1+
CloudOS 4 默认仓库不提供 PHP 8.1+,必须启用 Remi 源:
- 运行
sudo dnf install -y dnf-utils(确保dnf工具就绪) - 启用 Remi PHP 8.2(更稳妥,兼容 Laravel 10 所有特性):
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm - 切换默认 PHP 版本:
sudo dnf module reset php && sudo dnf module enable php:remi-8.2 - 安装完整扩展:
sudo dnf install -y php php-cli php-fpm php-mysqlnd php-opcache php-gd php-xml php-mbstring php-json php-zip php-bcmath php-intl - 验证:
php -v应输出PHP 8.2.x;php -m | grep -E 'mbstring|intl|opcache'必须全部命中
配置 nginx + PHP-FPM 服务
CloudOS 4 的 nginx 默认监听 80 端口,但 PHP-FPM 默认未启用 socket 或正确用户组。关键修改点:
- 编辑
/etc/php-fpm.d/www.conf,确认以下三项:-
user = nginx(不是apache或www-data) group = nginx-
listen = /run/php-fpm/www.sock(推荐 Unix socket,比 TCP 更快且权限可控)
-
- 编辑
/etc/nginx/conf.d/default.conf,替换为 Laravel 标准配置(注意 root 指向public/):location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } - 启动服务:
sudo systemctl enable php-fpm nginx && sudo systemctl restart php-fpm nginx
.env 和权限的两个硬性陷阱
CloudOS 4 默认 SELinux 启用且策略严格,Laravel 的 storage 和 bootstrap/cache 目录常因上下文标签被拒绝写入,表现为 500 错误但无日志。
- 生成密钥前先修复权限:
sudo chown -R nginx:nginx storage bootstrap/cache - 设置 SELinux 上下文:
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/storage(/.*)?"(假设项目在/var/www/html)sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/bootstrap/cache(/.*)?"sudo restorecon -Rv /var/www/html/storage /var/www/html/bootstrap/cache -
.env文件必须由nginx用户可读:sudo chmod 644 .env,否则APP_KEY加载失败导致 CSRF 报错 -
APP_URL必须填公网域名或 IP(如https://oa.example.com),不能是http://localhost——CloudOS 4 通常用于生产环境,且 Chrome 对 localhost 与真实域名的 Cookie 策略不同
数据库连接失败的典型表现与解法
CloudOS 4 的 MariaDB 默认绑定 127.0.0.1,且 skip-networking 可能开启。若 Laravel 报 Connection refused 或 SQLSTATE[HY000] [2002],别急着改 .env:
- 检查 MariaDB 是否监听本地 socket:
sudo ss -lnp | grep mysqld。若只显示/var/lib/mysql/mysql.sock,说明未启用 TCP,应改用 socket 连接 - 在
.env中设:DB_HOST=127.0.0.1→ 改为DB_HOST=/var/lib/mysql/mysql.sock(或留空,Laravel 会自动 fallback 到 socket) - 若坚持用 TCP,编辑
/etc/my.cnf.d/mariadb-server.cnf,在[mysqld]下加:bind-address = 127.0.0.1(不是0.0.0.0)和skip-networking = 0,再sudo systemctl restart mariadb - 确认数据库用户有远程访问权限(即使本地连接,MariaDB 也按 host 匹配):
CREATE USER 'laravel'@'localhost' IDENTIFIED BY 'strongpass'; GRANT ALL ON `laravel_db`.* TO 'laravel'@'localhost'; FLUSH PRIVILEGES;
CloudOS 4 的 SELinux 和 MariaDB socket 默认行为是 Laravel 10 部署中最容易被跳过的两处,它们不会报明确错误,只会让页面空白或路由 404。务必在 php artisan serve 验证通过后再切到 nginx,否则问题叠加难以定位。



















