• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Nginx勉強会と少しハンズオン
 

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

on

  • 4,169 views

仮です

仮です

Statistics

Views

Total Views
4,169
Views on SlideShare
4,168
Embed Views
1

Actions

Likes
3
Downloads
37
Comments
0

1 Embed 1

https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • 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 FIN ACK SYN ACK FIN ACK ACK ACK DATA 終了
    • ブロードバンド時代にそんなに問題?速いネットワークからしかアクセスがないサイトならぶっちゃけ気にしなくてもいいかもスマフォ用のサイトだと、クライアントからサーバまでの通信速度が遅いと、毎回コネクション開始処理がはいるので・・・
    • じゃー keep-alive を有効にすればapache + php の場合、接続が残り続けるとapacheのプロセスが残り続けるので、意外とプロセス数が限界まで増えて死にますphp ってapache上だと prefork でしか動かない
    • プロキシサーバを置くとクライアント プロキシサーバ webサーバ ここの間のパケットのやりとりは少なく ここの間のパケットのやりとりはたくさん
    • プロキシサーバとWebサーバの間は通信速いからOK
    • 他にもWEBサーバ(アプリケーションサーバ)を横にたくさん並べられるドメインで振り分け先を変えられる(L7のロードバランサだとお値段が・・・)
    • nginxをプロキシに置くときの注意バックエンドapache側で、アクセス制限できない(これできるかも、でもやんない方がいい)apacheにmod_rpafとか入れないと送信元IPアドレスが取れない(phpの$_SERVER["REMOTE_ADDR"]など)
    • 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; }
    • 最大コネクション数を増やしたかったらファイルディスクリプト制限の緩和が必要nginx起動時(前)にulimit -n 102400もしくはカーネルパラメータで
    • 基本設定つづき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 on; tcp_nopush off; client_max_body_size 12M; keepalive_timeout 65; server_tokens off; proxy_buffering off; include /etc/nginx/conf.d/*.conf;}
    • いろいろ設定変えてみた結果あんまり負荷とか速度とか変わんなかったnginxプロキシサーバ、軽すぎ
    • apacheのバーチャルドメインみたいに管理が大変なので/etc/nginx/conf.d/domain2.com.confみたいにして、ドメインごとにファイル分けてますincludeで他設定ファイル読み込み(apacheと同じ)include /etc/nginx/conf.d/*.conf;
    • ドメイン別 (バーチャルドメインぽく) 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; } }
    • 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分休み(切り離される)
    • 他、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を渡すため
    • 設定例 ユーザエージェントで振り分け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;}
    • 特定の条件で 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;}
    • 複数の条件で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;}
    • いちおう回避策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;}
    • 設定ファイルのみでできなかったことちょっと複雑な画像変換ヘッダーに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://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
    • ハンズオン (Mac、Windowsユーザ)Windowsのバイナリが32bit版しかなかった持ってるノートパソコンは64bitWindows\(^o^)/Mac持ってない\(^o^)/
    • 簡易WEBサーバを立てるなんでもいいけど、python好きなのでmkdir port8000servercd port8000serverecho Port 8000 server > index.htmlpython -m SimpleHTTPServer 8000別ターミナルでmkdir port8001servercd port8001serverecho Port 8001 server > index.htmlpython -m SimpleHTTPServer 8001
    • 開始とか終了とか実際に運用するときは起動スクリプト使うよexport PATH=$PATH:/usr/local/nginx/sbin設定確認nginx -t起動nginx終了nginx -s stop再読み込みngnix -s reload設定ファイルの場所/usr/local/nginx/conf
    • いろいろやってみよう