在 Ubuntu 上配置 PHP 安全,通常从 PHP 本身配置、Web 服务器配合、权限控制、运行环境隔离 等多个方面入手。下面给你一套生产环境常用、可落地的 PHP 安全配置指南(适用于 Ubuntu 20.04/22.04/24.04)。
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php8.2 php8.2-fpm php8.2-mysql php8.2-curl php8.2-mbstring php8.2-xml
✅ 永远不要使用 Ubuntu 自带的老版本 PHP
php --ini
常见路径:
/etc/php/8.2/fpm/php.ini
/etc/php/8.2/cli/php.ini
Web 环境一定要改 FPM 的 php.ini
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
sudo mkdir -p /var/log/php
sudo chown www-data:www-data /var/log/php
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,dl,show_source,php_uname
⚠️ 如果某些函数你确实需要(如 exec),可酌情移除
allow_url_fopen = Off
allow_url_include = Off
expose_php = Off
file_uploads = On
upload_max_filesize = 5M
post_max_size = 6M
max_file_uploads = 5
max_execution_time = 30
max_input_time = 30
memory_limit = 128M
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
session.use_only_cookies = 1
session.gc_maxlifetime = 1440
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
修改:
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
✅ 一个站点一个 pool(推荐)
php_admin_value[open_basedir] = /var/www/site1:/tmp
pm.status_path = /status
ping.path = /ping
并在 Nginx 中限制访问:
location ~ ^/(status|ping)$ {
allow 127.0.0.1;
deny all;
}
location ~* ^/(uploads|images)/.*\.php$ {
deny all;
}
location ~ /\. {
deny all;
}
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;
chmod 777 /var/www/html
sudo chown -R www-data:www-data /var/www
sudo chmod -R 755 /var/www
上传目录禁止执行
chmod 755 uploads
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
sudo aa-status
✅ 不要关闭,必要时配置 PHP-FPM profile
sudo apt update && sudo apt upgrade -y
查看 PHP 日志:
tail -f /var/log/php/error.log
✅ Ubuntu
✅ Nginx
✅ PHP-FPM
✅ HTTPS
✅ open_basedir
✅ disable_functions
✅ 非 root 用户
✅ 定期更新
| 项目 | 是否 |
|---|---|
| expose_php = Off | ✅ |
| display_errors = Off | ✅ |
| disable_functions | ✅ |
| open_basedir | ✅ |
| HTTPS | ✅ |
| 上传目录不可执行 | ✅ |
| 非 root 运行 | ✅ |
如果你愿意,我可以:
你现在用的是 Ubuntu + Nginx 还是 Apache?PHP 版本是多少?