Nginx یک جایگزین سبک و سریع به جای گزینههای سنگینی چون Apache 2 است. با این وجود، همانند هر سرور یا نرمافزار دیگر، نیازمند بهینهسازی برای ایجاد بهترین عملکرد خود است. در این مطلب با نحوه بهینهسازی Nginx آشنا میشویم.
پیشنیازها
- یک نسخه جدید از Debian 7 droplet با تنظیمات اولیه کامل.
- droplet باید دارای یک نسخه جدید نصب و تنظیمشده سرور Nginx باشد.
- داشتن درک پایه مناسب از لینوکس
متغیرهای Worker Processes و Worker Connections
برای بهینهسازی Nginx، دو متغیر اولی که باید آنها را تنظیم کنیم، worker processes و worker connections هستند. قبل از اینکه به سراغ تنظیمات هر کدام از آنها برویم، ابتدا باید درک مناسبی از این متغیرهای کنترلکننده داشته باشیم. باید توجه داشت که worker_processes یک رکن حیاتی برای Nginx محسوب میشود. این متغیر مشخص میکند که سرور مجازی در هنگام اتصال به یک IP و پورت مناسب، چند worker را به کار بگیرد. معمولاً در عمل، یک worker برای هر هسته درنظر گرفته میشود. بالاتر از این مقدار به سیستم شما آسیب نمیزند، ولی منجر به کند شدن و از کار افتادن فرآیندهای شما میشود.
برای اینکه بدانید چه عددی باید برای متغیر worker_processes وارد کنید، میتوانید به راحتی نگاهی به تعداد هستههایی که در اختیار دارید داشته باشید. اگر ابعاد کار و پروژه خود را گسترش دادید، باید دوباره نسبت به تنظیمات این متغیر اقدام کنید. در هر صورت، روش کار با دریافت اطلاعات پردازنده از طریق فرمان زیر خواهد بود.
grep processor /proc/cpuinfo | wc -l
فرض کنید که پاسخ این فرمان عدد یک باشد. این همان تعداد هستههای سیستم شما خواهد بود.
پارامتر worker_connections نیز به شما میگوید که چه تعداد از افراد میتوانند به صورت همزمان میتوانید از سرویس Nginx استفاده کنند. عدد پیشفرض برای این پارامتر برابر 768 است. با این وجود، با درنظر گرفتن اینکه هر مرورگری حداقل دو اتصال را برای هر سرور باز میکند، این عدد را میتوانید به نصف کاهش دهید. ما باید اتصالات worker را بهگونهای تنظیم کنیم که بیشترین عملکرد را در اختیار داشته باشیم. محدودیت هستهها را با وارد کردن فرمان ulimit تنظیم میکنیم.
ulimit -n
در یک سیستم با ابعاد کوچکتر، این عدد میتواند ۱۰۲۴ باشد که شروع مناسبی برای شما خواهد بود.
بیایید تنظیماتمان را بروزرسانی کنیم.
sudo nano /etc/nginx/nginx.conf
worker_processes 1; worker_connections 1024;
به خاطر داشته باشید که تعداد کلاینتهایی که امکان سرویسدهی دارید، میتواند با افزایش تعداد هستهها چند برابر شود. در اینجا، میتوانیم تا ۱۰۲۴ کلاینت را در ثانیه پوشش دهیم. ضمن اینکه پارامتر keepalive_timeout نیز میتواند بر این شرایط تأثیرگذار باشد.
بافرها
تنظیم مهم دیگری که برای بهینهسازی Nginx میتوانیم انجام دهید، اندازه بافر (buffer size) است. اگر اندازه بافر بیش از اندازه کوچک باشد، Nginx مجبور است که یک فایل موقتی نوشته و باعث شود که دیسک به صورت لحظهای به خواندن و نوشتن مشغول باشد. قبل از اینکه تصمیمی در این خصوص بگیرید، برخی پارامترها هستند که باید درباره آنها بدانید.
client_body_buffer_size: این پارامتر اندازه بافر کلاینت را کنترل میکند. منظور از اندازه بافر کلاینت هر اقدام POST ارسالی به Nginx است. اقدامات POST معمولاً سابمیشنها را شکل میدهند.
client_header_buffer_size: مشابه پارامتر قبلی، با این تفاوت که کنترلکننده اندازه تیتر کلاینت است. برای تمام کاربریها و اهداف معمولاً مقدار 1K برای این پارامتر مناسب خواهد بود.
client_header_buffer_size: بزرگترین اندازه قابلقبول برای یک درخواست کلاینت. اگر از این مقدار تجاوز شود، Nginx پیغام خطای 413 یا هشدار “Request Entity Too Large” را نشان خواهد داد.
large_client_header_buffers: حداکثر تعداد و اندازه بافر برای تیترها یا هدرهای کلاینت بزرگ.
client_body_buffer_size 10K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 2 1k;
تایماوت
تایماوتها نیز میتوانند به میزان قابلتوجهی باعث بهینهسازی Nginx شوند.
پارامترهای client_body_timeout و client_body_timeout زمان انتظار یک سرور را برای ارسال بدنه یا تیتر کلاینت مشخص میکنند. اگر هر کدام از قسمتهای بدنه یا تیتر ارسال نشود، سرور خطای 408 یا پیغام “Request time out” را نشان میدهد.
پارامتر keepalive_timeout زمانی را برای حفظ ارتباط با کلاینت مشخص میکند. پس از این دوره زمانی است که Nginx ارتباطش را کلاینت قطع میکند.
نهایتاً به پارامتر send_timeout میرسیم که فارغ از کل فرآیند انتقال پاسخ، به فاصله زمانی بین دو خوانش (reading) میپردازد. اگر کلاینت بعد از این زمان کاری انجام ندهد، Nginx کل ارتباط را قطع می کند.
client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10;
فشردهسازی Gzip
Gzip مقدار ترافیک شبکه که Nginx با آن سر و کار دارد را کاهش دهد و از این رو در بهینهسازی Nginx مفید باشد. با این وجود، باید مراقب باشید که افزایش متغیر gzip_comp_level باعث هدر دادن چرخههای CPU نشود.
gzip on; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain application/x-javascript text/xml text/css application/xml;
دریافت موقت فایلهای استاتیک
امکان تنظیم زمان انقضا برای فایلهایی که تغییر نمیکنند و اغلب مورد استفاده قرار میگیرند، وجود دارد. این پارامتر میتواند مستقیماً به بلوک سرور Nginx اضافه شود.
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; }
هر کدام از پسوندهای فایلها که در آرایه بالا ملاحظه میکنید، میتوانند مطابق با نیازهای سرور تغییر پیدا کنند.
ثبت تاریخچه
Nginx هر درخواستی ورودی به VPS را در یک فایل log ذخیره میکند. اگر برخی ابزارها برای پایش این مورد استفاده میکنید، ممکن است بخواهید این قابلیت را غیرفعال نمایید. برای این منظور، میتوانید به شکلی ساده، پارامتر access_log را دستکاری کنید.
access_log off;
حالا فایل را ذخیره کرده و ببندید. سپس فرمان زیر را اجرا کنید.
sudo service nginx restart
جمعبندی
نهایتاً بهینهسازی Nginx موجب میشود که سرور شما به راحتی قابلتنظیم و قابلپایش باشد. هیچکدام از متغیرهای بالا به صورت قطعی و دارای یک مقدار مشخص نیستند. بنابراین هر کدام را میتوان به نسبت نیازهای هر پروژه تغییر داد. البته در ادامه راه ممکن است با برخی راهکارهای دیگر در این زمینه روبرو شوید که در این مطلب به آنها اشاره نشده است. بنابراین، تا میتوانید به مطالعه در این زمینه ادامه دهید.