Nginx 转发PHP
安装PHP
编译安装PHP
下载PHP源码包
bash
wget https://www.php.net/distributions/php-8.2.18.tar.gz
tar zxvf php-8.2.18.tar.gz -C /usr/src创建程序用户
bash
useradd -Ms /sbin/noligin www预配置
bash
cd php-8.2.18
./configure --prefix=/usr/local/php-fpm \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-zlib \
--with-curl \
--enable-mbstring \
--with-xsl \
--with-gd \
--with-jpeg \
--with-freetype \
--enable-opcache编译安装
bash
make -j$(nproc) && make install复制模板文件
bash
cp php.ini-production /usr/local/php-fpm/lib/php.ini
cp /usr/local/php-fpm/etc/php-fpm.conf.default /usr/local/php-fpm/etc/php-fpm.conf
cp /usr/local/php-fpm/etc/php-fpm.d/www.conf.default /usr/local/php-fpm/etc/php-fpm.d/www.conf创建必要的目录和权限
bash
mkdir -p /var/log/php-fpm
touch /var/log/php-fpm/error.log
touch /var/log/php-fpm/slow.log
touch /var/log/php-fpm/php_errors.log
chown -R www:www /var/log/php-fpm
mkdir -p /var/run/php-fpm
chown -R www:www /var/run/php-fpmyum安装PHP
bash
# CentOS 或 RHEL
dnf -y install php php-fpm php-cli
# Ubuntu
sudo apt update
sudo apt -y install php php-fpm php-cliPHP-FPM优化配置
php-fpm.conf 优化
编辑/usr/local/php-fpm/etc/php-fpm.conf文件
ini
[global]
; 错误日志设置
error_log = /var/log/php-fpm/error.log
log_level = warning
; 紧急情况下重启
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
; 系统资源限制
rlimit_files = 65535
rlimit_core = 0www.conf 优化
编辑/usr/local/php-fpm/etc/php-fpm.d/www.conf文件
ini
[www]
; 用户和组设置
user = www
group = www
; 监听方式 (推荐使用unix socket)
listen = 127.0.0.1:9000
# listen = /var/run/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660
; 进程管理配置
pm = dynamic
# pm.max_children = (可用内存 - 系统保留内存) / 单个PHP进程内存占用
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 1000
; 性能调优
request_terminate_timeout = 30s
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log
; 环境变量
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmpPHP.ini 优化
ini
; 错误报告设置
display_errors = Off
log_errors = On
error_log = /var/log/php-fpm/php_errors.log
; 资源限制
max_execution_time = 30
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 32M
; OPcache配置
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=0
; 安全相关配置
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
expose_php = Off配置Nginx支持PHP
nginx
server {
listen 80;
server_name your_domain.com www.your_domain.com;
root /var/www/your_domain;
index index.php index.html index.htm;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# 根据你的 PHP 版本调整路径
fastcgi_pass 127.0.0.1:9000
# fastcgi_pass unix:/var/run/php/php7.x-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ =404;
}
}创建PHP-FPM Systemd服务文件
创建/etc/systemd/system/php-fpm.service文件
ini
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=notify
PIDFile=/var/run/php-fpm.pid
ExecStart=/usr/local/php-fpm/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php-fpm/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
; 生产环境推荐的安全配置
PrivateTmp=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true
RestrictRealtime=true
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
RestrictNamespaces=true
CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_FOWNER CAP_SETGID CAP_SETUID CAP_SYS_PTRACE CAP_KILL CAP_NET_BIND_SERVICE
LimitNOFILE=65535
LimitNPROC=65535
LimitSTACK=infinity
TimeoutStartSec=5
TimeoutStopSec=5
[Install]
WantedBy=multi-user.target启动PHP-FPM服务
bash
# 启动服务
systemctl start php-fpm
# 停止服务
systemctl stop php-fpm
# 重启服务
systemctl restart php-fpm
# 重新加载配置
systemctl reload php-fpm
# 查看服务状态
systemctl status php-fpm
# 查看日志
journalctl -u php-fpm -f测试PHP代码
php
<?php
phpinfo();
?>