بهینه سازی PHP-FPM برای کارایی بالا

PHP در همه جا وجود دارد و مسلماً زبانی است که به طور گسترده در وب اینترنت مستقر شده است.


با این حال ، به ویژه در مورد سیستم های بسیار همزمان ، دقیقاً به دلیل قابلیت های عملکرد بالا شناخته نمی شود. و به همین دلیل است که برای چنین موارد استفاده تخصصی ، زبانهایی مانند Node (بله ، می دانم که این یک زبان نیست) ، Go و Elixir در دست گرفتن هستند.

به گفته این ، یک مقدار زیادی وجود دارد که می توانید برای بهبود عملکرد PHP روی سرور خود انجام دهید. در این مقاله به سمت php-fpm چیزها متمرکز شده است ، که این روش طبیعی برای پیکربندی در سرور شما در صورت استفاده از Nginx است.

در صورتی که می دانید php-fpm چیست ، احساس راحتی کنید تا به بخش بهینه سازی بروید.

php-fpm چیست?

بسیاری از توسعه دهندگان به این علاقه ندارند DevOps طرف چیزها ، و حتی در میان کسانی که انجام می دهند ، بسیار کمی می دانند که در زیر کاپوت چه می گذرد. جالب است که ، هنگامی که مرورگر درخواستی را به سرور با PHP ارسال می کند ، PHP نیست که اولین تماس را تشکیل می دهد. در عوض ، این سرور HTTP است ، عمده ترین آنها Apache و Nginx هستند. سپس این “سرورهای وب” باید تصمیم بگیرند كه چگونه به PHP وصل شوند و نوع درخواست ، داده ها و سرصفحات را به آن منتقل كنند..

چرخه درخواست پاسخ در مورد PHP (اعتبار تصویر: ProinerTech)

در برنامه های کاربردی مدرن PHP ، قسمت “find file” در بالا index.php است که سرور پیکربندی شده است تا همه درخواست ها را به.

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

بنابراین ، هرگاه درخواستی دریافت شد ، سرور فرآیند جدیدی را شروع می کند که بطور خودکار PHP را شامل می شود و آن را اجرا می کند. این روش mod_php نامیده می شود ، کوتاه “php به عنوان یک ماژول”. این روش محدودیت های خود را داشت ، که Nginx با php-fpm غلبه کرد.

در php-fpm مسئولیت مدیریت PHP ، فرآیندهای مربوط به برنامه PHP در سرور است. به عبارت دیگر ، سرور وب (Nginx ، در مورد ما) اهمیتی نمی دهد که PHP کجاست و چگونه بارگیری می شود ، تا زمانی که می داند چگونه داده ها را از آن ارسال و دریافت کند. اگر می خواهید ، می توانید در این حالت به PHP به عنوان یک سرور دیگر فکر کنید ، که بعضی از فرآیندهای PHP کودک را برای درخواست های دریافتی مدیریت می کند (بنابراین ، ما این درخواست را داریم که به سرور برسیم ، که توسط یک سرور دریافت شده و به یک سرور منتقل شده است). – خیلی دیوانه! :-P).

اگر تنظیمات Nginx را انجام داده اید ، یا حتی فقط به آنها افتخار کرده اید ، چنین چیزی را پیدا خواهید کرد:

محل \ .php $
try_files $ uri = 404؛
fastcgi_split_path_info ^ (. + \. php) (/.+) $؛
fastcgi_pass unix: /run/php/php7.2-fpm.sock؛
fastcgi_index index.php؛
شامل fastcgi_params؛
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name؛
}

خطی که ما به آن علاقه داریم این است: fastcgi_pass unix: /run/php/php7.2-fpm.sock ؛، که به Nginx می گوید از طریق سوکت به نام php7.2-fpm.sock با فرآیند PHP ارتباط برقرار کند. بنابراین ، برای هر درخواست ورودی ، Nginx داده ها را از طریق این پرونده می نویسد و با دریافت خروجی ، آن را به مرورگر ارسال می کند.

یک بار دیگر ، باید تأکید کنم که این کامل ترین یا دقیق ترین تصویر از آنچه اتفاق می افتد نیست ، اما برای اکثر کارهای DevOps کاملاً دقیق است.

با این کار ، بیایید آنچه را که تاکنون آموخته ایم ، یادآوری کنیم:

  • پی اچ پی درخواست های ارسال شده توسط مرورگرها را مستقیماً دریافت نمی کند. سرورهای وب مانند Nginx ابتدا اینها را رهگیری می کنند.
  • وب سرور می داند چگونه به فرایند PHP متصل شود ، و تمام داده های درخواست (به معنای واقعی کلمه همه چیز را چسباند) را به PHP منتقل می کند..
  • وقتی PHP بخش خود را تمام کرد ، پاسخ را به سرور وب ارسال می کند ، که آن را برای مشتری (یا مرورگر ، در بیشتر موارد) ارسال می کند..

یا به صورت گرافیکی:

نحوه کار PHP و Nginx با هم (اعتبار تصویر: DataDog)

تا کنون عالی است ، اما اکنون این سوال میلیون دلاری مطرح است: PHP-FPM دقیقا چیست?

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

PHP-FPM به خودی خود یک خرگوش کامل است ، بنابراین در صورت تمایل ، اکتشاف کنید ، اما برای اهداف ما ، این توضیحات بسیار انجام خواهد داد. ��

چرا بهینه سازی php-fpm?

بنابراین چرا همه چیز در مورد این رقص نگران است وقتی همه چیز درست پیش می رود؟ چرا فقط امور را آنطور که هست رها نکنیم.

از قضا ، دقیقاً توصیه ای است که من برای بیشتر موارد استفاده می کنم. اگر تنظیمات شما خوب کار می کند و موارد خارق العاده ای ندارد ، از پیش فرض استفاده کنید. اما اگر می خواهید فراتر از یک دستگاه واحد باشید ، بنابراین فشردن حداکثر از یک دستگاه ضروری است زیرا می تواند صورت های سرور را به نصف کاهش دهد (یا حتی بیشتر!).

نکته دیگر که باید بدانیم این است که Nginx برای جابجایی با کارهای سنگین ساخته شده است. این قابلیت را دارد که هزاران اتصال را همزمان انجام دهید ، اما اگر این مورد در مورد تنظیم PHP شما صحیح نیست ، شما فقط به هدر رفتن منابع می پردازید زیرا Nginx باید منتظر بماند تا PHP با روند فعلی تمام شود و قبول کند بعد ، کاملاً منفی هر مزیتی که Nginx برای ارائه آن ساخته شده است!

بنابراین ، با این کار ، بیایید ببینیم که هنگام تلاش برای بهینه سازی php-fpm ، دقیقاً چه چیزی را تغییر خواهیم داد.

نحوه بهینه سازی PHP-FPM?

محل فایل پیکربندی برای php-fpm ممکن است در سرور متفاوت باشد ، بنابراین برای یافتن آن باید تحقیقاتی انجام دهید. در UNIX می توانید از دستور find استفاده کنید. در اوبونتو من ، مسیر /etc/php/7.2/fpm/php-fpm.conf است. البته 7.2 نسخه PHP است که من اجرا می کنم.

آنچه در چند سطر اول این پرونده به نظر می رسد:

؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛
؛ پیکربندی FPM؛
؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛

؛ کلیه مسیرهای نسبی موجود در این پرونده پیکربندی مربوط به نصب PHP است
؛ پیشوند (/ usr). این پیشوند را می توان به صورت پویا با استفاده از
؛ استدلال ‘-p’ از خط فرمان.

؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛
؛ گزینه های جهانی؛
؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛

[جهانی]
؛ پرونده pid
؛ توجه: پیشوند پیش فرض / var است
؛ مقدار پیش فرض: هیچ
pid = /run/php/php7.2-fpm.pid

؛ پرونده ثبت خطا
؛ اگر تنظیم شده باشد "syslog", log به جای اینکه نوشته شود به syslogd ارسال می شود
؛ در یک پرونده محلی.
؛ توجه: پیشوند پیش فرض / var است
؛ مقدار پیش فرض: log / php-fpm.log
error_log = /var/log/php7.2-fpm.log

چند مورد باید فوراً آشکار باشد: pid = /run/php/php7.2-fpm.pid به ما می گوید کدام پرونده شامل شناسه فرایند php-fpm است.

ما همچنین می بینیم که /var/log/php7.2-fpm.log جایی است که php-fpm قصد دارد گزارشات خود را ذخیره کند.

در داخل این پرونده ، سه متغیر دیگر مانند این اضافه کنید:

emer_restart_threshold 10
emer_restart_interval 1m
process_control_timeout 10s

دو تنظیم اول احتیاط آور هستند و به روند php-fpm می گویند که اگر ده فرآیند کودک طی یک دقیقه شکست بخورد ، فرایند اصلی php-fpm باید خود را دوباره شروع کند..

این ممکن است قوی به نظر نرسد ، اما PHP یک فرایند کوتاه مدت است که باعث نشت حافظه می شود ، بنابراین راه اندازی مجدد فرایند اصلی در موارد خرابی بالا می تواند بسیاری از مشکلات را حل کند.

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

با کمال تعجب ، این گوشت پیکربندی php-fpm نیست! به این دلیل است که برای ارائه درخواستهای وب ، php-fpm یک مجموعه جدید از فرآیندها ایجاد می کند ، که پیکربندی جداگانه ای دارند. در مورد من ، نام استخر معلوم شد www و پرونده ای که می خواستم ویرایش شود /etc/php/7.2/fpm/pool.d/www.conf.

بیایید ببینیم این پرونده به چه صورت شروع می شود:

؛ استخر جدیدی به نام “www” را شروع کنید.
؛ استخر متغیر $ در هر بخشنامه قابل استفاده است و جایگزین آن می شود
؛ نام استخر (“www” در اینجا)
[www]

؛ در پیشوند استخر
؛ این فقط در مورد دستورالعمل های زیر اعمال می شود:
؛ – ‘access.log’
؛ – ‘کند’
؛ – ‘گوش دادن’ (unixsocket)
؛ – “کلاهبرداری”
؛ – “چدیر”
؛ – ‘php_values’
؛ – ‘php_admin_values’
؛ در صورت عدم تنظیم ، پیشوند جهانی (یا / usr) به جای آن اعمال می شود.
؛ توجه: این بخشنامه همچنین می تواند نسبت به پیشوند جهانی باشد.
؛ مقدار پیش فرض: هیچ
؛ پیشوند = / مسیر / به / استخر / $ استخر

؛ کاربر / گروه فرآیند Unix
؛ توجه: کاربر الزامی است. اگر گروه تنظیم نشده باشد ، گروه پیش فرض کاربر
؛ استفاده خواهد شد.
کاربر = داده های www
گروه = داده های www

با نگاهی گذرا به انتهای قطعه بالا ، معمای این مسئله حل می شود که چرا فرایند سرور به صورت داده های www اجرا می شود. اگر هنگام تنظیم وب سایت خود به مشکلات اجازه پرونده برخوردید ، احتمالاً مالک یا گروهی از فهرست را به داده های www تغییر داده اید ، به این ترتیب به فرایند PHP اجازه می دهید تا بتواند در پرونده های ورود به سیستم و بارگذاری اسناد و موارد دیگر بارگذاری کند..

سرانجام ، ما به منبع ماده ، تنظیم مدیر فرآیند (PM) می رسیم. به طور کلی ، پیش فرض ها را به صورت شبیه به این مشاهده خواهید کرد:

بعد از ظهر = پویا
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200

بنابراین ، چه می کند “پویا“در اینجا معنی؟ من فکر می کنم که اسناد رسمی به بهترین وجه توضیح می دهند (منظور من این است که این باید قبلاً جزئی از پرونده ای باشد که شما در حال ویرایش آن هستید ، اما من آن را در صورت عدم تولید آن در اینجا تکثیر می کنم:

؛ انتخاب کنید که چگونه مدیر فرایند تعداد فرایندهای کودک را کنترل می کند.
؛ مقادیر ممکن:
؛ استاتیک – تعداد ثابت (pm.max_children) مراحل کودک؛
؛ پویا – تعداد فرآیندهای کودک بر اساس پویا تنظیم می شود
؛ دستورالعملهای زیر با این مدیریت فرآیند ، وجود خواهد داشت
؛ همیشه حداقل 1 کودک.
؛ pm.max_children – حداکثر تعداد کودکانی که می توانند
؛ در همان زمان زنده باشید.
؛ pm.start_servers – تعداد کودکانی که در هنگام راه اندازی ایجاد شده اند.
؛ pm.min_spare_servers – حداقل تعداد بچه های “بیکار”
؛ دولت (در انتظار پردازش) اگر شماره
؛ فرآیندهای “بیکار” کمتر از این است
؛ سپس تعدادی از کودکان ایجاد می شوند.
؛ pm.max_spare_servers – حداکثر تعداد کودکان در حالت “بیکار”
؛ دولت (در انتظار پردازش) اگر شماره
؛ فرآیندهای “بیکار” از این بیشتر است
؛ تعداد فرزندان کشته می شوند.
؛ اعتراض – هیچ کودکی در شروع کار ایجاد نمی شود. کودکان چه موقع چنگال می شوند
؛ درخواست های جدید متصل می شوند. پارامتر زیر استفاده می شود:
؛ pm.max_children – حداکثر تعداد کودکانی که
؛ می تواند در همان زمان زنده باشد.
؛ pm.process_idle_timeout – تعداد ثانیه بعد از آن
؛ یک روند بیکار کشته می شود.
؛ توجه: این مقدار اجباری است.

بنابراین ، ما می بینیم که سه مقدار ممکن وجود دارد:

  • استاتیک: تعداد مشخصی از فرایندهای PHP مهم نیست که چه چیزی حفظ شوند.
  • پویا: ما باید حداقل و حداکثر تعداد پردازش هایی را که php-fpm در هر نقطه معین زنده نگه می دارد مشخص کنیم..
  • بر اساس تقاضا: فرایندها بنا به تقاضا ایجاد و نابود می شوند.

بنابراین ، چگونه این تنظیمات اهمیت دارند?

به زبان ساده ، اگر وب سایتی با ترافیک کم دارید ، تنظیمات “پویا” بیشتر وقت تلف کردن منابع است. با فرض اینکه شما pm.min_spare_servers را روی 3 تنظیم کرده باشید ، حتی در صورت عدم وجود ترافیک در وب سایت ، سه فرآیند PHP ایجاد و حفظ می شوند. در چنین مواردی ، “ondemand” گزینه بهتری است و به سیستم اجازه می دهد تصمیم بگیرد که چه موقع فرآیندهای جدیدی را شروع کند.

از طرف دیگر ، وب سایت هایی که میزان زیادی از ترافیک را کنترل می کنند یا باید سریعاً پاسخ دهند ، در این تنظیم مجازات می شوند. ایجاد یک فرآیند جدید PHP ، بخشی از آن در استخر و نظارت بر آن ، سربار اضافی است که به بهترین وجه از آن جلوگیری می شود.

استفاده از pm = static تعداد فرایندهای کودک را برطرف می کند ، اجازه می دهد حداکثر منابع سیستم در ارائه درخواست ها به جای مدیریت PHP مورد استفاده قرار گیرند. اگر این مسیر را طی کردید ، مراقب باشید که دستورالعمل ها و مشکلات آن را دارد. یک مقاله نسبتاً متراکم اما بسیار مفید در مورد آن است اینجا.

کلمات نهایی

از آنجا که مقالاتی در مورد عملکرد وب می تواند باعث ایجاد جنگ شود و یا باعث سردرگمی مردم شود ، احساس می کنم قبل از بستن این مقاله ، چند کلمه در دستور کار است. تنظیم عملکرد به همان اندازه در حدس و گمان و هنرهای تاریک است بلکه دانش سیستم است.

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

در عین حال ، از پایان کار ناخواسته بودن اجتناب کنید. بله ، با بازپرداخت PHP از ابتدا و حذف همه ماژول هایی که استفاده نمی کنید می توانید عملکرد بهتری بدست آورید ، اما این رویکرد در محیط های تولید به اندازه کافی بی عیب نیست. ایده کامل برای بهینه سازی چیزی این است که نگاهی بیندازید که آیا نیازهای شما با پیش فرض ها (که بندرت انجام می دهند!) متفاوت است ، و در صورت نیاز تغییرات جزئی ایجاد کنید.

اگر آماده نیستید که برای بهینه سازی سرورهای PHP خود وقت بگذارید ، ممکن است مانند یک پلتفرم قابل اعتماد فکر کنید کینستا مراقبت از بهینه سازی عملکرد و امنیت.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map