さくらVPSでLAMP+Nginxの環境を作ってみた
サーバー側に興味が出てきたので、とりあえずVPS借りていじってみました。
ひとまず、LAMP環境構築をしてからチューニングを実施。
具体的には、フロントエンドでHTTPのデータ量を減らしつつ、サーバーサイドにAPCを入れてPHPのスピードアップやnginxをリバースプロキシとして動かしたりなどです。
僕はインフラエンジニアでもなく、素人です。本を読み漁って、ネットにダイブしまくった結果なので、間違ってたりしたら遠慮なくツッコミお願いします。
動かすサイトはなんでもよかったのですが、concrete5というCMSにしています。
デモサイトはこちら
VPSを借りて初期セットアップ
クレジットカードでの申し込みの場合は、2週間お試し期間があるので手軽に借りれていいと思います。
実際のLAMP環境セットアップは以下のリンクが分かりやすいので、参照。
PHPのバージョンはCentOSが5.6以上であれば、5.3になるのでそこは飛ばしました。
[ssl url='http://weble.org/2011/05/16/sakura-vps-and-centos' title='はじめてのさくら VPS + CentOS の初期設定からチューニングなどの作業まとめ']
viコマンドもひと通り覚えておかないと全く操作できないので、以下のコマンド集を開きながらやると良い。
[ssl url='http://hp.vector.co.jp/authors/VA016670/unix/vi_reference.html' title='vi コマンドリファレンス']
以下のリンクを参考に実施。
(ただし、お試し期間中の2週間はDNSの設定ができないので、注意。)
参考リンク
- [ssl url='http://golog.plus.vc/web/406/' title='さくらインターネット+お名前.comでサブドメインの設定方法']
- [ssl url='http://web.showjin.me/2011/12/sakuravps_dns.html' title='さくらVPSでさくらのネームサーバを利用する(サブドメインの追加も)']
- [ssl url='http://kadowski.info/server-2/%E3%81%95%E3%81%8F%E3%82%89vps%E3%81%AB%E3%80%81%E3%81%8A%E5%90%8D%E5%89%8D-com%E3%81%A7%E5%8F%96%E3%81%A3%E3%81%9F%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E5%89%B2%E3%82%8A' title='さくらVPSにお名前.comの独自ドメインを割り当てる']
次にFTPのインストールと起動
# yum -y install vsftpd
# /etc/rc.d/init.d/vsftpd start
何か適当なファイルをアップロードして、アップできるか確認する
FTPでエラーが出る場合は、chmodコマンドを使ってフォルダの権限を変える必要あり
(Apacheの設定が標準のままであれば、/var/www/htmlにアップする)
CMS入れてみよう
concrete5の最新版をインストール。
※2012/3/20現在は、公式サイトにアップされていますが、このVPSをいじった当時はなかったので以下のようなやり方になっています。
Githubからダウンロード
FTPで /var/www/html に転送し、解凍する
# unzip concrete5japan*
フォルダ名が長するので、変更
# mv concrete5japan* concrete5.5
# vi /etc/httpd/conf/httpd.conf
#
# ServerName sub.slothlibrary.com
# DocumentRoot /var/www/html/concrete5.5/web
#
# /etc/rc.d/init.d/httpd restart
自分が割り当てたドメインにアクセスします。
インストール画面が出てきたら、成功ですが、白画面になって何も表示されませんでした…。
調べてみると、ショートコードの対応っぽかったので、ショートコード対応を実施。
# vi /etc/php.ini
short_open_tag = On
あとは、インストールガイドに従ってインストール。
データベースの作成が必要なので、ここで作成(phpMyAdminのインストールは後回し)
# mysql -u root -p
CREATE DATABASE `concrete5.5` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
これで無事動かすことができました。
詳しくは、公式サイトのインストール手順を見てください。
チューニングとパフォーマンス計測
ここからが本番。
とりあえず、標準のままでのパフォーマンスを計測。
使うのは、GoogleChromeのDeveloperToolsでフロントエンドとApacheのベンチマークでサーバーサイドを見てみます。アクセス先はトップページ限定。使うテーマは5.5より標準の「greek yogurt」を使います。
フロントエンド
ブラウザ側のデータをいじってみます。
フロントエンドのチューニングは
・Expiresヘッダを設定し、静的なデータをブラウザにキャッシュする
1回目のアクセスはどうしても全データ取得になるので、時間がかかりますが、2回目のアクセスはHTML以外は、ブラウザにキャッシュされたデータを使うことで高速化できます。
gzipとExpiresヘッダの解説は、これが一番まとまっててわかりやすかったです。
(WordPressやんけというツッコミはなしでお願いします)
[ssl url='http://dogmap.jp/2010/04/20/wordpress-htaccess/' title='WordPressサイト用の.htaccess例']
トップページのHTMLデータが5.74KB → 2.43KBになりました。
圧縮するのに、サーバーのCPUを消費するらしいですが、結果的に回線を通るデータ量が減るので負担が減るのでは?という意見がWeb上に多く見られました。
実際のところはどうなんでしょうか?
サーバーサイド
concrete5には標準でキャッシュの機能がついてます。
管理画面>システム&設定>基本キャッシュより有効/無効が選択できます。
Zend Cacheというものを使っているようです。(このブログ書くタイミングで初めて知りました。)
@tao_sさんによると、各種SQLのクエリ発行の直前にキャッシュが存在するかの確認を行い、キャッシュがあればSQLを実行せずにそのままのデータを返すそうです。
こちらも有効にしておくと、SQLの実行が減り高速化されるので有効にしておきましょう
ab -n 10 -c 10 http://sub.slothlibrary.com/
-n 数値:テストで発行するリクエストの回数を指定
-c 数値:テストで同時に発行するリクエストの数を指定
結果
Requests per second: 2.03 [#/sec] (mean)
Time per request: 491.410 [ms] (mean, across all concurrent requests)
Requests per second 1秒間に処理できるリクエスト数
Time per request 1リクエストあたりの処理
これを標準に頑張ってみます。
・APCを入れる
APCはPHPの中間コードやらキャッシュやらを最適化して高速化してくれるモジュールだそうです。
詳しくは、ググってください。
ひとまず入れてみましょう。
# yum install -y gcc httpd-devel php-devel php-pear pcre-devel
extension=apc.so
;新規ファイルを作って、上記文を記載して保存
# service httpd restart
再び、ベンチマークで計測
Requests per second: 10.19 [#/sec] (mean)
Time per request: 98.142 [ms] (mean, across all concurrent requests)
ちょこっとパワーアップしました。
MySQLの設定
MySQLのクエリキャッシュの設定をします。
[ssl url='http://9jp.info/archives/7511' title='MySQLやPHPのパフォーマンスを向上させる方法のメモ。']
再び、ベンチマークで計測。結果はほとんど変わらず…
いじってもあんま意味ないのかな??誰か教えてください。
nginxを入れてみる!
何かとよく聞くnginxをリバースプロキシとして導入してみました。
具体的には、HTML部分のみをApacheが対応し、CSSやJSなど静的な部分はnginxが対応します。
こうすることで、httpのリクエストごとにApacheのプロセスが立ち上がることがなく捌けるので、Apacheのアプリケーションサーバーとしての実績とnginxの少ないメモリでの動作の両方のいいところが出ていい感じです。
そのあたりの解説は以下のリンクが非常にわかりやすかったです。
- [ssl url='http://d.hatena.ne.jp/shim0mura/20120110/1326198429' title='入門! nginx']
- [ssl url='http://sakuratan.biz/archives/4582' title='さくらVPSとnginxリバースプロクシで最速WordPressブログを作る方法(ベンチマーク付き)']
ここからnginx設定ですが、/etc/nginx/conf.d/以下にある.confファイルが優先的に読み込まれるようで、default.confのエラーが取れなかったので、ファイルのバックアップを取って削除しました。
※多分、ただしやり方ではないので真似しないように。
# yum --enablerepo=remi,epel,rpmforge install nginx
; バックアップを取ってフォルダから削除
# cp etc/nginx/conf.d/default.conf etc/nginx/default.conf
# rm etc/nginx/conf.d/default.conf
# vi /etc/nginx/nginx.conf
# server {
# listen 80;
# server_name sub.slothlibrary.com;
#
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Host $http_host;
# proxy_redirect off;
# proxy_max_temp_file_size 0;
#
# location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
# root /var/www/html/concret5.5/web;
# index index.php;
# ssi on;
# break;
# }
# location / {
# proxy_pass 127.0.0.1:8082;
# break;
# }
;Apacheが起動していると、80番ポートが使われているはずなので先にApacheを切る必要がある
# /etc/rc.d/init.d/httpd stop
# /etc/init.d/nginx start
; mod_rpafモジュールのインストール
# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
# tar xfvz mod_rpaf-0.6.tar.gz
# cd mod_rpaf-0.6
# apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
# vi /etc/httpd/conf/httpd.conf
# LoadModule rpaf_module modules/mod_rpaf-2.0.so
#
# ServerName sub.slothlibrary.com
# DocumentRoot /var/www/html/concrete5.5/web
#
# AllowOverride None
#
# RPAFenable On
# RPAFsethostname On
# RPAFproxy_ips *.*.*.* 10.0.0.1
# RPAFheader X-Forwarded-For
#
# /etc/rc.d/init.d/httpd start
いろいろいじって結構早くなった気がします。少なくともlocalhost(MAMP)にある同じ最新バージョン5.5のサイトよりも断然速いです。
WordPressだとプラグイン入れて解決することが多いと思いますけど、プラグインで解決しても、あまり勉強にならないので自分でゴリゴリいじってみました。
※concrete5もtinifierという、JSやHTMLを圧縮するアドオンで一部改善できるようです。
動かしてみましたが、Apacheの設定をいじったほうがパフォーマンスは良さそうです。
単純にVPSをいじって環境構築しているので、CMSじゃなくてWebサービス等を作る場合にも活かせると思います。
その他
- CSS Spriteでイメージファイルを1つにまとめる
- CSSとJSファイルを1ファイルにまとめて圧縮
- memchachedやTokyo Tyrantなどを使ったキャッシュ
- ApacheのVersionを2.4にしてみる(Nginxよりもいいとか聞きますけど、どうなんでしょ?)
などすればまだまだ改善の余地はありそうです。それはまた今度の機会に。。。
ではでは。
その他参考URL(めちゃくちゃ多いですが、自分が見たサイトを片っ端から貼ってるメモ用)
サーバー&チューニング関係
- [ssl url='http://tanaka.sakura.ad.jp/2011/05/centos-linux-apache-php-perl-mysql-lamp.html' title='ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編)']
- [ssl url='http://www.submit.ne.jp/714' title='Webサイト負荷テストツール7選']
- [ssl url='http://d.hatena.ne.jp/hirafoo/20110923/1316756766' title='3000req / sec と戦う']
- [ssl url='http://blog.nomadscafe.jp/2011/07/apache.html' title='今こそ見直すApacheの設定']
- [ssl url='http://d.hatena.ne.jp/r7kamura/20110222/1298371277' title='httpd.confについて調べたのでまとめたよ']
- [ssl url='http://www.uetyi.mydns.jp/wordpress/command/entry-124.html' title='topコマンドの使い方']
- [ssl url='http://shoulder.jp/archives/007798.php' title='フロントエンドのパフォーマンスチューニング - Expiresヘッダ追加']
- [ssl url='http://stocker.jp/diary/chrome_page_speed/' title='ついに出た!Chrome版「Page Speed」の使い方']
nginx関係
- [ssl url='http://neta.megumi-champloo.net/2011/06/29/introduction-to-nginx-server-names/' title='nginx ドキュメント訳: サーバ名']
- [ssl url='http://nginx.org/ja/' title='nginx(日本語訳版)']
- [ssl url='http://kray.jp/blog/nginx/' title='軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール']
- [ssl url='http://havelog.ayumusato.com/develop/server/e198-nginx-with-apache.html' title='nginx+apacheでちょっぴり快適なWebサーバーを目指してみる(CentOS さくらのVPS)']
- [ssl url='http://dogmap.jp/2011/12/20/wordpress-advent-calendar-2011-day-20/' title='WordPress をとにかく速くする (WordPress Advent Calendar 2011 20日目)']
- [ssl url='http://dogmap.jp/wctokyo2011 title='WordPress ハイパフォーマンスチューニング Reloaded >> WordCamp Tokyo 2011']
- [ssl url='http://d.hatena.ne.jp/s025236/20120307/p1' title='僕が考えた最強サーバー設定']
- [ssl url='http://sakura.off-soft.net/centos/apache-nginx-9-sakura-vps.html' title='apache のかわりにnginxを使ってみる(9) nginx , php-fpm をさくらのVPSで使ってみた']
- [ssl url='http://dogmap.jp/2012/01/12/wordpress-nginx-memcached/' title='Nginx + memcached で WordPress をキャッシングしてみる']
- [ssl url='http://cloudrop.jp/' title='cloudrop(nginxの記事を多く扱うブログ)']
- [ssl url='http://concrete5-japan.org/community/forums/install/post-3365/' title='vertualhostでnginxを動かす']
PHPNinja関係(Wordpress専用レンタルクラウドサーバー?)
- [ssl url='http://php-ninja.com' title='PHP Ninja | ファーストサーバ WordPress 専用クラウドサービス']
- [ssl url='http://210.152.157.3/' title='PHP Ninjaで動いてるデモサイト']
- [ssl url='http://firegoby.theta.ne.jp/archives/2854' title='PHPninjaのパフォーマンス']
- [ssl url='http://megane-blog.com/2012/03/11/887' title='Wordbench Tokyo 2012 「【漫談】PHP Ninja開発の裏側+α」by デジタルキューブ 小賀さん(@digitalcube ) 宮内さん(@miya0001)']
独り言
本読むだけでは、知識しか得られないので手を動かしてみました。
インフラはまだまだ奥が深いと思う今日この頃…。
こうしたほうがいいよ!みたいなアドバイスあればください!!