在 Fedora 上安装 PHP:php-fpm 与 Web 服务器对接
Fedora 上的 PHP 来自发行版仓库,不需要加第三方源。F45 里是 PHP 8.5,装完就能用。
sudo dnf install php php-fpm php-cli| 包 | 作用 | 不装会怎样 |
|---|---|---|
php | 元包,带上常用扩展 | 只有裸 CLI |
php-cli | 命令行解释器 | php 命令不存在 |
php-fpm | FastCGI 进程管理器 | 只能跑 CLI,不能给 Web 用 |
F45 实测版本:
php-8.5.12-1.fc45.x86_64先验证 CLI
Section titled “先验证 CLI”php -vPHP 8.5.12 (cli) (built: Oct 19 2026 17:02:46) (NTS gcc x86_64)Copyright (c) The PHP Group看装了多少扩展:
php -m | grep -cE "^[a-z]"35配置文件读的是哪个——这条比什么都重要,很多人改错文件:
php --iniConfiguration File (php.ini) Path: "/etc"Loaded Configuration File: "/etc/php.ini"Scan for additional .ini files in: "/etc/php.d"所以:主配置 /etc/php.ini,扩展的开关放 /etc/php.d/*.ini。改完 CLI 立即生效,php-fpm 要重启。
php-fpm 默认是停的
Section titled “php-fpm 默认是停的”php-fpm -vsystemctl is-enabled php-fpmPHP 8.5.12 (fpm-fcgi) (built: Oct 19 2026 17:02:46) (NTS gcc x86_64)disabled装完不等于启动。要手动开:
sudo systemctl enable --now php-fpmsystemctl status php-fpm --no-pager它的池配置在 /etc/php-fpm.d/:
ls /etc/php-fpm.d/www.confwww.conf 里的 listen = 决定它听 Unix socket 还是 TCP 端口——nginx 配错一半的锅都在这里。
接 nginx
Section titled “接 nginx”sudo dnf install nginxsudo tee /etc/nginx/conf.d/php.conf >/dev/null <<'EOF'server { listen 80; server_name _; root /usr/share/nginx/html; index index.php index.html;
location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/www.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }}EOFsudo systemctl enable --now nginx php-fpm写个探针:
echo '<?php phpinfo();' | sudo tee /usr/share/nginx/html/info.phpcurl -s http://127.0.0.1/info.php | head -5能出 HTML 就通了。看完记得删掉 info.php。
接 httpd(Apache)
Section titled “接 httpd(Apache)”sudo dnf install httpd phpsudo systemctl enable --now httpdecho '<?php echo PHP_VERSION;' | sudo tee /var/www/html/v.phpcurl -s http://127.0.0.1/v.phphttpd 走 mod_php 时不需要 php-fpm;nginx 则必须有 php-fpm。
sudo dnf search php- | grep -i mysql # 先找包名sudo dnf install php-mysqlnd php-gd php-opcachesudo systemctl restart php-fpm装完用 php -m 确认模块出现。扩展是独立 RPM,不是 pecl install——Fedora 用发行版打包的方式,升级时才不会被覆盖丢。
Remi 与多版本 PHP
Section titled “Remi 与多版本 PHP”Fedora 自己只给一个 PHP(8.5.12),要多版本靠 Remi 的 module stream,不是另装一个包名。
先装 Remi 的 release 包:
sudo dnf install -y https://rpms.remirepo.net/fedora/remi-release-45.rpm它落的仓库文件是 remi-cn.repo(阿里云镜像),且默认 disabled:
[remi-cn]baseurl=https://mirrors.aliyun.com/remi/fedora/45/remi/x86_64/enabled=0看有哪些版本可选:
dnf module list php --enablerepo=remi-cnName Stream Profiles Summaryphp remi-8.2 common [d], devel, minimal PHP scripting languagephp remi-8.3 common [d], devel, minimal PHP scripting languagephp remi-8.4 common [d], devel, minimal PHP scripting languagephp remi-8.5 common [d], devel, minimal PHP scripting languagephp remi-8.6 common [d], devel, minimal PHP scripting language五个版本(8.2 / 8.3 / 8.4 / 8.5 / 8.6)都是流,不是并行包。 同一时间只能启用一个。
切到 PHP 8.4
Section titled “切到 PHP 8.4”sudo dnf module enable -y php:remi-8.4 --enablerepo=remi-cn启用后仓库里可用的 php 变成:
8.4.27-1.module_php.8.4.fc45.remi再同步系统已装的 php:
sudo dnf distro-sync --enablerepo=remi-cn实测这次同步会把系统的 php 8.5.12 换成 8.4.27,来源从 fedora 变成 remi-modular:
php x86_64 0:8.4.27-1.module_php.8.4.fc45.remi remi-modular 5.3 MiB replacing php x86_64 0:8.5.12-1.fc45 fedoraphp-cli x86_64 0:8.4.27-1.module_php.8.4.fc45.remi remi-modular 10.6 MiB replacing php-cli x86_64 0:8.5.12-1.fc45 fedora回退:
sudo dnf module reset -y phpsudo dnf distro-sync| 现象 | 原因 |
|---|---|
| 浏览器下载了 php 文件 | nginx 没配 location ~ \.php$,或 fastcgi 没通 |
502 Bad Gateway | php-fpm 没启动,或 socket 路径不一致 |
| 改了 php.ini 无效 | 改的是 CLI 的,fpm 需要 systemctl restart php-fpm |
扩展装了但 php -m 没有 | 装的是别的版本前缀(如 php84-php-*) |
- Fedora 仓库与 dnf5 — 装包与仓库
- systemd 服务与定时器 — php-fpm 为什么默认不启动
- 防火墙 firewalld — 放行 80/443
- SELinux — 改 root 目录后要
restorecon - 官方:PHP