Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
nginx勉強会とハンズオン
nginx導入までの経緯keep-aliveを有効にしたい静的webサーバと動的webサーバを別にしたいPage Speed や YSlowでハイスコアが出したい
keep-alive って何?TCPは3(ウェイ)ハンドシェイクkeep-aliveがオフの場合、データ毎に3(ウェイ)ハンドシェイクが行われる   何が問題??
keep-aliveがオフの場合リクエストごとにパケットのやりとりが発生する毎回はじめの3回パケットのやりとりが発生終わりの切断確認通信 4回WEBページって画像とかJSファイルとかいろいろあるよね
開始時                         終了時クライアント             webサーバ   クライアント              webサーバ           SYN                       ...
ブロードバンド時代にそんなに問題?速いネットワークからしかアクセスがないサイトならぶっちゃけ気にしなくてもいいかもスマフォ用のサイトだと、クライアントからサーバまでの通信速度が遅いと、毎回コネクション開始処理がはいるので・・・
じゃー keep-alive を有効にすればapache + php の場合、接続が残り続けるとapacheのプロセスが残り続けるので、意外とプロセス数が限界まで増えて死にますphp ってapache上だと prefork でしか動かない
プロキシサーバを置くとクライアント                    プロキシサーバ                   webサーバ     ここの間のパケットのやりとりは少なく       ここの間のパケットのやりとりはたくさん
プロキシサーバとWebサーバの間は通信速いからOK
他にもWEBサーバ(アプリケーションサーバ)を横にたくさん並べられるドメインで振り分け先を変えられる(L7のロードバランサだとお値段が・・・)
nginxをプロキシに置くときの注意バックエンドapache側で、アクセス制限できない(これできるかも、でもやんない方がいい)apacheにmod_rpafとか入れないと送信元IPアドレスが取れない(phpの$_SERVER["REMOTE_A...
nginx基本設定  user nginx;  worker_processes 2;  worker_rlimit_nofile 8192;  error_log /var/log/nginx/error.log debug;        ...
最大コネクション数を増やしたかったらファイルディスクリプト制限の緩和が必要nginx起動時(前)にulimit -n 102400もしくはカーネルパラメータで
基本設定つづきhttp {  include     /etc/nginx/mime.types;  default_type application/octet-stream;  log_format main          $remot...
基本設定その続き    sendfile     on;    tcp_nopush     off;    client_max_body_size 12M;    keepalive_timeout 65;    server_tokens...
いろいろ設定変えてみた結果あんまり負荷とか速度とか変わんなかったnginxプロキシサーバ、軽すぎ
apacheのバーチャルドメインみたいに管理が大変なので/etc/nginx/conf.d/domain2.com.confみたいにして、ドメインごとにファイル分けてますincludeで他設定ファイル読み込み(apacheと同じ)include...
ドメイン別 (バーチャルドメインぽく)  server { # simple reverse-proxy      listen      80;      server_name domain2.com www.domain2.com;   ...
upstream.confupstream big_server_com {    server 127.0.0.1:8000 max_fails=2 fail_timeout=10m;    server 127.0.0.1:8001 max...
他、apacheバックエンド時に必要な設定 proxy_set_header   Host        $host; proxy_set_header   X-Real-IP    $remote_addr; proxy_set_header...
設定例 ユーザエージェントで振り分けlocation / {    if ($http_user_agent ~ FireFox) {        proxy_pass http://aaa;    }    if ($http_user_a...
特定の条件で rewriteset $ex_rewrite 1;if ( $remote_addr ~ 192.168.0. ) {    set $ex_rewrite 1;}if ( $remote_addr = 192.168.1.101...
複数の条件でset $ex_rewrite 0;if ( $remote_addr ~ 192.168.1. ) {    if ( $http_user_agent ~ FireFox) {        set $ex_rewrite 1;...
いちおう回避策set $ex_address = 0;set $ex_rewrite = 0;if ( $remote_addr ~ 192.168.1. ) {    set $ex_address 1;}if ( $http_user_ag...
設定ファイルのみでできなかったことちょっと複雑な画像変換ヘッダーにetagの付与特定のIPアドレスからだとBasic認証なし、他はありのような構成perlモジュールかluaモジュール入れてなんとか
それ ApacheでもできるよねCPUとかメモリとかリソースに余裕があってもアクセスさばけない問題C10K問題でググってみよう実際に使ってみたら、とにかく負荷が低い(就業先の許可があればグラフを載せたい・・・)
設定ファイルの書き方が好きif とか使いながら設定ファイル書くと後から読みやすい!未だにApacheの設定ファイルわけわかんなくなる
ハンズオン! (Ubuntuユーザ)apt-get install libpcre3 libpcre3-devapt-get install zlib1g-devapt-get install libperl-devwget http://ng...
ハンズオン (Mac、Windowsユーザ)Windowsのバイナリが32bit版しかなかった持ってるノートパソコンは64bitWindows\(^o^)/Mac持ってない\(^o^)/
簡易WEBサーバを立てるなんでもいいけど、python好きなのでmkdir port8000servercd port8000serverecho Port 8000 server > index.htmlpython -m SimpleHTT...
開始とか終了とか実際に運用するときは起動スクリプト使うよexport PATH=$PATH:/usr/local/nginx/sbin設定確認nginx -t起動nginx終了nginx -s stop再読み込みngnix -s reload設...
いろいろやってみよう
Upcoming SlideShare
Loading in …5
×

Nginx勉強会と少しハンズオン

6,581 views

Published on

仮です

Nginx勉強会と少しハンズオン

  1. 1. nginx勉強会とハンズオン
  2. 2. nginx導入までの経緯keep-aliveを有効にしたい静的webサーバと動的webサーバを別にしたいPage Speed や YSlowでハイスコアが出したい
  3. 3. keep-alive って何?TCPは3(ウェイ)ハンドシェイクkeep-aliveがオフの場合、データ毎に3(ウェイ)ハンドシェイクが行われる 何が問題??
  4. 4. keep-aliveがオフの場合リクエストごとにパケットのやりとりが発生する毎回はじめの3回パケットのやりとりが発生終わりの切断確認通信 4回WEBページって画像とかJSファイルとかいろいろあるよね
  5. 5. 開始時 終了時クライアント webサーバ クライアント webサーバ SYN FIN ACK SYN ACK FIN ACK ACK ACK DATA 終了
  6. 6. ブロードバンド時代にそんなに問題?速いネットワークからしかアクセスがないサイトならぶっちゃけ気にしなくてもいいかもスマフォ用のサイトだと、クライアントからサーバまでの通信速度が遅いと、毎回コネクション開始処理がはいるので・・・
  7. 7. じゃー keep-alive を有効にすればapache + php の場合、接続が残り続けるとapacheのプロセスが残り続けるので、意外とプロセス数が限界まで増えて死にますphp ってapache上だと prefork でしか動かない
  8. 8. プロキシサーバを置くとクライアント プロキシサーバ webサーバ ここの間のパケットのやりとりは少なく ここの間のパケットのやりとりはたくさん
  9. 9. プロキシサーバとWebサーバの間は通信速いからOK
  10. 10. 他にもWEBサーバ(アプリケーションサーバ)を横にたくさん並べられるドメインで振り分け先を変えられる(L7のロードバランサだとお値段が・・・)
  11. 11. nginxをプロキシに置くときの注意バックエンドapache側で、アクセス制限できない(これできるかも、でもやんない方がいい)apacheにmod_rpafとか入れないと送信元IPアドレスが取れない(phpの$_SERVER["REMOTE_ADDR"]など)
  12. 12. nginx基本設定 user nginx; worker_processes 2; worker_rlimit_nofile 8192; error_log /var/log/nginx/error.log debug; オススメ pid /var/run/nginx.pid; events { worker_connections 4096; }
  13. 13. 最大コネクション数を増やしたかったらファイルディスクリプト制限の緩和が必要nginx起動時(前)にulimit -n 102400もしくはカーネルパラメータで
  14. 14. 基本設定つづき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;
  15. 15. 基本設定その続き sendfile on; tcp_nopush off; client_max_body_size 12M; keepalive_timeout 65; server_tokens off; proxy_buffering off; include /etc/nginx/conf.d/*.conf;}
  16. 16. いろいろ設定変えてみた結果あんまり負荷とか速度とか変わんなかったnginxプロキシサーバ、軽すぎ
  17. 17. apacheのバーチャルドメインみたいに管理が大変なので/etc/nginx/conf.d/domain2.com.confみたいにして、ドメインごとにファイル分けてますincludeで他設定ファイル読み込み(apacheと同じ)include /etc/nginx/conf.d/*.conf;
  18. 18. ドメイン別 (バーチャルドメインぽく) server { # simple reverse-proxy listen 80; server_name domain2.com www.domain2.com; access_log logs/domain2.access.log main; # serve static files location ~ ^/(images|javascript|js|css|flash|media|static)/ { root /var/www/virtual/big.server.com/htdocs; expires 30d; } # pass requests for dynamic content to rails/turbogears/zope, et al location / { proxy_pass http://127.0.0.1:8080; } }
  19. 19. upstream.confupstream big_server_com { server 127.0.0.1:8000 max_fails=2 fail_timeout=10m; server 127.0.0.1:8001 max_fails=2 fail_timeout=10m weight=5;} タイムアウトするかコネクションがはれなければ 次サーバをチェック(デフォルト) max_fails=2 、fail_timeout=10m 2回失敗したら10分休み(切り離される)
  20. 20. 他、apacheバックエンド時に必要な設定 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;Apacheにドメインや送信元IPを渡すため
  21. 21. 設定例 ユーザエージェントで振り分けlocation / { if ($http_user_agent ~ FireFox) { proxy_pass http://aaa; } if ($http_user_agent ~ Chrome) { proxy_pass http://bbb; }}upstream aaa { server 127.0.0.1:8000; server 127.0.0.1:8001;}
  22. 22. 特定の条件で rewriteset $ex_rewrite 1;if ( $remote_addr ~ 192.168.0. ) { set $ex_rewrite 1;}if ( $remote_addr = 192.168.1.101 ) { set $ex_rewrite 1;}if ($ex_rewrite != 1) { rewrite ^ http://yahoo.co.jp;}
  23. 23. 複数の条件でset $ex_rewrite 0;if ( $remote_addr ~ 192.168.1. ) { if ( $http_user_agent ~ FireFox) { set $ex_rewrite 1; }}if ($ex_rewrite != 1) { rewrite ^ http://yahoo.co.jp;}
  24. 24. いちおう回避策set $ex_address = 0;set $ex_rewrite = 0;if ( $remote_addr ~ 192.168.1. ) { set $ex_address 1;}if ( $http_user_agent ~ FireFox ) { set $ex_rewrite 1;}if ( $ex_address = 1 ) { set $ex_rewrite "${ex_rewrite}1";}if ( $ex_rewrite != 11) { rewrite ^ http://yahoo.co.jp;}
  25. 25. 設定ファイルのみでできなかったことちょっと複雑な画像変換ヘッダーにetagの付与特定のIPアドレスからだとBasic認証なし、他はありのような構成perlモジュールかluaモジュール入れてなんとか
  26. 26. それ ApacheでもできるよねCPUとかメモリとかリソースに余裕があってもアクセスさばけない問題C10K問題でググってみよう実際に使ってみたら、とにかく負荷が低い(就業先の許可があればグラフを載せたい・・・)
  27. 27. 設定ファイルの書き方が好きif とか使いながら設定ファイル書くと後から読みやすい!未だにApacheの設定ファイルわけわかんなくなる
  28. 28. ハンズオン! (Ubuntuユーザ)apt-get install libpcre3 libpcre3-devapt-get install zlib1g-devapt-get install libperl-devwget http://nginx.org/download/nginx-1.2.3.tar.gztar zxf nginx-1.2.3.tar.gzcd niginx-1.2.3./configure --prefix=/usr/local/nginx --with-http_stub_status_module make -j4make install
  29. 29. ハンズオン (Mac、Windowsユーザ)Windowsのバイナリが32bit版しかなかった持ってるノートパソコンは64bitWindows\(^o^)/Mac持ってない\(^o^)/
  30. 30. 簡易WEBサーバを立てるなんでもいいけど、python好きなのでmkdir port8000servercd port8000serverecho Port 8000 server > index.htmlpython -m SimpleHTTPServer 8000別ターミナルでmkdir port8001servercd port8001serverecho Port 8001 server > index.htmlpython -m SimpleHTTPServer 8001
  31. 31. 開始とか終了とか実際に運用するときは起動スクリプト使うよexport PATH=$PATH:/usr/local/nginx/sbin設定確認nginx -t起動nginx終了nginx -s stop再読み込みngnix -s reload設定ファイルの場所/usr/local/nginx/conf
  32. 32. いろいろやってみよう

×