SlideShare una empresa de Scribd logo
1 de 20
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もいいと思います(そのうち画像や音声など静的コンテンツで使いたい)。
ありがとうございました。
   もっとこうしたほうがいいという
 ご意見ありましたらぜひ伺いたいです!

Más contenido relacionado

La actualidad más candente

XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみよう
Akio Ishida
 

La actualidad más candente (20)

さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)
 
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーションイルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
 
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違いバックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い
 
PostgreSQL and RAM usage
PostgreSQL and RAM usagePostgreSQL and RAM usage
PostgreSQL and RAM usage
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
 
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
 
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
 
Amazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニングAmazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニング
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします
 
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
 
脆弱性スキャナVuls(応用編)
脆弱性スキャナVuls(応用編)脆弱性スキャナVuls(応用編)
脆弱性スキャナVuls(応用編)
 
Rustを支える技術
Rustを支える技術Rustを支える技術
Rustを支える技術
 
High Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando PatroniHigh Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando Patroni
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
ioMemoryとAtomic Writeによるデータベース高速化
ioMemoryとAtomic Writeによるデータベース高速化ioMemoryとAtomic Writeによるデータベース高速化
ioMemoryとAtomic Writeによるデータベース高速化
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)
 
XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみよう
 

Similar a Webサーバのチューニング

MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティングMTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
純生 野田
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
Ryosuke IWANAGA
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
Yoshinori Matsunobu
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
akirahiguchi
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
Hisashi HATAKEYAMA
 
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
yut148atgmaildotcom
 

Similar a Webサーバのチューニング (20)

MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティングMTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
 
MySQL 初めてのチューニング
MySQL 初めてのチューニングMySQL 初めてのチューニング
MySQL 初めてのチューニング
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
Mysql casial01
Mysql casial01Mysql casial01
Mysql casial01
 
Webサーバ勉強会 発表資料
Webサーバ勉強会 発表資料Webサーバ勉強会 発表資料
Webサーバ勉強会 発表資料
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
VarnishCache入門Rev2.1
VarnishCache入門Rev2.1VarnishCache入門Rev2.1
VarnishCache入門Rev2.1
 
Nginx
NginxNginx
Nginx
 
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したいAwsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ
 
20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public
 
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
 

Más de Yu Komiya (8)

Chef localmodeをためした
Chef localmodeをためしたChef localmodeをためした
Chef localmodeをためした
 
Remotework
Remotework Remotework
Remotework
 
時短主婦の味方のご紹介
時短主婦の味方のご紹介時短主婦の味方のご紹介
時短主婦の味方のご紹介
 
MySQL5.6関連情報まとめ
MySQL5.6関連情報まとめMySQL5.6関連情報まとめ
MySQL5.6関連情報まとめ
 
Lvsをvpc上に構築してみた話
Lvsをvpc上に構築してみた話Lvsをvpc上に構築してみた話
Lvsをvpc上に構築してみた話
 
Chef社内向け解説とその課題について
Chef社内向け解説とその課題についてChef社内向け解説とその課題について
Chef社内向け解説とその課題について
 
My sqlのha構成について
My sqlのha構成についてMy sqlのha構成について
My sqlのha構成について
 
MHAを検証して導入した話
MHAを検証して導入した話MHAを検証して導入した話
MHAを検証して導入した話
 

Webサーバのチューニング

  • 1. WEBサーバのチューニング CONTENTS ⇒ Apache ⇒ その他 ※普段のデフォルトからの変更内容とその他。 もっとこうしたほうがいいという ご意見ありましたらぜひ伺いたいです! @smallpalace
  • 2. 自己紹介 ID:Twitter smallpalace お仕事: 課金系ASPや各種携帯サービス運営等をしている会社 でサーバインフラ系の仕事をしています。+主婦。 興味のあること: 楽して高速化、効率よく設定運用し寝る時間を確保 比較的好きなこと: MySQL、シェルスクリプト 好きな食べ物: 早朝メンテ明けに一人で築地に行く程度に魚が好きです。
  • 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 #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モジュール使うと思われます。
  • 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_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 ・ ミッションクリティカルなサービスでの実績なし。手順書サーバ等に設定してみたところ体感ではかなり早くなった。
  • 15. 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していて逆に遅くなっていた。
  • 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. ありがとうございました。 もっとこうしたほうがいいという ご意見ありましたらぜひ伺いたいです!