不意の大量アクセス
その時、そのWEBサーバーを落とさないために。
1日100万PVってどんなWEBサーバー?
1日は86400秒だから、1日100万PVを稼ぎたいなら、秒間12アクセスを捌ければOKということになる。こう考えると、ハードルは低く感じるよな。ただし、アクセスには大きな波がある。だから余裕をもって同時200接続は軽く捌きたいところだ。それぐらいのピンチを切り抜けられるエンジンを積んでおけばひとまずは安心できる。
Googleアナリティクスのアクティブユーザ数
実は全く本当の意味での同時接続じゃない。あれは単位時間当たりのアクセスのべ数だ。
Apacheのチューニング
基本となるApacheのチューニングを行う。
KeepAliveはOnにしよう(推奨)
1プロセスでTimeoutで指定した秒数までまとめて処理してくれるが、KeepAliveTimeoutは2秒程度に短くするのが安全。回線が遅い人が多くなってくるとフリーズする危険性がある。そうなったらどうしようもない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# vi /etc/httpd/conf/httpd.conf KeepAlive Off ↓変更 #KeepAlive Off←無効化 KeepAlive On←追加 MaxKeepAliveRequests 100 ↓変更 #MaxKeepAliveRequests 100←無効化 MaxKeepAliveRequests 1000←追加 KeepAliveTimeout 15 ↓変更 #KeepAliveTimeout 15←無効化 KeepAliveTimeout 2←追加 |
出たっ!必殺 mod_expireの導入
ブラウザに静的ファイルを指定した期間キャッシュさせる。380行目付近に追加するぞ!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css "access plus 12 days" ExpiresByType image/gif "access plus 12 days" ExpiresByType image/jpg "access plus 12 days" ExpiresByType image/jpeg "access plus 12 days" ExpiresByType image/png "access plus 12 days" ExpiresByType application/x-javascript "access plus 12 days" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" ExpiresByType application/x-javascript "access plus 1 month" ExpiresByType text/js "access plus 1 month" ExpiresByType text/javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" </IfModule> |
これで終わりだと思ったか? mod_deflate!
データを圧縮してユーザに送信するのだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<IfModule mod_deflate.c> SetOutputFilter DEFLATE # Mozilla4系などの古いブラウザで無効、しかしMSIEは除外 BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html # gifやjpgなど圧縮済みのコンテンツは再圧縮しない SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary SetEnvIfNoCase Request_URI _\.utxt$ no-gzip # htmlやcssなどは圧縮 AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/atom_xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/x-httpd-php </IfModule> |
いよいよだな、preforkチューニング!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# prefork MPM # StartServers: number of server processes to start # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # ServerLimit: maximum value for MaxClients for the lifetime of the server # MaxClients: maximum number of server processes allowed to start # MaxRequestsPerChild: maximum number of requests a server process serves &lt;IfModule prefork.c&gt; StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 &lt;/IfModule&gt; ↓変更 # prefork MPM # StartServers: number of server processes to start # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # ServerLimit: maximum value for MaxClients for the lifetime of the server # MaxClients: maximum number of server processes allowed to start # MaxRequestsPerChild: maximum number of requests a server process serves &lt;IfModule prefork.c&gt; #StartServers 8 #MinSpareServers 5 #MaxSpareServers 20 #ServerLimit 256 #MaxClients 256 #MaxRequestsPerChild 4000 #チューニング^~^ @see http://httpd.apache.org/docs/2.0/ja/mod/mpm_common.html #起動初期に自動生成されるプロセス数 StartServers 10 #待機(アイドル状態)の最小プロセス MinSpareServers 20 #待機(アイドル状態)の最大プロセス MaxSpareServers 60 #サーバーが処理できる子プロセス最大数( ※必ずMaxClientsの上に書くこと) ServerLimit 100 #リクエストに応答するために作成される 子プロセスの最大個数(クライアント数) MaxClients 100 # 個々の子プロセスが扱うことのできるリクエストの制限数 MaxRequestsPerChild 1000 #free() が呼ばれない限り、 メモリ確保と開放を管理する主メモリアロケータが保持し続けられるメモリの最大量(※ 0は無制限) #MaxMemFree 2048 &lt;/IfModule&gt; |
WEB用途に特化させる為に始めから多めにプロセスを待機させておくといい。
※restartでは反映されない可能性がある。
# service httpd stop
# service httpd start
PHPの設定
# vi /etc/php.ini
知ってますか?
デフォルト設定では1プロセスあたり最大128MBのメモリを消費することを・・・
PHPのメモリ最大使用量 = MaxClients × memory_limit
つまりデフォルトだと256×128M = 32768MB(32.7GB)使用できる設定で、物理メモリだけでなく仮想メモリまでと、あるだけリソースを食い尽くしてしまう危険性がある。
memory_limit = 128M
↓変更
;memory_limit = 128M←無効化
memory_limit = 16M←追加
チューニング後
MaxClients100 × memory_limit16M = 1600M(1.6GB)
現実的な数字になったな。memory_limitは30MBを基準に考えるといい。
メモリが16Gあるならmomory_limitは32Mと仮定して、MaxClients200だとする。
MaxClients200 × memory_limit32M = 6400M(6.4G)
こうなると、まだまだメモリに余裕があるからMaxClientは400ぐらい増やしてもいいな。なんてにやにや考えられる!また、絶対的に必要なメモリ量は動作させるアプリによる。
ここは注意したい
メモリを絞りすぎると処理できずにエラーに繋がる。趣味程度のブログなら最悪落ちてもいいが、収益性の高いサービスサイト、業務を支えるWEBシステムとなればダウンすることは許されない。緩めすぎず、絞りすぎといったチューニングの見せ所だな。結局のところ、メモリの配分について考えるのが大事で、memory_limitはデフォルトでいじらなくても構わない。
【APC ( Alternative PHP Cache )インストール】
中間コードをメモリにキャッシュしてくれる。
1 |
# yum -y install php-pecl-apc |
1 2 3 4 5 6 7 8 9 10 |
# vi /etc/php.d/apc.ini apc.shm_size=64M ↓変更 ;apc.shm_size=64M apc.shm_size=256M |
サーバを再起動させて反映させてくれ。
1 |
# service httpd stop |
1 |
# service httpd start |
最後にエラーログがないか確認しよう。
# cat /var/log/httpd/error_log
PHP5.5以上向け Zend Opcache, APCuインストール
PHP5.5以上の環境ならこちらの記事も参照してくれ。PHPが加速するぞ。
APCu , OPcacheの導入 PHP サーバ高速化
エラー 落ちてしまったら・・・
すまない。
だが、安心してほしい。
ここはITシステムを扱っている会社のWEBサイトなんだ。君の役に立ちたいと考えている。そうだな、この機会に我々システムガーディアンの高速WEBサーバー+静的キャッシュ+負荷分散+静的ファイルストレージシステム構築サービスを検討してみてくれないか。実績として1000万PVオーバーのWEBサーバを多数運用している。
もし動かしたいものがWordpressのようなCMSなら、レスポンスだって大切さ。長くても5秒以内に表示出来なければ、普通は覗いてもくれないもんだぜ。つまり1秒間にどれだけリクエストを処理できるかってことだな。WEBサーバのみをチューニングをするというのは限界があるのさ。気軽に相談してくれ。
【宣伝】Wordpressに最適化した高速WEBサーバーの構築
1000万PVオーバーのトラフィック対応
- トラフィックと予算に合わせた適切なサイジングで設計
- クラウドにも対応だから急な増設も安心
- 負荷分散 + トリプル高速キャッシュの軽量設計
- メディアサイト案件多し
- アダルトサイト対応可能
- コンサルティング/運用保守サポート
- DBの冗長構成、自律起動システム対応可能
どれだけ捌けるの?
いくらでも捌けます。
可能な限りサーバにチューニングを行い、アクセスアップに応じて並列的にサーバーを増やして負荷分散 + 冗長構成を行うのでいくらでも。
○○ぐらいのアクセスがあるけど大丈夫?
ご相談下さい。アクセス増加に応じた将来的な提案も可能です。Yahoo!砲だってOK!
1番ご相談の多い月間500万PV級のチューニング Apacheの使用例
動作や表示の遅延もなく軽快に処理しています。
また、並列処理が得意なNginxの採用で更に軽量高速な処理が可能です。
MySQLチューニングの例 InnoDB
DBサーバの例
チューニング後ではMySQLの最大使用可能メモリ容量が大幅アップしています。デフォルト状態での使用ではせっかくのハードウェア性能を発揮できません。チューニングにより眠っているパフォーマンスを覚醒。上位性能のサーバーに変更する前にチューニングで劇的に改善出来る場合が多い。
PR: 負荷やページが表示されない等困ってませんか。
WordPress以外のWEBサービスにも対応しております。
お気軽にご相談下さい。
関連
なんだか大変そうだなあと感じたら是非お任せ下さい。よくある構成からピンまでキリまであります。お気軽にお問い合わせ下さい。