پرش به محتوا

Nginx با PHP-FPM و pool اختصاصی برای هر سایت

هر سایت PHP را با کاربر لینوکسی و pool جداگانه‌ی PHP-FPM اجرا کنید تا نفوذ به یک سایت به سایت‌های دیگر سرایت نکند.

Ubuntu 24.04 LTSسطح: متوسطبرای: Ubuntu 24.04 LTS، Ubuntu 26.04 LTS، Ubuntu 22.04 LTSبه‌روزرسانی: ۱۶ آبان ۱۴۰۵

روی سرورهایی که چند سایت دارند، اجرای همه با کاربر www-data یعنی نفوذ به یک سایت کافی است تا فایل‌های همه‌ی سایت‌ها در دسترس باشد. راه‌حل: کاربر و pool جدا برای هر سایت.

۱. نصب

bash
sudo apt update
sudo apt install -y nginx php-fpm php-mysql php-xml php-mbstring php-curl php-intl
PHPV=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')

۲. کاربر سایت

bash
sudo useradd -r -m -d /var/www/shop -s /usr/sbin/nologin shop
sudo mkdir -p /var/www/shop/public
sudo chown -R shop:shop /var/www/shop
sudo chmod 750 /var/www/shop
sudo usermod -aG shop www-data     # Nginx فقط برای خواندن فایل‌های استاتیک

۳. pool اختصاصی

bash
sudo nano /etc/php/$PHPV/fpm/pool.d/shop.conf
ini
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
listen.owner = www-data
listen.group = www-data
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 30s
php_admin_value[open_basedir] = /var/www/shop:/tmp
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen
bash
sudo systemctl reload php$PHPV-fpm
ls -l /run/php/shop.sock

۴. سایت در Nginx

nginx
server {
    listen 80;
    server_name shop.example.ir;
    root /var/www/shop/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/shop.sock;
    }

    location ~ /\.(?!well-known) { deny all; }
}
bash
sudo nano /etc/nginx/sites-available/shop.example.ir
sudo ln -s /etc/nginx/sites-available/shop.example.ir /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

۵. بررسی

bash
echo '<?php echo get_current_user();' | sudo -u shop tee /var/www/shop/public/who.php
curl -s -H 'Host: shop.example.ir' http://127.0.0.1/who.php    # باید shop چاپ شود
sudo rm /var/www/shop/public/who.php