روی سرورهایی که چند سایت دارند، اجرای همه با کاربر www-data یعنی نفوذ به یک سایت کافی است تا فایلهای همهی سایتها در دسترس باشد. راهحل: کاربر و pool جدا برای هر سایت.
۱. نصب
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;')۲. کاربر سایت
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 اختصاصی
sudo nano /etc/php/$PHPV/fpm/pool.d/shop.conf[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,popensudo systemctl reload php$PHPV-fpm
ls -l /run/php/shop.sock۴. سایت در 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; }
}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۵. بررسی
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