Skip to content

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-fpm

yum安装PHP

bash
# CentOS 或 RHEL
dnf -y install php php-fpm php-cli

# Ubuntu
sudo apt update
sudo apt -y install php php-fpm php-cli

PHP-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 = 0

www.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] = /tmp

PHP.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();
?>