下面从系统层、PHP-FPM 层、PHP 层、运维层四个维度,给你一份在 Ubuntu 上安全加固 php-fpm的实用清单(以 Ubuntu 20.04/22.04 + PHP 8.x 为例,其他版本思路一致)。
不要使用 www-data 跑所有站点。
sudo adduser --disabled-login --no-create-home phpapp1
php-fpm pool 配置:
[app1]
user = phpapp1
group = phpapp1
listen.owner = www-data
listen.group = www-data
/etc/php/8.1/fpm/pool.d/app1.conf
/etc/php/8.1/fpm/pool.d/app2.conf
避免一个站点被攻破影响全部。
listen = /run/php/php8.1-fpm-app1.sock
listen.mode = 0660
不要用 listen = 9000 暴露端口。
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
防止 Dos / 资源耗尽。
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
如业务需要,逐个开放。
编辑 php.ini:
expose_php = Off
display_errors = Off
log_errors = On
allow_url_fopen = Off
allow_url_include = Off
enable_dl = Off
file_uploads = On
upload_tmp_dir = /var/www/uploads_tmp
open_basedir = /var/www/app1:/tmp
sudo phpdismod sockets sysvsem
/var/www/app1 755
/var/www/app1/public 755
storage/cache 750 (phpapp1:phpapp1)
location ~* /uploads/.*\.php$ {
deny all;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm-app1.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
仅允许 index.php 入口:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
/var/log/php8.1-fpm.log
/var/log/nginx/access.log
建议:
disable_functions 是否被绕过apt update && apt upgradechrootuser = app1
group = app1
listen = /run/php/php8.1-fpm-app1.sock
listen.mode = 0660
disable_functions = exec,shell_exec,system
pm.max_children = 20
expose_php = Off
display_errors = Off
open_basedir = /var/www/app1:/tmp
如果你愿意,我可以:
你现在是哪种使用场景?