انجیناکس؛ شب ۳۲: server block کامل WordPress و جلوگیری از اجرای upload
فهرست نوشته
Nginx فایل PHP را اجرا نمیکند؛ مسیر درست فایل را با FastCGI به PHP-FPM میفرستد. امشب WordPress، permalink و رسانه را فعال میکنیم و اجرای فایل بارگذاریشده را میبندیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: فایلها و database شب ۳۱، گواهی شب ۱۱ شامل wp.nginx.test و socket درست شاخهٔ توزیع. آزمایش از کلاینت مجاز با CA معتبر انجام میشود.
فایل سایت#
این server کامل را در $WP_CONF قرار بده؛ در Debian/Ubuntu symlink هم بساز. برای HTTP فقط redirect ثابت به همین نام و مسیر ACME را طبق شب ۱۳ در server جدا قرار بده. قالب زیر از syntax مشترک TLS استفاده میکند؛ HTTP/2 را طبق نسخهٔ شب ۱۴ اضافه کن.
server {
listen 443 ssl;
server_name wp.nginx.test;
ssl_certificate /etc/nginx/tls/web.crt;
ssl_certificate_key /etc/nginx/tls/web.key;
ssl_protocols TLSv1.2 TLSv1.3;
include /etc/nginx/snippets/lab-headers.conf;
root /var/www/nginx-wordpress/public;
index index.php;
client_max_body_size 16m;
location / {
try_files $uri $uri/ /index.php?$args;
}
location = /wp-config.php { deny all; }
location ~ /\. { deny all; }
location ~* ^/wp-content/uploads/.*\.(php[0-9]*|phtml|phar)(\.|$) {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi.conf;
fastcgi_pass unix:/run/php/nginx-wp.sock;
fastcgi_read_timeout 30s;
}
}
در Alma/Rocky فقط fastcgi_pass را به unix:/run/php-fpm/nginx-wp.sock تغییر بده. پیش از استفاده fastcgi.conf توزیع را بخوان؛ باید SCRIPT_FILENAME برابر $document_root$fastcgi_script_name و پارامتر HTTPS داشته باشد. نمونهٔ توزیع را با فایل غیرمرتبط عوض نکن و SCRIPT_FILENAME را دوبار تعریف نکن.
قاعدهٔ upload پیش از regex عمومی PHP است. برای uploads یک location با ^~ نساز که جستوجوی regexهای منع اجرا را کنار بزند. Nginx فایل .htaccess را پردازش نمیکند؛ قواعد Apache بهصورت خودکار اعمال نمیشوند.
نصب و آزمون#
بعد از nginx -t و reload، مرورگر کلاینت ۲۰ را با CA آزمایشگاه به https://wp.nginx.test/ ببر. نصب را با نام مدیر مخصوص آزمایشگاه و رمز قوی کامل کن. یک نوشته و permalink، ورود/خروج و یک تصویر را بررسی کن.
روی سرور یک probe بیخطر بساز و بعد از آزمون حذف کن:
printf '%s\n' '<?php echo "fpm-fcgi-check";' | sudo tee /var/www/nginx-wordpress/public/fpm-probe.php >/dev/null
printf '%s\n' '<?php echo "upload-must-not-run";' | sudo tee /var/www/nginx-wordpress/public/wp-content/uploads/probe.php >/dev/null
probe اول باید فقط متن fpm-fcgi-check بدهد؛ probe در uploads باید 403 و فایل PHP ناموجود 404 باشد. در Snapshot آزمایشگاهی FPM را متوقف کن: probe اول باید 5xx بدهد و هرگز سورس PHP را برنگرداند. سرویس را فوراً برگردان، دو probe را حذف و با درخواست جدید حذف آنها را تأیید کن.
عیبیابی: 502 را با permission/socket، خطای PHP را با journal FPM، permalink را با try_files و label upload را با AVC بررسی کن. توقف FPM را روی سایت واقعی اجرا نکن.
بازگشت: WP_CONF قبلی و FPM فعال را برگردان، سپس اعتبارسنجی و reload؛ database نصبشده را نگه دار.
منبع: FastCGI ، WordPress روی Nginx .