さくらVPSでLAMP+Nginxの環境を作ってみた

サーバー側に興味が出てきたので、とりあえずVPS借りていじってみました。

ひとまず、LAMP環境構築をしてからチューニングを実施。

具体的には、フロントエンドでHTTPのデータ量を減らしつつ、サーバーサイドにAPCを入れてPHPのスピードアップやnginxをリバースプロキシとして動かしたりなどです。

僕はインフラエンジニアでもなく、素人です。本を読み漁って、ネットにダイブしまくった結果なので、間違ってたりしたら遠慮なくツッコミお願いします。

動かすサイトはなんでもよかったのですが、concrete5というCMSにしています。

デモサイトはこちら

VPSを借りて初期セットアップ

月額980円の一番安いプラン

クレジットカードでの申し込みの場合は、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の設定ができないので、注意。)

参考リンク

次にFTPのインストールと起動

FTPを起動して、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からダウンロード

Github:concrete5の最新バージョン

FTPで /var/www/html に転送し、解凍する

# unzip concrete5japan*

フォルダ名が長するので、変更

# mv concrete5japan* concrete5.5

ドメインを割り当てたら、Apacheの設定をいじります。

# 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」を使います。

フロントエンド

ブラウザ側のデータをいじってみます。

フロントエンドのチューニングは

・テキストファイルの gzip 圧縮転送

・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というものを使っているようです。(このブログ書くタイミングで初めて知りました。)

zend Cacheの解説

@tao_sさんによると、各種SQLのクエリ発行の直前にキャッシュが存在するかの確認を行い、キャッシュがあればSQLを実行せずにそのままのデータを返すそうです。

こちらも有効にしておくと、SQLの実行が減り高速化されるので有効にしておきましょう

その状態でapacheベンチマークで検証

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を入れる

APCPHPの中間コードやらキャッシュやらを最適化して高速化してくれるモジュールだそうです。

詳しくは、ググってください。

ひとまず入れてみましょう。

# yum install -y gcc httpd-devel php-devel php-pear pcre-devel

# pecl install APC

# vi /etc/php.d/apc.ini

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='MySQLPHPのパフォーマンスを向上させる方法のメモ。']

再び、ベンチマークで計測。結果はほとんど変わらず…

いじってもあんま意味ないのかな??誰か教えてください。

nginxを入れてみる!

何かとよく聞くnginxをリバースプロキシとして導入してみました。

具体的には、HTML部分のみをApacheが対応し、CSSやJSなど静的な部分はnginxが対応します。

こうすることで、httpのリクエストごとにApacheのプロセスが立ち上がることがなく捌けるので、Apacheアプリケーションサーバーとしての実績とnginxの少ないメモリでの動作の両方のいいところが出ていい感じです。

そのあたりの解説は以下のリンクが非常にわかりやすかったです。

ここから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だとプラグイン入れて解決することが多いと思いますけど、プラグインで解決しても、あまり勉強にならないので自分でゴリゴリいじってみました。

concrete5tinifierという、JSやHTMLを圧縮するアドオンで一部改善できるようです。

動かしてみましたが、Apacheの設定をいじったほうがパフォーマンスは良さそうです。

単純にVPSをいじって環境構築しているので、CMSじゃなくてWebサービス等を作る場合にも活かせると思います。

その他

  • CSS Spriteでイメージファイルを1つにまとめる
  • CSSとJSファイルを1ファイルにまとめて圧縮
  • memchachedやTokyo Tyrantなどを使ったキャッシュ
  • ApacheのVersionを2.4にしてみる(Nginxよりもいいとか聞きますけど、どうなんでしょ?)

などすればまだまだ改善の余地はありそうです。それはまた今度の機会に。。。

ではでは。

その他参考URL(めちゃくちゃ多いですが、自分が見たサイトを片っ端から貼ってるメモ用)

サーバー&チューニング関係

nginx関係

PHPNinja関係(Wordpress専用レンタルクラウドサーバー?)

独り言

本読むだけでは、知識しか得られないので手を動かしてみました。

インフラはまだまだ奥が深いと思う今日この頃…。

こうしたほうがいいよ!みたいなアドバイスあればください!!