WEBサーバのチューニング
     CONTENTS
      ⇒ Apache
      ⇒ その他

 ※普段のデフォルトからの変更内容とその他。
    もっとこうしたほうがいいという
  ご意見ありましたらぜひ伺いたいです!


                       @smallpalace
自己紹介

ID:Twitter   smallpalace
お仕事:
  課金系ASPや各種携帯サービス運営等をしている会社
  でサーバインフラ系の仕事をしています。+主婦。
興味のあること:
  楽して高速化、効率よく設定運用し寝る時間を確保
比較的好きなこと:
  MySQL、シェルスクリプト
好きな食べ物:
  早朝メンテ明けに一人で築地に行く程度に魚が好きです。
 Apache
httpd-2.2.3-43.el5.centos.3
サーバの情報を隠ぺいする

 44,45c44
 < ServerTokens Prod
 < TraceEnable off
                         ・ ProductOnly。気休めのセキュリティ対策。バージョン
 ---                     等を隠す。
                          クライアントのリクエストに応答するヘッダ内でApache
 > ServerTokens OS       としか表示されなくなる。
                         ・ Traceメソッドを使えないようにするBasic認証のパス
                         ワードトレース防止

 532c524
 < ServerSignature Off   ・ エラーメッセージ出力時にフッタを表示しない。気休め。
 ---
 > ServerSignature On
キープアライブ関連
69c68
< Timeout 60
---
> Timeout 120           ・1分待ったらタイムアウトとする。



75c74                   ・1度の接続で複数リクエストのやり取りをする、キープ
                        アライブを有効にする。
< KeepAlive On
                        ・KeepAliveTimeoutを1ページのコンテンツが表示し終
---                     わる時間+α にする。
> KeepAlive Off
                        ・変えたことがないが、MaxKeepAliveRequestsを1
88c87                   ページあたりの最大ファイル数+α にするといいらしい。
< KeepAliveTimeout 3    ・キープアライブをONにして問題でたことはないが、
---                     OFFにした時に問題出たことはある。(混雑時間帯に
                        ロードアベレージが急騰するなど。規模的には大体
> KeepAliveTimeout 15   300~500万PV/日の環境で。)
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    要になりそう。
未使用モジュールをロードしない
162,163c161,162
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
176c175
#LoadModule dav_module modules/mod_dav.so
180c179
#LoadModule dav_fs_module modules/mod_dav_fs.so
189,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.so
mv /etc/httpd/conf.d/proxy.conf{,_bk}


※主にとめてるのは、ldapとwebdavとproxyモジュール。
  静的コンテンツと動的コンテンツをサーバごと分けたほうがよいらしく、その場合proxyモジュール使うと思われます。
遅くなるけど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が居ないのをログで確認してから。
固有の値を変える
266c265
< ServerName s.hoge.jp:80
---
> #ServerName www.example.com:80
282c281
< DocumentRoot "/home/hoge/htdocs"
---
> DocumentRoot "/var/www/html"


・ サーバ名とドキュメントルートを指定。 別名はVirtualHostコンテキストの中に、
 ServerAliasディレクティブによってスペース区切りで書ける。
Directoryオプション指定など
307c306
< <Directory "/home/hoge/htdocs">
---
> <Directory "/var/www/html">
321c320
<     Options ExecCGI FollowSymLinks
---
>     Options Indexes FollowSymLinks
328c327
<     AllowOverride All
                                  ・ ディレクトリツリーが見えてしまうのでIndexes
---                               は無効にする、CGIを有効にする
>     AllowOverride None          ・ AllowOverrideを有効にすると起動時だけで
                                    なくアクセスくるたびに走査され、効率が悪いが、
                                    開発効率的な都合で頼まれがち。Directoryを
                                    限定して設定したほうがベター。
ログの管理①
< ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/s.hoge.jp-error_log.%Y%m%d
86400 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年分残して圧縮するようにしたりなど。
ログの管理②
 ・ 終了ステータス、レスポンスタイムを知りたい時は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); };
言語の設定
721c731
< LanguagePriority   ja en ca cs da de el eo es et fr he
hr 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 hr
it ja ko ltz nl nn   no pl pt pt-BR ru sv zh-CN zh-TW

737c747
< #AddDefaultCharset UTF-8
---
> AddDefaultCharset UTF-8


・ エラードキュメント等で優先的に表示される言語を日本語にする(先頭をjaにする)。

・ デフォルト設定を無効にする(メタタグで文字コード指定されてない場合に強制的に変換表示され化けるのを防ぐ)
mod_cache メモリ

LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so


<IfModule mod_cache.c>
<IfModule mod_mem_cache.c>
CacheEnable mem /            # キャッシュ方式と対象URL
MCacheSize 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
・ ミッションクリティカルなサービスでの実績なし。手順書サーバ等に設定してみたところ体感ではかなり早くなった。
mod_cache ディスク
<IfModule mod_cache.c>
<IfModule mod_disk_cache.c>
CacheEnable disk /                   # キャッシュ方式と対象URL
CacheRoot /var/cache/apache          # キャッシュデータの保管先
CacheDirLevels 5                     # キャッシュデータを保管するディレクトリ階層の深さ
CacheDirLength 3                     # キャッシュデータを保管するディレクトリ名の文字数


CacheDisable /htdocs/output          # キャッシュしない対象URL
CacheIgnoreCacheControl 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していて逆に遅くなっていた。
 そのた(Apache以外)
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 = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10

・ 超えるとsynが捨てられるキュー数の上限を広げる(1024->8192,対複数なサーバで特に必要)
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192

・ TCPのキープアライブの間隔(7200->10,15->3)、リトライ回数(9->2)の調整(CLOSE_WAITが減る)
net.ipv4.tcp_keepalive_intvl = 3
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 10


※TCP接続をリサイクルするので実際問題が出たケースとして、、
 1つのFWのzone間の通信(NAT有り)というのがありました。
※他はスループットが良くなったとは言われても問題が出たと言われたことは特になし。
不要な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
     自動起動の設定を、止めたくないものを指定してそれ以外を止めている
コンテンツ共有に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もいいと思います(そのうち画像や音声など静的コンテンツで使いたい)。
ありがとうございました。
   もっとこうしたほうがいいという
 ご意見ありましたらぜひ伺いたいです!

Webサーバのチューニング

  • 1.
    WEBサーバのチューニング CONTENTS ⇒ Apache ⇒ その他 ※普段のデフォルトからの変更内容とその他。 もっとこうしたほうがいいという ご意見ありましたらぜひ伺いたいです! @smallpalace
  • 2.
    自己紹介 ID:Twitter smallpalace お仕事: 課金系ASPや各種携帯サービス運営等をしている会社 でサーバインフラ系の仕事をしています。+主婦。 興味のあること: 楽して高速化、効率よく設定運用し寝る時間を確保 比較的好きなこと: MySQL、シェルスクリプト 好きな食べ物: 早朝メンテ明けに一人で築地に行く程度に魚が好きです。
  • 3.
  • 4.
    サーバの情報を隠ぺいする 44,45c44 <ServerTokens Prod < TraceEnable off ・ ProductOnly。気休めのセキュリティ対策。バージョン --- 等を隠す。 クライアントのリクエストに応答するヘッダ内でApache > ServerTokens OS としか表示されなくなる。 ・ Traceメソッドを使えないようにするBasic認証のパス ワードトレース防止 532c524 < ServerSignature Off ・ エラーメッセージ出力時にフッタを表示しない。気休め。 --- > ServerSignature On
  • 5.
    キープアライブ関連 69c68 < Timeout 60 --- >Timeout 120 ・1分待ったらタイムアウトとする。 75c74 ・1度の接続で複数リクエストのやり取りをする、キープ アライブを有効にする。 < KeepAlive On ・KeepAliveTimeoutを1ページのコンテンツが表示し終 --- わる時間+α にする。 > KeepAlive Off ・変えたことがないが、MaxKeepAliveRequestsを1 88c87 ページあたりの最大ファイル数+α にするといいらしい。 < KeepAliveTimeout 3 ・キープアライブをONにして問題でたことはないが、 --- OFFにした時に問題出たことはある。(混雑時間帯に ロードアベレージが急騰するなど。規模的には大体 > KeepAliveTimeout 15 300~500万PV/日の環境で。)
  • 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.
    未使用モジュールをロードしない 162,163c161,162 #LoadModule ldap_module modules/mod_ldap.so #LoadModuleauthnz_ldap_module modules/mod_authnz_ldap.so 176c175 #LoadModule dav_module modules/mod_dav.so 180c179 #LoadModule dav_fs_module modules/mod_dav_fs.so 189,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.so mv /etc/httpd/conf.d/proxy.conf{,_bk} ※主にとめてるのは、ldapとwebdavとproxyモジュール。 静的コンテンツと動的コンテンツをサーバごと分けたほうがよいらしく、その場合proxyモジュール使うと思われます。
  • 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.
    固有の値を変える 266c265 < ServerName s.hoge.jp:80 --- >#ServerName www.example.com:80 282c281 < DocumentRoot "/home/hoge/htdocs" --- > DocumentRoot "/var/www/html" ・ サーバ名とドキュメントルートを指定。 別名はVirtualHostコンテキストの中に、 ServerAliasディレクティブによってスペース区切りで書ける。
  • 10.
    Directoryオプション指定など 307c306 < <Directory "/home/hoge/htdocs"> --- ><Directory "/var/www/html"> 321c320 < Options ExecCGI FollowSymLinks --- > Options Indexes FollowSymLinks 328c327 < AllowOverride All ・ ディレクトリツリーが見えてしまうのでIndexes --- は無効にする、CGIを有効にする > AllowOverride None ・ AllowOverrideを有効にすると起動時だけで なくアクセスくるたびに走査され、効率が悪いが、 開発効率的な都合で頼まれがち。Directoryを 限定して設定したほうがベター。
  • 11.
    ログの管理① < ErrorLog "|/usr/sbin/rotatelogs/var/log/httpd/s.hoge.jp-error_log.%Y%m%d 86400 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.
    ログの管理② ・ 終了ステータス、レスポンスタイムを知りたい時は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.
    言語の設定 721c731 < LanguagePriority ja en ca cs da de el eo es et fr he hr 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 hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW 737c747 < #AddDefaultCharset UTF-8 --- > AddDefaultCharset UTF-8 ・ エラードキュメント等で優先的に表示される言語を日本語にする(先頭をjaにする)。 ・ デフォルト設定を無効にする(メタタグで文字コード指定されてない場合に強制的に変換表示され化けるのを防ぐ)
  • 14.
    mod_cache メモリ LoadModule disk_cache_modulemodules/mod_disk_cache.so LoadModule file_cache_module modules/mod_file_cache.so LoadModule mem_cache_module modules/mod_mem_cache.so <IfModule mod_cache.c> <IfModule mod_mem_cache.c> CacheEnable mem / # キャッシュ方式と対象URL MCacheSize 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.
    mod_cache ディスク <IfModule mod_cache.c> <IfModulemod_disk_cache.c> CacheEnable disk / # キャッシュ方式と対象URL CacheRoot /var/cache/apache # キャッシュデータの保管先 CacheDirLevels 5 # キャッシュデータを保管するディレクトリ階層の深さ CacheDirLength 3 # キャッシュデータを保管するディレクトリ名の文字数 CacheDisable /htdocs/output # キャッシュしない対象URL CacheIgnoreCacheControl 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.
  • 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 = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 10 ・ 超えるとsynが捨てられるキュー数の上限を広げる(1024->8192,対複数なサーバで特に必要) net.ipv4.tcp_max_syn_backlog = 8192 net.core.somaxconn = 8192 ・ TCPのキープアライブの間隔(7200->10,15->3)、リトライ回数(9->2)の調整(CLOSE_WAITが減る) net.ipv4.tcp_keepalive_intvl = 3 net.ipv4.tcp_keepalive_probes = 2 net.ipv4.tcp_keepalive_time = 10 ※TCP接続をリサイクルするので実際問題が出たケースとして、、 1つのFWのzone間の通信(NAT有り)というのがありました。 ※他はスループットが良くなったとは言われても問題が出たと言われたことは特になし。
  • 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.
    コンテンツ共有に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.
    ありがとうございました。 もっとこうしたほうがいいという ご意見ありましたらぜひ伺いたいです!