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 .