کانفیگ و ترفندهای بهینه سازی Nginx و PHP-FPM

من قبل از راهنمایی نوشتم که چگونه Nginx / PHP-FPM را در Fedora 28/27، CentOS / RHEL 7.4 / 6.9 نصب کنید ، اما این راهنمای فقط راهنمای نصب است و بسیاری از موارد Nginx و PHP-FPM پیکربندی پایه خوب است اما اگر شما می خواهید برای فشار دادن تمام آب از VPS یا سرور وب / سرورهای خود و انجام کار تعمیر و نگهداری خود را کمی آسان تر، پس این راهنما ممکن است مفید باشد. این نکات به طور کامل بر روی تجربه شخصی من استوار است، بنابراین ممکن است یک حقیقت مطلق نباشد، و در برخی موارد، یک پیکربندی کاملا متفاوت ممکن است بهتر کار کند. همچنین لازم است به یاد داشته باشید که منابع را برای سرویس های دیگر نیز از دست می دهید، همچنین اگر نمونه ای از MySQL، PostgreSQL، MongoDB، Mail Server، Server Name و / یا سرور SSH را در همان دستگاه اجرا کنید.

کانفیگ و ترفندهای بهینه سازی Nginx و PHP-FPM

کانفیگ و ترفندهای بهینه سازی Nginx و PHP-FPM

پیکربندی Nginx و بهینه سازی نکات و ترفندها

Nginx نکته 1. – تنظیم فایل های پیکربندی Nginx

به طور معمول فایل های پیکربندی Nginx زیر مسیر / etc / nginx قرار می گیرند.
یک راه خوب برای سازماندهی فایلهای پیکربندی، استفاده از تنظیمات دبیان / اوبونتو آپاچی است:


## Main configuration file ##
/etc/nginx/nginx.conf

## Virtualhost configuration files on ##
/etc/nginx/sites-available/
/etc/nginx/sites-enabled/

## Other config files on (if needed) ##
/etc/nginx/conf.d/

فایلهای Virtualhost دارای 2 مسیر هستند، زیرا دایرکتوری موجود در سایتها میتواند شامل مواردی نظیر تست config ها، پیکربندی های کپی / ایجاد شده، تنظیمات قدیمی و غیره باشد. و سایت های فعال شامل فقط تنظیمات واقعا فعال است، در واقع فقط لینک های نمادین به دایرکتوری موجود در سایت ها.

به یاد داشته باشید اضافه کردن زیر شامل در پایان فایل nginx.conf شما :


## Load virtual host conf files. ##
include /etc/nginx/sites-enabled/*;

## Load another configs from conf.d/ ##
include /etc/nginx/conf.d/*;

Nginx Tip 2. – Nginx worker_processes و worker_connections را تعیین کنید

تنظیمات پیش فرض برای worker_processes و worker_connections خوب است ، اما این مقادیر می توانند کمی بهینه سازی شوند:
max_clients = worker_processes * worker_connections

راه اندازی ساده Nginx می تواند صدها اتصال همزمان را انجام دهد:


worker_processes  1;
worker_connections  1024;

به طور معمول 1000 اتصال همزمان / در هر سرور خوب است، اما گاهی اوقات قطعات دیگری مانند دیسک در سرور ممکن است کند باشد، و این باعث می شود که Nginx در عملیات I / O قفل شود. برای جلوگیری از استفاده از مثال استفاده از تنظیم زیر: یک worker_precess / در هسته پردازنده ، مانند:
Processes Worker


worker_processes [number of processor cores];

برای بررسی اینکه چه تعداد پردازشگر هسته ای دارید، دستور زیر را اجرا کنید:


cat /proc/cpuinfo |grep processor
processor	: 0
processor	: 1
processor	: 2
processor	: 3

بنابراین در اینجا 4 هسته و worker_processes تنظیم نهایی می تواند زیر باشد:


worker_processes 4;

ارتباطات کارگر
من شخصا با 1024 کارگر کار می کنم، زیرا هیچ دلیلی برای بالا بردن این ارزش ندارم. اما اگر نمونه 4096 اتصال در هر ثانیه کافی نیست، این امکان وجود دارد که سعی کنید آن را دو برابر کنید و 2048 اتصالات را در هر فرایند تنظیم کنید.

worker_processes تنظیم نهایی می تواند زیر باشد:


worker_connections 1024;

من بعضی از تنظیمات را دیده ام که مدیران سرور از Apache بیش از حد استفاده می کنند و فکر می کنند اگر من Nginx worker_processes را به 50 و worker_connections به 20000 اضافه کنم، پس سرور من می تواند تمام ترافیک را هر بار که ماهانه دریافت می کند … اما بله درست نیست. این صرفه جویی در منابع است و ممکن است برخی مشکلات جدی ایجاد کند …

Nginx Tip 3. – مخفی کردن Nginx Server Tokens / مخفی کردن شماره نسخه Nginx

این به دلایل امنیتی نشانه های سرور را مخفی می کند / شماره نسخه نسخه Nginx را مخفی می کند، به ویژه اگر نسخه ای از Nginx قدیمی باقی بماند. این بسیار آسان است که فقط سرور_tokens را در بخش http / server / location قرار دهید ، مانند:


server_tokens off;

Nginx Tip 4. – درخواست / ارسال Nginx حداکثر اندازه بدن (client_max_body_size)

اگر می خواهید به کاربران اجازه آپلود چیزی یا چیزی شخصی را روی HTTP آپلود کنید، باید حجم پست را افزایش دهید . این را می توان با value client_max_body_size انجام داد که تحت بخشhttp / server / location قرار می گیرد . به طور پیش فرض آن 1 مگابایت است، اما می توان آن را به عنوان مثال برای 20 مگابایت تنظیم کرد و همچنین اندازه بافر با تنظیمات زیر را افزایش داد:


client_max_body_size 20m;
client_body_buffer_size 128k;

اگر خطای زیر را دریافت می کنید، سپس می دانید که client_max_body_size خیلی پایین است:
“Request Entity Too Large” (413)

Nginx Tip 5. – کنترل Nginx Cache برای فایل های استاتیک (دستورالعمل های کنترل مرورگر Cache)

ذخیره سازی مرورگر وارد شده است اگر می خواهید منابع و پهنای باند را ذخیره کنید. راه اندازی آسان با Nginx، پس از نصب بسیار ساده است که در آن ورود به سیستم (ورود به سیستم و ثبت نشده است) خاموش است و منقضی شده هدر به 360 روز تنظیم شده است.


location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    access_log        off;
    log_not_found     off;
    expires           360d;
}

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

Nginx نکته 6. – Nginx درخواست PHP را به PHP-FPM منتقل کنید

در اینجا می توانید از پشته tpc / ip به طور پیش فرض استفاده کنید یا از اتصال مستقیم سوکت یونیکس استفاده کنید. شما همچنین باید PHP-FPM را نصب کنید دقیقا مشابه ip: port یا unix socket (با سوکت یونیکس نیز مجوز سوکت باید درست باشد). تنظیمات پیش فرض استفاده از ip: port (127.0.0.1:9000) می تواند البته ips و ports را تغییر دهد چه PHP-FPM گوش می دهد. در اینجا پیکربندی بسیار اساسی با مثال سوکت یونیکس بیان شده است:


# Pass PHP scripts to PHP-FPM
location ~* \.php$ {
    fastcgi_index   index.php;
    fastcgi_pass    127.0.0.1:9000;
    #fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
}

همچنین امکان اجرای PHP-FPM دیگر سرور و Nginx دیگر وجود دارد.

Nginx Tip 7. – جلوگیری (انکار) دسترسی به فایل های پنهان با Nginx

بسیار رایج است که ریشه سرور یا سایر دایرکتوری های عمومی فایل های پنهان را که با dot (.) شروع می شوند، به طور معمول برای کاربر سایت نمی کند. دایرکتوری های عمومی می توانند شامل فایل های کنترل نسخه و دایرکتوری ها مانند .svn ، برخی از ویژگی های IDE خواص و فایل های .htaccess باشد. بعد از رد کردن دسترسی و غیرفعال کردن ورود به سیستم برای همه فایلهای مخفی.


location ~ /\. {
    access_log off;
    log_not_found off; 
    deny all;
}

نکات و ترفندهای پیکربندی PHP-FPM

PHP-FPM Tip 1. – فایل های پیکربندی PHP-FPM

فایل های پیکربندی به طور معمول PHP-FPM در واقع /etc/php-fpm.conf فایل و /etc/php-fpm.d مسیر. این به طور معمول شروع خوبی است و کلیه تنظیمات استخر به پوشه /etc/php-fpm.d می رود . شما نیاز به اضافه کردن زیر شامل خط در فایل php-fpm.conf شما :


include=/etc/php-fpm.d/*.conf

PHP-FPM Tip 2. – ترفند پیکربندی جهانی PHP-FPM

emergency_restart_threshold ، emergency_restart_interval و process_control_timeout را تنظیم کنید . مقادیر پیش فرض برای این گزینه ها کاملا خاموش است، اما من فکر می کنم بهتر است از این گزینه ها مانند زیر استفاده کنید:


emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s

این چه معنی میدهد؟ بنابراین اگر 10 فرزند PHP-FPM فرآیند خروج را با SIGSEGV یا SIGBUS طی یک دقیقه انجام دهند، PHP-FPM به صورت خودکار دوباره راه اندازی می شود. این پیکربندی همچنین 10 ثانیه محدودیت زمانی برای فرآیندهای کودک را تعیین می کند تا منتظر واکنش بر روی سیگنال ها از استاد باشد.

PHP-FPM Tip 3. – پیکربندی PHP-FPM Pools

با استفاده از PHP-FPM امکان استفاده از استخر های مختلف برای سایت های مختلف و منابع بسیار دقیق و حتی استفاده از کاربران و گروه های مختلف برای هر استخر. در زیر فقط ساختار فایل های پیکربندی برای استخرهای PHP-FPM برای سه سایت مختلف (و یا در واقع سه بخش مختلف از همان سایت) است:

/etc/php-fpm.d/site.conf
/etc/php-fpm.d/blog.conf
/etc/php-fpm.d/forums.conf

فقط تنظیمات نمونه برای هر استخر:
/etc/php-fpm.d/site.conf


[site]
listen = 127.0.0.1:9000
user = site
group = site
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-site.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

/etc/php-fpm.d/blog.conf


[blog]
listen = 127.0.0.1:9001
user = blog
group = blog
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-blog.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 4
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 200
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

/etc/php-fpm.d/forums.conf


[forums]
listen = 127.0.0.1:9002
user = forums
group = forums
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-forums.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 400
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

بنابراین این فقط مثال چگونگی پیکربندی چند استخر متفاوت است.

PHP-FPM Tip 4. – پیکربندی PHP-FPM Pool Process Manager (pm)

بهترین روش برای استفاده از مدیر فرآیند PHP-FPM، استفاده از مدیریت فرایند پویا است، بنابراین فرآیندهای PHP-FPM تنها زمانی شروع می شوند که نیاز به آن هستند. این تنظیمات تقریبا همان سبک از Nginx worker_processes و worker_connections است. بنابراین ارزش های بسیار بالا به معنای لزوما چیزی خوب نیست. هر پردازش حافظه را می بخشد و البته اگر سایت دارای ترافیک بسیار زیاد و حافظه زیادی از حافظه باشد، ارزش های بالاتر انتخاب مناسب هستند، اما سرورها مانند VPS (Virtual Private Servers) معمولا 256 مگابایت، 512 مگابایت، 1024 مگابایت محدود می شوند. این رم کم برای برخورد با ترافیک بسیار زیاد (حتی ده ها درخواست در هر ثانیه) کافی است، اگر با عاقلانه استفاده شود.

خوب است که آزمایش کنید که چگونه بسیاری PHP-FPM یک سرور را پردازش می کند، ابتدا Nginx و PHP-FPM را راه اندازی کنید و برخی از صفحات PHP را بارگذاری کنید، ترجیحا همه سنگین ترین صفحات. سپس استفاده از حافظه در هر فرآیند PHP-FPM را با فرمان لینوکس یا htop بررسی کنید . فرض کنید که سرور دارای حافظه 512 مگابایتی و 220 مگابایت برای PHP-FPM استفاده می شود، هر پروسه از 24 مگابایت رم استفاده می کند (برخی از سیستم های بزرگ مدیریت محتوا با پلاگین ها می توانند به آسانی از 20 تا 40 مگابایت در هر صفحه درخواست پی اچ پی یا حتی بیشتر استفاده کنند) . سپس مقدار سرور max_children را محاسبه کنید: 220/24
= 9.17

ارزش pm.max_children بسیار خوب است. این فقط یک میانگین سریع است و بعد می تواند چیزی دیگری باشد، زمانی که می بینید استفاده از حافظه طولانی تر / در هر فرایند است. پس از انجام تست سریع آن بسیار آسان تر به راه اندازی pm.start_servers ارزش، pm.min_spare_servers ارزش و pm.max_spare_servers ارزش.

پیکربندی نهایی ممکن است زیر باشد:


pm.max_children = 9
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200

حداکثر درخواست برای هر فرایند به طور پیش فرض نامحدود است، اما برای تنظیم مقداری کم، مانند 200 و جلوگیری از برخی مسائل حافظه، خوب است. این راه اندازی ساده می تواند مقدار زیادی از درخواست ها را انجام دهد، حتی اگر اعداد به نظر کوچک می آیند.

این صفحه چطور بود؟ post