Webサーバのチューニング

9,759 views
9,544 views

Published on

2010/12/10の勉強会で発表。
主催者ページ↓
http://d.hatena.ne.jp/oranie/20101212

Published in: Self Improvement
0 Comments
17 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,759
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
0
Comments
0
Likes
17
Embeds 0
No embeds

No notes for slide

Webサーバのチューニング

  1. 1. WEBサーバのチューニング CONTENTS ⇒ Apache ⇒ その他 ※普段のデフォルトからの変更内容とその他。 もっとこうしたほうがいいという ご意見ありましたらぜひ伺いたいです! @smallpalace
  2. 2. 自己紹介ID:Twitter smallpalaceお仕事: 課金系ASPや各種携帯サービス運営等をしている会社 でサーバインフラ系の仕事をしています。+主婦。興味のあること: 楽して高速化、効率よく設定運用し寝る時間を確保比較的好きなこと: MySQL、シェルスクリプト好きな食べ物: 早朝メンテ明けに一人で築地に行く程度に魚が好きです。
  3. 3.  Apachehttpd-2.2.3-43.el5.centos.3
  4. 4. サーバの情報を隠ぺいする 44,45c44 < ServerTokens Prod < TraceEnable off ・ ProductOnly。気休めのセキュリティ対策。バージョン --- 等を隠す。 クライアントのリクエストに応答するヘッダ内でApache > ServerTokens OS としか表示されなくなる。 ・ Traceメソッドを使えないようにするBasic認証のパス ワードトレース防止 532c524 < ServerSignature Off ・ エラーメッセージ出力時にフッタを表示しない。気休め。 --- > ServerSignature On
  5. 5. キープアライブ関連69c68< Timeout 60---> Timeout 120 ・1分待ったらタイムアウトとする。75c74 ・1度の接続で複数リクエストのやり取りをする、キープ アライブを有効にする。< KeepAlive On ・KeepAliveTimeoutを1ページのコンテンツが表示し終--- わる時間+α にする。> KeepAlive Off ・変えたことがないが、MaxKeepAliveRequestsを188c87 ページあたりの最大ファイル数+α にするといいらしい。< KeepAliveTimeout 3 ・キープアライブをONにして問題でたことはないが、--- OFFにした時に問題出たことはある。(混雑時間帯に ロードアベレージが急騰するなど。規模的には大体> KeepAliveTimeout 15 300~500万PV/日の環境で。)
  6. 6. preforkのMPM関連設定102c101< StartServers 15--- ・phpなのでpreforkつかっている。> StartServers 8 ・最初に起動しとくプロセス数、待ち受けるプロセスを増やす。 アクセス来てからプロセス生成する時間を削減する意味合い。105,107c104,106 ・ServerLimitはmunin等のグラフで見るときに見< ServerLimit 150 やすくするためにへらしてる< MaxClients 100 ・memory_limit(php.ini)*MaxClients =WEB専用機ならOS搭載メモリの6~8割くらい。< MaxRequestsPerChild 100 ・子プロセスを受け付ける最大値。超えたらメモリ--- を解放して子プロセスを再度生成> ServerLimit 256 ※MaxRequestsPerChildは100~1000の間が 適切と@ITに書いてあった。mixiは50と技術者ブ> MaxClients 256 ログか書籍か何かに書いてた。規模によるしあまり 小さくすると子プロセス生成の為のCPUコストが必> MaxRequestsPerChild 4000 要になりそう。
  7. 7. 未使用モジュールをロードしない162,163c161,162#LoadModule ldap_module modules/mod_ldap.so#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so176c175#LoadModule dav_module modules/mod_dav.so180c179#LoadModule dav_fs_module modules/mod_dav_fs.so189,193c188,192#LoadModule proxy_module modules/mod_proxy.so#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so#LoadModule proxy_http_module modules/mod_proxy_http.so#LoadModule proxy_connect_module modules/mod_proxy_connect.somv /etc/httpd/conf.d/proxy.conf{,_bk}※主にとめてるのは、ldapとwebdavとproxyモジュール。 静的コンテンツと動的コンテンツをサーバごと分けたほうがよいらしく、その場合proxyモジュール使うと思われます。
  8. 8. 遅くなるけどserver-statusをとる ExtendedStatus On <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1 </Location> ・ muninとかでグラフ化する。リダイレクトされてしまうときは127.0.0.1のvhost作って入れる。 変な動き(localhostへのアクセス)してるPGが居ないのをログで確認してから。
  9. 9. 固有の値を変える266c265< ServerName s.hoge.jp:80---> #ServerName www.example.com:80282c281< DocumentRoot "/home/hoge/htdocs"---> DocumentRoot "/var/www/html"・ サーバ名とドキュメントルートを指定。 別名はVirtualHostコンテキストの中に、 ServerAliasディレクティブによってスペース区切りで書ける。
  10. 10. Directoryオプション指定など307c306< <Directory "/home/hoge/htdocs">---> <Directory "/var/www/html">321c320< Options ExecCGI FollowSymLinks---> Options Indexes FollowSymLinks328c327< AllowOverride All ・ ディレクトリツリーが見えてしまうのでIndexes--- は無効にする、CGIを有効にする> AllowOverride None ・ AllowOverrideを有効にすると起動時だけで なくアクセスくるたびに走査され、効率が悪いが、 開発効率的な都合で頼まれがち。Directoryを 限定して設定したほうがベター。
  11. 11. ログの管理①< ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/s.hoge.jp-error_log.%Y%m%d86400 540"---> ErrorLog logs/error_log< SetEnvIf Request_URI "root¥.exe" nolog< SetEnvIf Request_URI "Admin¥.dll" nolog< SetEnvIf Request_URI "NULL¥.IDA" nolog ・ ワームやmuninやロードバランサから< SetEnvIf Request_URI "chk¥.html" nolog のアクセスはログに記録しないことで無< SetEnvIf Request_URI "server-status" nolog 駄なI/Oを減らす。< SetEnvIf User-Agent libwww-perl nolog ・ 1日で切りまわして巨大なファイルにな< SetEnvIf Remote_Host "127¥.0¥.0¥.1" nolog らないようにする。< CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/logs/s.hoge.jp-access_log.%Y%m%d 86400 540" combined env=!nolog---> CustomLog logs/access_log combined・ 別途findで昨日までのログを圧縮したり1年前の古いログの削除などをするスクリプトを作りcronでまわす。 他にsyslogは1年分残して圧縮するようにしたりなど。
  12. 12. ログの管理② ・ 終了ステータス、レスポンスタイムを知りたい時はLogFormatに%Xと%Dを追加する。504c485< LogFormat "%h %l %u %t ¥"%r¥" %>s %b ¥"%{Referer}i¥" ¥"%{User-Agent}i¥" %X %D" combined---> LogFormat "%h %l %u %t ¥"%r¥" %>s %b ¥"%{Referer}i¥" ¥"%{User-Agent}i¥"" combined・ 複数WEBサーバの場合はloggerで渡してrsyslogでtcpで(@2つ指定するとtcp)転送してログサーバのsyslog-ngで受け取ってWEBサーバのI/Oを削減して高速化。 ログサーバ側は結構負荷かかる為、接続上限増やしsysctl.conf設定等を行う。 httpd.conf: CustomLog "|/usr/bin/logger -p local6.info -t httpacc_`uname -n`" combined rsyslog.conf: *.info;mail.none;authpriv.none;cron.none;local6.none /var/log/messages local6.info @@log-server-ip syslog-ng.conf: source src { unix-stream ("/dev/log"); internal(); tcp(ip("0.0.0.0") port(514) max_connections(1000)); }; destination httpacc { file("/var/log/syslog-ng/access_log_$HOST" template(t_msgonly)); }; destination httperr { file("/var/log/syslog-ng/error_log_$HOST" template(t_msgonly)); }; filter f_httpacc { facility(local6) and level(info) and program(httpacc_); }; filter f_httperr { facility(local6) and level(info) and program(httperr_); }; log { source(src); filter(f_httpacc); destination(httpacc); flags(final); }; log { source(src); filter(f_httperr); destination(httperr); flags(final); };
  13. 13. 言語の設定721c731< LanguagePriority ja en ca cs da de el eo es et fr hehr it ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW---> LanguagePriority en ca cs da de el eo es et fr he hrit ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW737c747< #AddDefaultCharset UTF-8---> AddDefaultCharset UTF-8・ エラードキュメント等で優先的に表示される言語を日本語にする(先頭をjaにする)。・ デフォルト設定を無効にする(メタタグで文字コード指定されてない場合に強制的に変換表示され化けるのを防ぐ)
  14. 14. mod_cache メモリLoadModule disk_cache_module modules/mod_disk_cache.soLoadModule file_cache_module modules/mod_file_cache.soLoadModule mem_cache_module modules/mod_mem_cache.so<IfModule mod_cache.c><IfModule mod_mem_cache.c>CacheEnable mem / # キャッシュ方式と対象URLMCacheSize 65536 # キャッシュメモリの最大値(Kbyte)MCacheMaxObjectCount 100 # キャッシュに保管されるドキュメント最大数MCacheMinObjectSize 1 # キャッシュに保管されるドキュメント最小数MCacheMaxObjectSize 2048 # キャッシュに保管されるドキュメント一つ当たりの最大サイズ(byte)</IfModule></IfModule>・ 上記はSoftwareDesign2008/10 に掲載されていたそのまま。 http://smallpalace.jpn.ph/html/modules/pico0/index.php?content_id=250・ ミッションクリティカルなサービスでの実績なし。手順書サーバ等に設定してみたところ体感ではかなり早くなった。
  15. 15. mod_cache ディスク<IfModule mod_cache.c><IfModule mod_disk_cache.c>CacheEnable disk / # キャッシュ方式と対象URLCacheRoot /var/cache/apache # キャッシュデータの保管先CacheDirLevels 5 # キャッシュデータを保管するディレクトリ階層の深さCacheDirLength 3 # キャッシュデータを保管するディレクトリ名の文字数CacheDisable /htdocs/output # キャッシュしない対象URLCacheIgnoreCacheControl On # リクエストヘッダ無視し強制的にキャッシュから返す CacheIgnoreNoLastMod On # 最終更新時刻のないヘッダでも強制キャッシュ CacheStorePrivate On # ヘッダのCache-ControlがPrivateでも強制キャッシュ CacheMaxExpire 2592000 # キャッシュの有効期間を秒で指定 CacheMaxFileSize 1000000 # キャッシュを許容する最大ファイルサイズ(byte) CacheMinFileSize 100 # キャッシュを許容する最小ファイルサイズ(byte) CacheStoreNoStore On #ヘッダのCache-ControlがNo-Storeでも強制キャッシュ</IfModule></IfModule>・ お客様が使ってるのを見かけた。ただし仮想サーバでディスクI/Oが多いのは避けるべき。(急に落ちたりしていた)・ 手順書サーバ等に設定してみたところ体感ではメモリよりは遅く、数日後みたらswapしていて逆に遅くなっていた。
  16. 16.  そのた(Apache以外)
  17. 17. sysctl.conf カーネルパラメータ調整(kernel2.6/CentOS5.5)・ swap発生しづらくする(60->30,DB専用機の場合は0にする)vm.swappiness=30・ TCPのfinwaitをリサイクル(0->1)、タイムアウト値(60->10)を短くする(NAT環境では非推奨)net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 10・ 超えるとsynが捨てられるキュー数の上限を広げる(1024->8192,対複数なサーバで特に必要)net.ipv4.tcp_max_syn_backlog = 8192net.core.somaxconn = 8192・ TCPのキープアライブの間隔(7200->10,15->3)、リトライ回数(9->2)の調整(CLOSE_WAITが減る)net.ipv4.tcp_keepalive_intvl = 3net.ipv4.tcp_keepalive_probes = 2net.ipv4.tcp_keepalive_time = 10※TCP接続をリサイクルするので実際問題が出たケースとして、、 1つのFWのzone間の通信(NAT有り)というのがありました。※他はスループットが良くなったとは言われても問題が出たと言われたことは特になし。
  18. 18. 不要なcron・サービスの停止 # chmod 0 /etc/cron.daily/makewhatis.cron # chmod 0 /etc/cron.daily/mlocate.cron # chmod 0 /etc/cron.daily/prelink # chmod 0 /etc/cron.daily/0logwatch # chmod 0 /etc/cron.weekly/makewhatis.cron # chmod 0 /etc/cron.weekly/99-raid-check ・仮想サーバだと、相載せのサーバとI/Oなどのリソースを共有してるので、 明け方の負荷の低い時間帯だとしても皆で同じ時間に負荷の高いcronが動いた場合、落ちたり切替ったり遅くなったりする。 故に必要ない処理は一切しないように止めておいた方がいい。 # chkconfig --list | grep 3:on | awk {print $1} ¥ |grep -Ev "anacron|crond|haldaemon|messagebus|httpd|munin- node|network|sshd|syslog|sysstat" > /root/stopinitscript # cat /root/stopinitscript # STOPD=`cat /root/stopinitscript` # for i in $STOPD; do chkconfig $i off; done # chkconfig --list | grep 3:on 自動起動の設定を、止めたくないものを指定してそれ以外を止めている
  19. 19. コンテンツ共有にNFSは使わないコンテンツ同期はrsync等を使う。まだNFSなとこは以下調整している。・NFSプロセス増やす(cat /proc/net/rpc/nfsd |grep thして右側の数字が増えてたら) RPCNFSDCOUNT=8 -> 32 (/etc/init.d/nfs)・起動時にプロセスに割り当てるメモリ増やす start) echo 262144 > /proc/sys/net/core/rmem_default echo 524288 > /proc/sys/net/core/rmem_max echo 262144 > /proc/sys/net/core/wmem_default echo 524288 > /proc/sys/net/core/wmem_max nfs起動処理 echo 110592 > /proc/sys/net/core/rmem_default echo 131071 > /proc/sys/net/core/rmem_max echo 110592 > /proc/sys/net/core/wmem_default echo 131071 > /proc/sys/net/core/wmem_max・マウントオプション非同期にする /dir 192.168.0.0/255.255.255.0(async,rw,no_root_squash)・マウントオプションで一度にやり取りする量をふやす hard,intr,async,bg,rsize=32768,wsize=32768 ※サイズの算出方法:上限はカーネルによって異なる。kernelソースのinclude/linux/nfsd/const.h にあるNFSSVC_MAXBLKSIZE で決まる・ガベージコレクションを無効にしてセッションはNAS側で消す session.gc_probability = 1 -> 0 find /data/phpsession -name "sess_*" -size -100 -type f -amin +180 -exec rm -f {} ¥;・mod_cacheもいいと思います(そのうち画像や音声など静的コンテンツで使いたい)。
  20. 20. ありがとうございました。 もっとこうしたほうがいいという ご意見ありましたらぜひ伺いたいです!

×