laravel 9 在 opensuse 15.4 部署需强制升级 php 至 8.1+:添加 devel:languages:php:php81 仓库,安装 php81 及扩展,配置 php81-fpm socket 路径与 nginx 匹配,用 php81 调用 composer,并正确授权 wwwrun 用户及设置 opcache.revalidate_freq=0。

OpenSUSE 15.4 默认仓库的 PHP 版本是 7.4,而 Laravel 9 强制要求 PHP 8.0.2+(官方推荐 8.1 或 8.2),所以直接 zypper install php 会失败或装错版本——这是部署卡住的第一道坎。
安装 PHP 8.1 并启用必要扩展
openSUSE 15.4 的官方 PHP 8.1 来自 devel:languages:php:php81 仓库,不能跳过这步手动添加:
- 运行
sudo zypper ar -f https://download.opensuse.org/repositories/devel:/languages:/php:/php81/openSUSE_15.4/ php81 - 刷新并安装:
sudo zypper ref && sudo zypper install php81 php81-fpm php81-mysqlnd php81-mbstring php81-xml php81-opcache php81-curl php81-gd php81-bcmath php81-zip php81-tokenizer php81-json - 确认启用:
php81 -m | grep -E "mbstring|xml|json|tokenizer|pdo"—— 若报错“command not found”,说明没设 alias,可执行sudo update-alternatives --install /usr/bin/php php /usr/bin/php81 81后再试
配置 PHP-FPM 与 Nginx 协同工作
openSUSE 的 php81-fpm 默认不自动启动,且 socket 路径和权限与 Ubuntu/Debian 不同,容易导致 502 Bad Gateway:
- 启用服务:
sudo systemctl enable php81-fpm && sudo systemctl start php81-fpm - 检查 socket 文件位置:
ls /var/run/php/php81-fpm.sock(不是/run/php/...) - Nginx 配置中必须匹配该路径:
fastcgi_pass unix:/var/run/php/php81-fpm.sock; - 确保 Nginx 用户(通常是
wwwrun)对 socket 有读写权限:sudo chown root:wwwrun /var/run/php/php81-fpm.sock && sudo chmod 660 /var/run/php/php81-fpm.sock
composer install --no-dev 失败常见原因
在 openSUSE 上跑 composer install --no-dev --optimize-autoloader 报错,大概率不是网络问题,而是 PHP CLI 使用了旧版 PHP(如系统默认的 7.4):
- 验证当前 CLI 版本:
php -v,如果不是 8.1,请用php81 -v显式调用 - Composer 默认调用
php命令,所以要么改 alias,要么直接用:php81 /usr/bin/composer install --no-dev --optimize-autoloader - 若提示
ext-mbstring缺失,说明php81-mbstring没装全或未启用:检查/etc/php81/cli/php.ini中是否含extension=mbstring,没有就手动加一行
APP_ENV=production 下 storage 权限容易被忽略
openSUSE 默认使用 wwwrun:www 用户组组合,而非 Ubuntu 的 www-data,chown -R www-data:www-data storage 会静默失败:
- 查 Web 服务器用户:
ps aux | grep nginx | head -1 | awk '{print $1}'(通常为wwwrun) - 正确授权:
sudo chown -R wwwrun:www storage bootstrap/cache - 设置目录权限:
sudo chmod -R 775 storage bootstrap/cache(注意不是 755,否则队列、日志写入会失败) - 如果用了 Horizon 或 Telescope,还需确保
storage/logs和storage/framework下子目录可写
openSUSE 的 SELinux 替代品是 AppArmor,但 15.4 默认禁用;真正常被漏掉的是 php81-opcache 的 opcache.revalidate_freq=0 在 production 下必须设为 0,否则缓存不会随代码更新自动失效——这个值在 /etc/php81/conf.d/opcache.ini 里,别只改 cli 的配置而忘了 fpm 的。











