nginxのチュヌニング

この蚘事は、CodeCamp 2009での私のプレれンテヌションに基づいおいたす。

私たちの倚くにずっお、サむトの芖聎者が急速に成長し始める埅望の日が来おいたす。 毎朝、私たちは息を切らしお呌吞し、グヌグルのアナリティックスチャヌトを芋お、䞀日に次の1000人の蚪問者に線が匕かれるず笑顔でがやけたす。 原則ずしお、トラフィックの増加は技術ベヌスの成長ず䞀臎せず、サむトの速床は䜎䞋し始めたす。 ここで、システム管理者がゲヌムに入りたす...

どのプロゞェクトにも垞に最適化するものがありたす。webo.inで最適化のヒントを読んで、デヌタベヌスにeaccelerator 、memcache、むンデックス怜玢フィヌルドをむンストヌルできたす。 これはすべお完了しおいるず思いたすが、サむトはただ遅いです。

nginxを最適化するずきです...


Nginxのコンパむル


組み立おるずき、私は通垞、「自分が䜿甚しおいないものをすべお切り離す」ずいうルヌルに埓いたす。 そのため、圹に立たない可胜性のあるめったに䜿甚されないモゞュヌル mail、mail_ssl_module、http_perl_module、http_flv_module、http_dav_module 。 将来、いく぀かのMSモゞュヌルが必芁な堎合、再コンパむルに数分かかりたす。

コンパむル時に含めるこずが望たしいモゞュヌル http_gzip_static_module、http_stub_status_module 。

nginx nginx_datadir、... specファむル倉数 をコンパむルするためのspecファむルの䞀郚は次のずおりです。

./configure \ --prefix=%nginx_datadir \ --conf-path=%nginx_etc/nginx.conf \ --sbin-path=%{_sbindir}/%{name} \ --error-log-path=%nginx_log/nginx.error.log \ --http-log-path=%nginx_log/nginx.log \ --http-client-body-temp-path=%nginx_spool/tmp/client \ --http-proxy-temp-path=%nginx_spool/tmp/proxy \ --http-fastcgi-temp-path=%nginx_spool/tmp/fastcgi \ --pid-path=%_var/run/nginx.pid \ --user=%nginx_user \ --group=%nginx_group \ --with-cc-opt="-I %_includedir/pcre/" \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_perl_module 



Nginx config-シンプルで明確


Nginxは管理者向けの管理者を䜜成したした。 この事実は、構成の構文ず構成の容易さにプラスの圱響を䞎えたした。
単玔な蚭定の抂芁を説明し、そのディレクティブを分析したす。
 user nginx; #   ,      worker_processes 8; #     gettimeofday(),      timer_resolution 100ms; #       RLIMIT_NOFILE   . worker_rlimit_nofile 8192; #       -20  20 (     ). worker_priority -5; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 2048; # use kqueue;  freebsd (  ) use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; #  sendfile().  sendfile()   ,    , #     . sendfile on; keepalive_timeout 65; gzip on; gzip_min_length 1100; gzip_buffers 64 8k; gzip_comp_level 3; gzip_http_version 1.1; gzip_proxied any; gzip_types text/plain application/xml application/x-javascript text/css; # Load config files from the /etc/nginx/conf.vs directory include /etc/nginx/conf.vs/*.conf; } 


単玔な仮想サヌバヌ構成の䟋
 server { listen 80; server_name _; location / { gzip_static on; root /var/nginx/html; index index.html index.htm; } error_page 404 /404.html; location = /404.html { root /var/nginx/html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/nginx/html; } } 

いく぀かの指什に぀いおコメントしたしたが、いく぀かは埌で怜蚎したす。 泚意すべき䞻なこずは、ほずんどの堎合、ドキュメントがなくおも構文が理解できるこずです。


Nginxサヌバヌの監芖


nginx configでは、セクションを芏定したす
  location = /stat { stub_status on; access_log off; allow xx.xx.xx.xx; deny all; } 

珟圚、nginxの統蚈はhttp://simple.com/statで衚瀺できたす。

䟿宜䞊、nginxによっおホストされおいるapacheの統蚈を構成するこずもお勧めしたす。 これを行うには、たずmod_rpafモゞュヌルをむンストヌルしたす。これにより、ApacheはIP nginxではなくクラむアントのIPアドレスを「芋る」 こずができたす  ここでは、私のバヌゞョンのrpaf srpmをダりンロヌドしおコンパむルできたす 。
 LoadModule rpaf_module modules/mod_rpaf-2.0.so # # Mod rpaf # RPAFenable On RPAFsethostname On RPAFproxy_ips 127.0.0.1 xx.xx.xx.xx RPAFheader X-Forwarded-For 

同様の機胜を提䟛する代替モゞュヌルmod_extract_forwardedがありたすFedoraリポゞトリで利甚可胜。  ティモシャに感謝

統蚈衚瀺モゞュヌルを接続したす。
 ExtendedStatus On SetHandler server-status Deny from all Allow from xx.xx.xx.xx 
珟圚、Apacheの統蚈はhttp://simple.com/apache-statで衚瀺できたす。


静的コンテンツの皮類


条件付きで静的を2぀のカテゎリに分割したす。
軜いコンテンツ html、css、js、xml、rss、txt。 圧瞮率が高く、保存スペヌスもほずんど必芁ありたせん。 いずれの堎合でも、nginxを䜿甚するず、パフォヌマンスが倧幅に向䞊したす。
「重い」コンテンツ 写真、ビデオ、オヌディオファむル。 ボトルネックは、䞻にディスクシステム、RAMのサむズ、およびチャネルの垯域幅です。 このタむプのコンテンツを配信するタスクは、コンテンツの保存ず、実際にはコンテンツの配信ずいう2぀に分けられたす。 nginxを䜿甚するず、最小限のメモリ消費ずCPU時間を実珟できたすが、負荷を増やしおも、RAIDアレむを収集する必芁がありたす。

サむトの速床が䜎䞋し始めたらどうするか


たあ、たず、パニックにならないでください。 おそらく、あなたのサむトで人気が出るのはこの瞬間です:)
原則ずしお、スロヌダりンするのはnginxではなく、バック゚ンド動的コンテンツを生成するサヌバヌ、たたはよくあるこずですが、デヌタベヌスサヌバヌ、ディスク領域が䞍足し、スヌパヌデュパヌアナラむザヌが起動しおすべおのリ゜ヌスを取埗したす。
この蚘事では、nginxが疑われる堎合に぀いお怜蚎したす。 サヌバヌの問題を䞀時的に緩和するために、䜕を匷化できたすか
  1. worker_processesの数を増やしおみおください。nginxの䜜成者は、コアの数に応じおそれらをむンストヌルするこずをお勧めしたす。 この数は、「コアの数」〜「コアの数x 2」の範囲でほが倉化したしたが、接続の確立は高速になりたしたが、http-requestの凊理は垞に効率的ではありたせん。 worker_connections1人のワヌカヌのコネクシンの最倧数がただあるこずを忘れないでください
  2. worker_priorityを-5以䞋に蚭定するず圹立ちたす最倧-20。 他のサヌビスが著しく遅くなり始める可胜性があるため、ここで泚意しおください。 サヌバヌでは、このオプションは-5に蚭定されおいたす。 倀が䜎いほど、nginxの優先床が高くなりたす
  3. 小さなファむルの倧量の出力ず䜎速のハヌドドラむブを䜿甚するず、access_log offログの䞀時的なシャットダりンが圹立ちたす。
  4. UPDnoatimeオプションを䜿甚しお、配垃元のディスクをマりントしたす。これにより、ディスクぞの曞き蟌み操䜜の回数が枛りたす。  coolspot 、 pwlnw 、 alfaのアむデアをありがずう
  5. ボトルネックを探しお、修正できたす。 コマンドが圹立ちたすtop、iostat、df -h、iptraf
  6. RAMを远加するか、ディスクシステムをアップグレヌドしたすたずえば、RAIDアレむをむンストヌルし、SSDハヌドドラむブを詊すこずができたす



最適化テクニック


軜量コンテンツ

  1. 仮想ディスク。
    仮想ディスクtmpfsたたはramfs、フォルダヌjs、css、むメヌゞコンテンツではなくデザむンに関連する画像が少量ある堎合を䜜成し、そこに転送し、nginx configに個別に曞き蟌みたす
    堎所/ js / {
    ルヌト/var/www/img_virtual/auto.ria.ua/js
    }
    ...
    再起動時に仮想ディスクが自動的に䜜成されるようにするには、 / etc / fstabに远加したす
    なし/ var / www / img_virtual tmpfsサむズ= 1g、モヌド= 1777 0 0
    起動時に、1Gディスクが自動的に䜜成されたす
    ここでは、次の状況に泚意する必芁がありたす。静的ファむルがシステムキャッシュに萜ちた堎合、システムキャッシュからの戻り速床は仮想ディスクからの戻り速床に等しくなりたす。 蚀い換えるず、配垃されるすべおの「軜い」静的の総量が少ない堎合、仮想ディスクの必芁はもうありたせんテストを実行しおこれを確認するように促しおくれたmaxpに感謝したす
  2. Gzipコンテンツの圧瞮
    仮想フォルダヌで実行する
    for i in `find ./* -type f -name '* .js'`; ゚コヌ$ i; gzip -c -9 $ i> $ i.gz; 完了;
    for i in `find ./* -type f -name '* .css'`; ゚コヌ$ i; gzip -c -9 $ i> $ i.gz; 完了;
    nginx構成で、次の行にgzip_staticを远加したす。
    堎所/ js / {
    gzip_static on;
    ルヌト/var/www/img_virtual/auto.ria.ua/js
    }
    動的ファむルのオンラむンパッケヌゞを有効にするこずもできたす。
    堎所/ {
    gzip on;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_comp_level 3;
    gzip_typesテキスト/プレヌンアプリケヌション/ xmlアプリケヌション/ x-javascriptテキスト/ css;

    ルヌト/var/www/auto.ria.ua/
    }
  3. コンテンツプロキシヘッダヌ
    ヘッダヌで静的コンテンツの有効期間を指定するず、負荷も軜枛されたす。 このために、 expiresディレクティブを䜿甚したす 。 コンテンツが倉曎されない堎合、expires maxを䜿甚できたす。 1dを期限切れにしおも、良い結果が埗られたす。
  4. ファむル蚘述子キャッシュ
    これにより、ディレクトリ階局が拡匵された小さなファむルが倚数ある堎合にパフォヌマンスが向䞊したす。 存圚しないファむルぞのアクセスをキャッシュするこずもできたす。 次のようになりたす。
    堎所/ {
    root / var / www /;


    open_file_cache max = 1024非アクティブ= 600s;
    open_file_cache_valid 2000s;
    open_file_cache_min_uses 1;
    open_file_cache_errors on;
    }

重いコンテンツ

  1. たず、コンテンツの配信時にスワップが䜿甚されおいるかどうかに泚意する必芁がありたす。 スワップが䜿甚されおいる堎合、 スワップが通垞のSATAハヌドドラむブにある堎合は問題になりたす。 Swingはsendfileカヌネルの方法が奜きで、確かにプログレッシブテクノロゞヌですが、 swapを䜿甚するずリタヌンに倧きく圱響し、 sendfileディレクティブでsendfileを無効にし、 output_buffers 2 64kなどの最適な出力を遞択しようずしたす。
    sendfileをオフにした構成䟋
    sendfile off;
    tcp_nodelay on;
    output_buffers 2 64k;
    倚くはシステムで䜿甚されるカヌネルに䟝存するずいう事実に泚意を喚起したす。これはkernels = 2.6.27で助けになりたした。
  2. RAMが蚱せば、最も芁求の倚いファむルを配眮する仮想ディスクを䜜成したす。たずえば、10分ごずに、これらのファむルのリストを調敎できたす。 これで、 try_filesディレクティブを適甚できたす。
    堎所/ {
    root / var / www /;
    try_files / img_virtual / hot / $ uri ストレヌゞ ;
    }

    ロケヌションストレヌゞ {
    proxy_pass http//バック゚ンド;
    proxy_set_header Host $ host;
    }
    ファむルが芋぀からない堎合、バック゚ンドは仮想ディスク䞊でアクセスされたす。

    通垞、「ホットコンテンツ」は党䜓の10未満です。

    キャッシュ圢成プログラムを䜜成できない堎合は、 proxy_storeディレクティブを䜿甚したす
    ロケヌションストレヌゞ {
    proxy_pass http//バック゚ンド;
    proxy_set_header Host $ host;

    proxy_store on;
    proxy_store_accessナヌザヌrwグルヌプrw allr;
    proxy_temp_path / var / www / img_virtual / hot /;
    root / var / www / img_virtual / hot /;
    }
    この構成では、芁求された各ファむルがキャッシュされたす。
    時間が経぀に぀れお、クラりンを実行する最も簡単な方法であるキャッシュを䜕らかの方法でクリヌンアップする必芁がありたす。
    cd / var / www / img_virtual / hot /
    find ./ -type f -amin +60 -delete
    ファむルがキャッシュから60分以䞊芁求されない堎合、削陀したす
  3. ストレヌゞが倧きい堎合、テラバむトがかかりたす-問題は運甚䞊解決できたせん。 フロント゚ンドでRAIDを構築できたす。 フェむクレむドを䜿甚するこずはお勧めしたせん。これはアップグレヌド時や光が消えるずきに頭痛の皮です SASネゞを増やし、本栌的なRAIDコントロヌラヌを䜿甚したすhostraidはありたせん。 スワップ、スプヌル、およびキャッシュをそこにマりントし、コンテンツを頻繁に倉曎せず、キャッシュを頻繁に曞き換えないようにするには、SSDハヌドドラむブを䜿甚できたす。 これはすぐに動䜜したす。このようなハヌドドラむブには、シヌクツヌシヌク、䜎消費電力Intel X25-M 0.15Wなど、良奜な転送速床最倧250 MB / sなどの特性がありたせん。
  4. プロキシされたリク゚ストをキャッシュしたす。
    2009幎3月23日に、次のベヌタ版nginx 0.7.44がリリヌスされたした。このリリヌスでは、プロキシされたリク゚ストをキャッシュするための実隓的なサポヌトが登堎したした。 nginxナヌザヌにずっおこのむベントの重芁性を過倧評䟡するこずは困難です。 著者nginxは、倧量の静電気の分垃を管理する匷力なツヌルを提䟛しおくれたす。
    なぜそのようなキャッシュが必芁なのですか この質問に察する答えは、䞻にディスク操䜜ずネットワヌク操䜜の異なる「コスト」に関連しおいたす。 倚くの堎合、ディスクに「行く」こずは、ネットワヌクにアクセスするよりもはるかに「安く」なりたす。 このようなキャッシングの䞻な目的は、必芁な最小限のネットワヌク操䜜ずディスクキャッシュの「むンテリゞェント管理」を削枛するこずです。
    プロキシ芁求のキャッシュ蚭定の詳现をご芧ください。

Source: https://habr.com/ru/post/J56497/


All Articles