learn

نصب LEMP روی Ubuntu؛ بخش دوم: اتصال Nginx به PHP-FPM

ساخت Server Block، تشخیص سوکت PHP-FPM، تست PHP، HTTPS و عیب‌یابی 502 در Nginx؛ ادامه عملی راهنمای LEMP بدون حذف تنظیمات سایت‌های دیگر.

بعد از نصب اجزای LEMP، باید Nginx درخواست PHP را به سرویس PHP-FPM درست بفرستد. برای این کار یک Server Block مستقل بسازید، مسیر Document Root و سوکت FPM را تعیین و قبل از reload نحو پیکربندی را تست کنید. این بخش ادامه راهنمای نصب Nginx، MySQL و PHP است.

۱. نسخه PHP و سوکت فعال را مشخص کنید

ls -l /run/php/
systemctl list-units --type=service 'php*-fpm.service'
grep -R '^listen =' /etc/php/*/fpm/pool.d/

نمونه این مقاله /run/php/php8.3-fpm.sock است. روی Ubuntu 22.04 یا نصب چندنسخه‌ای ممکن است نام متفاوت باشد؛ نمونه را با خروجی واقعی عوض کنید. از فعال‌بودن FPM و دسترسی کاربر Nginx به سوکت مطمئن شوید.

۲. پوشه و فایل سایت را بسازید

sudo install -d -m 0755 /var/www/example.com/public
sudo nano /var/www/example.com/public/index.html

یک متن آزمایشی مشخص در فایل بگذارید. در این مرحله سایت ساده و فقط‌خواندنی است؛ در پروژه واقعی مالک فایل‌ها باید با روش استقرار هماهنگ باشد. مجوز نوشتن کل پوشه را به همه کاربران ندهید.

۳. تنظیم Server Block

فایل /etc/nginx/sites-available/example.com را با محتوای زیر بسازید:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ =404;
    }

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

    location ~ /\. {
        deny all;
    }

    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;
}

این مثال برای بسته Ubuntu است که فایل snippets/fastcgi-php.conf دارد. نصب از nginx.org ممکن است این فایل را نداشته باشد. نام دامنه، مسیر و سوکت را عوض کنید. قانون فایل‌های نقطه‌دار عمداً دسترسی آن‌ها را می‌بندد؛ اگر از ACME HTTP challenge استفاده می‌کنید، مسیر challenge باید طبق ابزار گواهی استثنا شود.

در این نمونه، قانون فایل‌های نقطه‌دار مسیر /.well-known/ را هم می‌بندد. اگر ابزار گواهی از HTTP-01 استفاده می‌کند، استثنای دقیق challenge را مطابق مستندات همان ابزار و پیش از قاعده منع تنظیم کنید؛ HTTPS را بدون آزمون تمدید تحویل ندهید.

۴. فعال‌سازی و تست

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo nginx -t
sudo systemctl reload nginx
curl -I -H 'Host: example.com' http://127.0.0.1/

اگر لینک از قبل وجود دارد، آن را دوباره نسازید. تنظیم سایت‌های دیگر را حذف نکنید. با Host صحیح می‌توان انتخاب Server Block را مستقل از انتشار DNS آزمایش کرد.

۵. تست اجرای PHP

فایل موقت check-runtime.php را در public با محتوای زیر ایجاد کنید:

<?php
header('Content-Type: text/plain; charset=utf-8');
echo 'PHP is running';

آن را از دامنه درخواست کنید؛ باید فقط متن خروجی دیده شود و نه کد منبع یا دانلود فایل. بعد از تست فایل را پاک کنید. اگر کد PHP دانلود می‌شود، ادامه ندهید: نگاشت location و FastCGI باید پیش از قراردادن فایل‌های حساس اصلاح شود.

۶. HTTPS و نصب برنامه

DNS دامنه را به سرور متصل کنید، گواهی بگیرید و تمدید خودکار را تست کنید. پس از آن HTTP را به HTTPS هدایت کنید. برنامه‌هایی مانند وردپرس برای پیوندهای یکتا به try_files متفاوت نیاز دارند؛ =404 این نمونه را بدون تطبیق برای همه CMSها استفاده نکنید.

رفع خطای 502 و 404

  • 502: سرویس FPM، سوکت، مالکیت سوکت و error log را بررسی کنید.
  • Primary script unknown: root و SCRIPT_FILENAME باید به فایل موجود اشاره کنند.
  • 404 روی همه مسیرها: مسیر public و ServerName را ببینید.
  • سایت اشتباه: تداخل server_name و پیکربندی دامنه در nginx -T را بررسی کنید.

پرسش رایج: آیا .htaccess در Nginx کار می‌کند؟

خیر. Nginx آن را به‌عنوان پیکربندی Apache اجرا نمی‌کند؛ قواعد لازم باید در تنظیم Nginx بازنویسی شوند. بنابراین ساختن فایل .htaccess مشکل permalink روی Nginx را رفع نمی‌کند.

منابع رسمی

بازبینی منابع: ۱۸ اکتبر ۲۰۲۶.

راهنماهای مرتبط

مطالب مرتبط

ارسال نظر

فهرست مطالب