PHP-FPM (مدیریت فرآیند FastCGI) یک گزینه جایگزین برای اجرای FastCGI مربوط به PHP با برخی از ویژگی‌های اضافی مفید برای سایت‌های با بازدید بالا است. این ابزار، یک روش ترجیحی پردازش صفحات PHP با NGINX است و سریع‌تر از روش‌های سنتی مبتنی بر CGI مانند SUPHP یا mod_php برای اجرای یک اسکریپت PHP عمل می‌کند.

در اینجا، نحوه پیکربندی PHP-FPM با NGINX شرح داده شده است.

 

مزیت اصلی استفاده از PHP-FPM این است که این ابزار در مقایسه با سایر روش‌های اجرای PHP از حافظه و پردازنده بسیار کمتری استفاده می‌نماید. دلیل این امر این است که با ارائه یک اسکریپت CLI برای مدیریت درخواست PHP، آن را به یک فرایند پس زمینه تبدیل می‌کند.

دقت کنید که قبل از دنبال کردن آموزش، باید NGINX و PHP را در سیستم اوبونتو 18.04 خود نصب داشته باشید و با استفاده از کاربر فعال root یا sudo، یک نشست SSH برای سیستم خود باز کنید.

 

این مطلب نیز ممکن است برای شما مفید باشد: بهینه سازی PHP-FPM با هدف افزایش کارایی

 

نصب PHP-FPM

Nginx نمی‌داند که چگونه یک اسکریپت PHP را به تنهایی اجرا نماید. بنابراین، به منظور مدیریت کارآمد اسکریپت‌های PHP به یک ماژول PHP مانند PHP-FPM نیاز دارد. از طرف دیگر، PHP-FPM با ایجاد فرآیند خود، خارج از محیط NGINX اجرا می‌شود. بنابراین هنگامی‌که کاربر صفحه PHP را درخواست می‌کند، سرور nginx درخواست را با استفاده از FastCGI به سرویس PHP-FPM منتقل می‌نماید.

نصب php-fpm در اوبونتو 18.04 به PHP و نسخه آن بستگی دارد. بنابراین قبل از اقدام به نصب FPM در سرور خود، اسناد نصب PHP را بررسی نمایید. با فرض اینکه جدیدترین PHP را نصب داشته باشید، شما می‌توانید FPM را با استفاده از دستور apt-get بصورت زیر نصب کنید.

# apt-get install php7.3-fpm

با پایان نصب، سرویس FPM به طور خودکار راه‌اندازی می‌شود. با استفاده از دستور systemd بصورت زیر می‌توانید آن تأیید نمایید:

# systemctl status php7.3-fpm
● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-02-17 06:29:31 UTC; 30s ago
     Docs: man:php-fpm7.3(8)
 Main PID: 32210 (php-fpm7.3)
   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
    Tasks: 3 (limit: 1152)
   CGroup: /system.slice/php7.3-fpm.service
           ├─32210 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
           ├─32235 php-fpm: pool www
           └─32236 php-fpm: pool www

 

پیکربندی pool (استخر) PHP-FPM

سرویس php-fpm، یک pool پیش فرض ایجاد می‌کند. فایل پیکربندی آن (www.conf) را می‌توانید در پوشه /etc/php/7.3/fpm/pool.d پیدا کنید. شما می‌توانید pool پیش فرض را بر اساس نیاز خود سفارشی نمایید. اما ایجاد یک pool جداگانه برای کنترل بهتر بر روی تخصیص منابع به هر فرآیند FPM، یک روش استاندارد است.

علاوه‌براین، تفکیک FPM pool به آن‌ها امکان می‌دهد تا با ایجاد فرایند اصلی خود، به طور مستقل اجرا شوند. این بدان معناست که هر برنامه PHP را می‌توان با تنظیمات حافظه نهان خود با استفاده از PHP-FPM پیکربندی کرد. به منظور تغییر در پیکربندی یک pool نیازی به راه‌اندازی یا متوقف سازی بقیه poolهای FPM نیست.

بیایید برای اجرای مؤثر یک برنامه PHP از طریق یک کاربر جداگانه، یک FPM ایجاد کنیم. بدین منظور برای شروع، یک کاربر جدید ایجاد نمایید که دارای حقوق انحصاری این pool باشد:

# groupadd wordpress_user
# useradd -g wordpress_user wordpress_user

اکنون به دایرکتوری پیکربندی FPM بروید و یک فایل پیکربندی با استفاده از ویرایشگر متن مورد علاقه خود ایجاد کنید:

# cd /etc/php/7.3/fpm/pool.d
# vi wordpress_pool.conf
[wordpress_site]
user = wordpress_user
group = wordpress_user
listen = /var/run/php7.2-fpm-wordpress-site.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
; Choose how the process manager will control the number of child processes. 
pm = dynamic 
pm.max_children = 75 
pm.start_servers = 10 
pm.min_spare_servers = 5 
pm.max_spare_servers = 20 
pm.process_idle_timeout = 10s

 

گزینه‌های پیکربندی FPM فوق و مقادیر آن‌ها در زیر شرح داده شده است.

[wordpress_site]: نام pool را نشان می‌دهد که باید در تمام نام‌های pool منحصر به فرد باشد.

user و group: کاربر و گروهی را نشان می‌دهد که pool تحت آن اجرا می‌شود.

listen: نام فایل سوکت را برای این pool نشان می‌دهد.

listen.owner و listen.group: باید با کاربر و گروهی که NGINX در آن در حال اجرا است، مطابقت داشته باشد. در اینجا، www-data است.

php_admin_value: تنظیم مقادیر پیکربندی php سفارشی را مجاز می‌کند.

php_admin_flag: تنظیم flagهای بولی PHP را ارائه می‌دهد.

pm: تنظیمات مدیر فرآیند و مقدار آن پویا است؛ بدین معنی که تعداد فرآیندهای فرزند به صورت پویا بر اساس دستورالعمل‌های زیر تنظیم می‌شوند.

pm.max_children: حداکثر تعداد فرزندانی را نشان می‌دهد که می‌توانند همزمان زنده باشند.

pm.start_servers: تعداد فرزندان ایجاد شده در هنگام راه‌اندازی را نشان می‌دهد.

pm.min_spare_servers: حداقل تعداد فرزندان در حالت "idle" (منتظر پردازش) را نشان می‌دهد. اگر تعداد فرآیندهای idle کمتر از این تعداد باشد، تعدادی فرزند ایجاد می‌شوند.

pm.max_spare_servers: حداکثر تعداد فرزندان در حالت “idle” (منتظر پردازش) را نشان می‌دهد. اگر تعداد فرآیندهای idle بیشتر از این تعداد باشد، تعدادی از فرآیندهای فرزند متوقف می‌شوند.

pm.process_idle_timeout: حداکثر تعداد مورد نظر برای فرآیندهای idle سرور را نشان می‌دهد و تنها زمانی استفاده می‌شود که مقدار PM روی دینامیک تنظیم شده باشد.

 

به غیر از تنظیمات فوق، می‌توان تعدادی از متغیرهای محیطی سیستم را با استفاده از چیزی مشابه env ['PHP_FOO'] = $bar به سرویس php-fpm منتقل کرد.

به عنوان مثال، افزودن گزینه‌های زیر در فایل پیکربندی فوق، نام میزبان و مکان پوشه موقت را برای محیط PHP تنظیم می‌کند.

...
...
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
...
...

علاوه‌براین، تنظیمات مدیران فرآیند در فایل پیکربندی pool فوق برروی دینامیک تنظیم شده است. با این حال، شما تنظیماتی را انتخاب کنید که متناسب با نیازتان باشد.

سایر گزینه‌های پیکربندی برای مدیر فرآیند به صورت زیر است:

Static: تعداد معینی از فرایندهای PHP نگهداری خواهد شد.

ondemand: هیچ فرزندی در هنگام راه اندازی ایجاد نمی‌شود. بلکه با دریافت درخواست‌های جدید در سرور، فرزندان ایجاد می‌شوند.

پس از پایان ایجاد فایل پیکربندی فوق، سرویس fpm را مجدداً راه‌اندازی کنید تا تنظیمات جدید اعمال شود:

# systemctl start php7.3-fpm

Pool مربوط به FPM بلافاصله برای ارائه صفحات php ایجاد می‌شود. بخاطر بسپارید، شما می‌توانید با مشخص کردن فایل پیکربندی FPM فوق، یک سرویس systemd جداگانه ایجاد کرده و بدین ترتیب بدون تأثیر بر سایر poolها، این استخر را راه‌اندازی یا متوقف نمایید.

 

پیکربندی NGINX برای PHP-FPM

اکنون یک بلوک سرور NGINX ایجاد کنید که از pool مربوط به FPM در بالا استفاده کند. برای انجام این کار، فایل پیکربندی NGINX خود را ویرایش کرده و مسیر فایل سوکت pool را با استفاده از گزینه fastcgi_pass در داخل بلوک مکان برای php ارسال نمایید.

server {
         listen       80;
         server_name  example.journaldev.com;
         root         /var/www/html/wordpress;

         access_log /var/log/nginx/example.journaldev.com-access.log;
         error_log  /var/log/nginx/example.journaldev.com-error.log error;
         index index.html index.htm index.php;

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

         location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php7.2-fpm-wordpress-site.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
    }
}

 

 

اطمینان حاصل کنید که تنظیمات پیکربندی فوق از نظر نحوی صحیح بوده و NGINX را دوباره راه‌اندازی کنید.

# nginx-t
# systemctl restart nginx

 

تست پیکربندی PHP-FPM NGINX

به منظور بررسی اینکه آیا فایل پیکربندی NGINX فوق واقعاً از FPM pool تازه ایجاد شده استفاده می‌کند، یک فایل اطلاعات php در داخل root وب ایجاد نمایید. در اینجا، از /var/www/html/wordpress به عنوان یک root وب در فایل پیکربندی NGINX فوق استفاده شده است. سپس این مقدار را با توجه به محیط خود تنظیم کنید.

# cd /var/www/html/wordpress
# echo "<?php echo phpinfo();?>" > info.php

پس از پایان ایجاد صفحه اطلاعات PHP، با مرورگر وب مورد علاقه خود، آن را باز نمایید.

مشاهده خواهید کرد که مقادیر $ _SERVER ['USER'] و $ _SERVER ['HOME'] به ترتیب به wordpress_user و /home/wordpress_user اشاره دارند که قبلاً در فایل پیکربندی FPM تنظیم کرده‌ایم و بنابراین تأیید می‌کند که NGINX، صفحات php را با استفاده از FPM pool مورد نظر ما سرویس دهی می‌کند.

 

 

 

منبع:

journaldev