文章目录
一直以为部署php很简单,实操撞的一头包,世间无易事,劝君多勉之。
部署步骤
1、安装依赖
bash
安装epel源与remi源:
yum install epel-release -y
yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
安装nginx和php-fpm:
yum install nginx php-fpm php-mysqlnd php-gd php-json php-mbstring php-xml php-zip -y
设置开机自启动:
systemctl start nginx php-fpm
systemctl enable nginx php-fpm
2、创建文件夹及文件
(1)创建文件夹
bash
mkdir /data/php-demo;
(2)创建文件/data/php-demo/index.php,内容:
php
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>VSCode PHP Demo</title>
<style>
body { font-family: sans-serif; padding: 20px; background: #f4f4f9; }
.card { background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
</style>
</head>
<body>
<div class="card">
<h1>🚀 欢迎使用 VSCode 开发 PHP</h1>
<p>当前服务器时间:<?php echo date('Y-m-d H:i:s'); ?></p>
<p>你的 IP 地址是:<?php echo $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1'; ?></p>
</div>
</body>
</html>
(3)授权
bash
chown -R apache:apache /data/php-demo
chmod -R 755 /data/php-demo
3、php-fpm配置
(1)vim /etc/php-fpm.d/www.conf编辑配置文件。
(2)以下配置项都要逐一核对保证正确:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
user |
apache |
保持默认即可,确保与目录属主一致 |
group |
apache |
保持默认即可 |
listen |
/run/php-fpm/www.sock |
使用 Socket 通信比 TCP (127.0.0.1:9000) 性能更好 |
listen.owner |
nginx |
重要! 让 Nginx 用户有权访问这个 Socket |
listen.group |
nginx |
重要! 同上 |
security.limit_extensions |
.php |
限制只能解析 .php 文件,防止恶意脚本执行 |
| (3)检查并注释掉干扰项 |
bash
;php_admin_value[doc_root] = ... <-- 必须注释掉,否则路径会被锁死
;chroot = ... <-- 必须注释掉,除非你非常精通沙箱配置
;php_admin_value[open_basedir] = ... <-- 建议注释掉,或确保包含你的项目路径
(4)重启php-fpm服务
bash
systemctl restart php-fpm
4、nginx配置
(1)编辑定制配置文件vim /etc/nginx/conf.d/php-demo.conf,内容为:
python
server {
listen 80;
server_name 具体的服务器ip; # 替换为你的IP或域名
root /data/php-demo; # 网站根目录
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
# PHP 解析配置
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock; # 对应 PHP-FPM 的 listen 配置
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 关键:传递正确路径
include fastcgi_params;
}
}
(2)检查并重启nginx
bash
nginx -t # 检查语法
systemctl reload nginx
5、验证
浏览器输入http://具体的服务器ip/index.php,展示定制页面内容表示成功。
php-fpm文件的位置
| 类别 | 文件/目录路径 | 作用与说明 |
|---|---|---|
| 主配置文件 | /etc/php-fpm.conf |
全局配置入口。定义进程管理方式(如 pm = dynamic)、PID 文件路径、错误日志级别等基础参数。通常包含子配置目录。 |
| 进程池配置 | /etc/php-fpm.d/www.conf |
最核心的配置文件。定义具体服务池(如 www)的参数,包括监听地址(Socket/TCP)、运行用户/组、以及安全限制(如 security.limit_extensions)。 |
| PHP 运行时配置 | /etc/php.ini |
PHP 解释器的全局配置。控制脚本运行行为,如内存限制、上传大小、时区设置等。PHP-FPM 启动时会加载此文件。 |
| 全局错误日志 | /var/log/php-fpm/error.log |
记录 PHP-FPM 主进程的系统级事件。若服务无法启动或崩溃,首先检查此文件。 |
| 慢查询日志 | /var/log/php-fpm/slow.log |
记录执行时间超过阈值(request_slowlog_timeout)的脚本调用栈。用于排查性能瓶颈和代码卡顿问题。 |
| Systemd 服务单元 | /usr/lib/systemd/system/php-fpm.service |
定义服务的启动命令、依赖关系及资源限制。使用 systemctl 管理服务时的依据文件。 |
| Unix Socket 文件 | /run/php-fpm/www.sock (或 /var/run/...) |
Nginx 与 PHP-FPM 通信的"管道"文件。Nginx 配置中的 fastcgi_pass 需指向此路径(若使用 Socket 模式)。 |
www.conf配置参数
php-fpm有好几个配置文件,这里说的是/etc/php-fpm.d/www.conf这个文件的配置参数。
| 参数名称 | 作用与说明 |
|---|---|
| 基础运行参数 | |
user |
指定 PHP-FPM 子进程运行的系统用户。通常设置为与 Web 服务器(如 Nginx 或 Apache)一致的用户,以确保对网站目录有正确的读写权限。 |
group |
指定 PHP-FPM 子进程运行的系统用户组。 |
listen |
设置 PHP-FPM 监听的地址。支持 TCP 地址(如 127.0.0.1:9000)或 Unix 域套接字路径(如 /run/php-fpm/www.sock)。Unix Socket 在同机通信时性能更优。 |
listen.owner / listen.group |
当使用 Unix Socket 通信时,设置该套接字文件的属主和属组。必须与 Web 服务器(如 Nginx)的运行用户保持一致,否则会导致 502 Bad Gateway 错误。 |
| 进程池管理参数 (pm) | |
pm |
设置进程管理器的模式。可选值:static(固定数量的子进程)、dynamic(根据负载动态调整子进程数量)、ondemand(按需启动子进程,适合低流量站点)。 |
pm.max_children |
允许同时存活的最大子进程数。用于控制并发处理能力,防止服务器资源(如内存)被耗尽。 |
pm.start_servers |
仅在 dynamic 模式下生效。设置 PHP-FPM 启动时初始创建的子进程数量。 |
pm.min_spare_servers |
仅在 dynamic 模式下生效。保证系统中空闲子进程的最小数量。若低于此值,主进程会自动创建新子进程。 |
pm.max_spare_servers |
仅在 dynamic 模式下生效。保证系统中空闲子进程的最大数量。若高于此值,主进程会自动清理多余的子进程。 |
pm.max_requests |
设置每个子进程在被回收并重启之前所能处理的最大请求数。常用于防止第三方模块导致的内存泄漏问题,设为 0 表示不限制。 |
| 请求控制与安全参数 | |
request_terminate_timeout |
设置单个请求的最大执行时间(秒)。超时后该请求将被强制终止,常用于防止长时间运行的脚本阻塞进程或导致 502 错误。 |
request_slowlog_timeout |
设置慢日志记录的超时阈值。当请求执行时间超过此值时,PHP-FPM 会将该请求的调用栈记录到慢日志中,用于排查性能瓶颈。 |
slowlog |
指定慢请求日志文件的存放路径。需与 request_slowlog_timeout 配合使用。 |
security.limit_extensions |
安全限制参数。限制 PHP-FPM 仅允许解析指定后缀的文件(如 .php),以防止恶意文件被当作 PHP 脚本执行。 |
catch_workers_output |
设置是否捕获子进程的标准输出和错误输出。设为 yes 时,PHP 脚本中的 echo 或报错信息会被重定向到 PHP-FPM 的错误日志中,便于调试。 |
| PHP 运行时覆盖参数 | |
php_admin_value |
为当前进程池设置 PHP 配置项(如 open_basedir、sendmail_path)。此设置会强制覆盖全局 php.ini 中的对应值,且无法被 PHP 脚本中的 ini_set() 函数修改。 |
php_admin_flag |
与 php_admin_value 类似,但专门用于设置布尔类型的 PHP 配置项(如 log_errors = on、display_errors = off)。 |