Nginx یک سرور بسیار سریع، قوی، سبک و با کارایی بالا است. که حداقل 40٪ از پربازدیدترین وبسایتهای دنیا بر روی آن هستند. به دلیل تطبیق پذیری Nginx ، از آن به عنوان یک متعادل کننده لود سایت، پروکسی معکوس و سرور کش HTTP استفاده میگردد.
بهترین ویژگی Nginx سرعت آن است که باعث می شود هزاران اتصال همزمان را به راحتی اداره کند.
در این مقاله ما به بهترین و عملیترین راهها برای بهبود عملکرد سرور Nginx میپردازیم.
موارد مورد نیاز شما:
- یک VPS لینوکسی
- پیش زمینهای درباره پیکربندی Nginx
- یک سرور نصب شده Nginx
بهینه سازی و بهبود عملکرد Nginx شامل تغییر تعداد پارامتیر در فایل /etc/nginx/nginx.conf. می باشد که مربوط به پیکربندی Nginx است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; add_header X-XSS-Protection "1; mode=block"; add_header X-Frame-Options "SAMEORIGIN"; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } #mail { # # See sample authentication script at: # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript # # # auth_http localhost/auth.php; # # pop3_capabilities "TOP" "USER"; # # imap_capabilities "IMAP4rev1" "UIDPLUS"; # # server { # listen localhost:110; # protocol pop3; # proxy on; # } # # server { # listen localhost:143; # protocol imap; # proxy on; # } #} |
توصیه ما این است که قبل از انجام هر تغییر در فایل پیکربندی Nginx خود یک بکآپ از آن تهیه کنید و تغییراتی که در این مقاله به آن پرداخته میشود را یکی کی تست نمایید و بعد از هربار تغییر در پیکربندی یکبار آن را ذخیره و سرور خود را راهاندازی مجدد نمایید. اگر در این فرایند بهبودی مشاهده ننمودید، بهتر است مقادیر تغییر داده شده را به حالت اولیه بازگردانید.
1. فرایندهای Worker
فرایندهای Worker به تعداد Workerهایی اطلاق میگردد در سرور شما توسط Nginx فراخوانی شدهاند. پیشنهاد ما این است که به ازای هر هسته پردازنده یک فرایند Worker داشته باشید. توجه داشته باشید که اگر مقداری که قرار میدهید بیشتر از تعدا هستههای پردازنده سرور یا VPS شما باشد. باعث میشود که پردازندهها در حالت IDLE یا بیکار پردازش بیشتری انجام دهند.
به صورت پیشفرض تعداد فرایندهای Worker به صورت اتوماتیک تنظیم شده است.
اگر نمیدانید که تعداد هستههای پردازنده سرور یا VPSتان چقدر است از کامند زیر می توانید استفاده نمایید.
1 2 |
$ grep processor /proc/cpuinfo | wc -l 1 |
همانطور که مشاهده میکنید VPS ما دارای یک هسته است پس بهتر است تعداد Workerها را یک عدد قرار دهیم.
1 |
<span class="enlighterEnlighterJS EnlighterJS"><span class="">set the worker process value to </span><span class="nu0">1</span></span> |
و برای نوشتن در فایل کانفیگ باید آن را باید به صورت:
1 |
worker_processes 1; |
اما اگر زمانی احساس کردید که ترافیک Nginx سرورتان افزایش یافته بهتر است. سرور خود را ارتقا دهید و تعداد فرایندهای Worker را افزایش دهید.
2. ارتباط Workerها
اتباطات Workerها، تعداد کلاینتهایی است که به صورت همزمان توسط یک سرور Nginx قابل ارائه است.و زمانی که این بخش با فرایند Worker ترکیب میشود. به حداکثر تعداد کلاینتهای دست پیدا خواهیم کرد که توسط سرور قابل ارائه است، برای این منظور:
1 |
Max Number of Clients/Second = Worker processes * Worker connections |
به صورت پیش فرض این تعداد برابر با 768 میباشد.
البته باید در نظر داشت که در حالت عادی یک مرورگر در آن واحد دو کانکشن بایک سرور باز مینماید. بنابراین میتوان تعداد را به نصف کاهش داد.
برای به حداکثر رساندن پتانسیل کامل Nginx ، hvjfhxhj Worker باید روی حداکثر تعداد فرآیندهای مجاز، که توسط هسته در یک زمان اجرا می شود تنظیم گردد. این معادل تعدادی است که میتوانید با دستور زیر بدست آورید:
1 2 |
$ ulimit -n 1024 |
در VPS ما مقدار پردازش به 1024 گردازش نحدود گشته است. پس بهتر است که تعداد اتصالات Worker را با دستور زیر به 1024 عدد برسانیم:
1 2 3 4 |
events { worker_connections 1024; } |
برای محاسبه تعداد کلاینتی هایی که در هر ثانیه میتوانند مدیریت شوند میتوان از دستور زیر استفاده نمود:
1 |
1024 worker connections * 1 worker process = 1024 clients per second |
3. Multi Accept
Multi Accept به معنای آن است که یک فرایند Worker ارتباطات جدیدو کانکشنهی جدید را قبول مینماید.
به صورت پیفرض این مقدار در حالت off قرار دارد و در زمان یک کانکشن را قبول میکند.
و اگر این متغیر در حالت on قرارگیرد باعث میشود که فرایند Worker تمام ارتباطات جدید را قبول نماید.
Multi Accept باید به صورت زیر در این حات قرار گیرد:
1 2 3 4 |
events { worker_connections 1024; multi_accept off; } |
4. فشرده سازی Gzip
فشرده سازی ریسپانسهای(پاسخهای) کلاینت باعث استفاده از پهنای باند شبکه و کاهش زمان بارگذاری صفحه برای کانکشنهای کندتر میگردد، لازم به ذکر است که فرآیند فشرده سازی به خودی خود منابع دستگاه را مصرف میکند از این رو باید نسب سود فشرده سازی را آنالیز و ارزیابی کنید. در غیر این صورت ، فشرده سازی ممکن است به ضرر شما باشد و عملکرد nginx را کاهش دهد. پیاده سازی فشرده سازی به شرح زیر است:
- فشرده سازی Gzip را برای محتواهایی مانند CSS، متن، فایلهای جاوا اسکریپت و … فعال نمایید
- فشرده سازی را برای انواع مختلف فایلها تست کنید و عملکرد را بررسی نمایید
- سطح فشرده سازی را افزایش ندهید، زیرا باعث مصرف توان پردازنده میگردد و از آن طرف سود زیادی به همراه ندارد.
یک پیکربندی سمپل برای Gzip به صورت زیر است.
1 2 3 4 5 6 7 |
gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 1; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; |
5. بافرها
بافرها نقش بسزایی در بهبود عملکرد Nginx دارند، در ادامه متغیرهایی را به شما نمایش میدهیم که با تغییر آنها عملکرد را افزایش دهید.
client_body_buffer_size که نقش مدیریت بافر کلاینت را به عهده دارد، مانند عملکرد POST، ارسال فرمها که به سرور Ngnix میرسند. پیشنهاد ما قرار دادن این متغیر به اندازه 10K میباشد.
client_header_buffer_size همانند متغیر بالا است اما بافرهای سمت هدر کلاینت را مدیریت مینماید. پیشنهاد ما قرار دادن این متغیر برابر با 1K میباشد.
client_max_body_size این متغیر میگوید که حجم درخواست یک کلاینت چقدر میتواند باشد. اگر این مقدار از مقدار گفته شده افزایش یابد Nginx ارور 413 میدهد.
large_client_header_buffers حداکثر مقدار برای هدر یک کلاینت.
مقدار پیشنهاد و نحوه پیکر بندی این متغیرها به صورت زیر میباشد.
1 2 3 4 |
client_body_buffer_size 10K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 4 4k; |
6. Timeouts
Timeoutهای موقت واقعاً عملکرد سرور nginx را به میزان قابل توجهی بهبود میبخشند. کانکشنهای نگهدارنده باعث کاهش مصرف cpu و سربار شبکه میشود که برای ایجاد و بستن یک کانکشن مورد نیاز است. در زیر متغیرهایی هستند که برای بهتر کردن عملکرد باید دوباره تنظیم شوند:
client_header_timeout & client_body_timeout – زمانی که سرور nginx منتظر میماند تا هدر یا بدنه یک کلاینت ارسال گردد.
keepalive_timeout مدت زمانی که یک کانکشن نگهدارند باز میماند. و پس از آن Nginx سرور ارتباط را میبندد.
send_timeout تایماوتی که شامل ارسال جوابی به کلاینت میباشد سپس اگر کلاینت نوتاند جواب را دریافت کند، سرور Nginx کانکشن را قطع مینماید.
مقادیر زیر پیشنهادی ما برای متغیرهای بالا هستند.
1 2 3 4 |
client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10; |
7. لاگها
میدانیم که ذخیره لاگها و اطلاعات این چنینی به ما کمک میکند ایرادات سیستم را متوجه شویم و عیب یابی نماییم، اما ذخیره این حجم عظیم دیتا باعث مصرف شدن منابع سخت افزاری ما میشود. در Nginx عر ورود را ثبت میکند و برای همین امر مقدار زیادی از قدرت پردازنده استفاده میشود. برای حل این موضوع دو راه وجود دارد:
1. غیرفعال کردن کامل Logها به صورت زیر:
1 |
access_log off; |
2. اگر نیاز مبرمی به لاگهای خود دارید، میتوانید access-log buffering را روشن نمایید. این عمل باعث میشود که سرور Nginx شما لاگ ها و ورودها را یکی یکی ذخیر نکند، بلکه آنها را در دستههای یزرگتری باهم ذخیره مینماید.
1 |
access_log /var/log/nginx/access.log main buffer=16k |
جمع بندی:
زمانی که وب سروس Nginx خود را بهینه نمودید. قدم بعدی مانیتور و بررسی آن در شرایط گوناگون مانند ترافیک و فاکتورهای دیگری است که برای سرور پیش میآید. بنابراین مقادیر توصیه شده بهترین متغیرها نیستند و برای شرایط متنوع این متغیرها متفاوتاند. و شما میتوانید در شرایط ترافیک کم یا متوسط متغیرها رو به صورت آهسته افزایش دهید. اگر افزایش در میزان بهرهوری مشاهده نکردید بهتر است آن متغیر را در حالت پیش فرض قرار دهید.
بدون دیدگاه