さくらの VPS 設定覚書(3)Apache
Apache は、世界でもっとも使われているウェブ・サーバ・ソフトウェアですが、サイトを高速化するには、CloudFlare、NGINX 、 Varnish をその上流に置くことで、キャッシュを最大限活用する必要があります。このページでは、CloudFlare+NGINX +Varnish+Apache の設定を通じて、複数のドメインを一つのサーバにホストする高速サイトの構築方法を解説します。
1. DNS の設定
DNS(Domain Name System)とは、ホスト名、例えば、“www.domain.com”から、そのホストの IP アドレスを検索するシステムであり、この設定を変更しないと、ブラウザから新サーバがホストするサイトにアクセスできません。もちろん、本来、この作業より前に、新サーバでアパッチのインストールを完了しておかなければならないのですが、DNS 設定の反映には時間がかかるので、この作業を最初にしておいた方が時間の節約になります。
1.1. 三つの代替方法
新サーバがホストするサイトにブラウザからアクセスすることができるようにするには、ネームサーバに、ホスト名とIPアドレスを対応付けさせる名前解決を行わなければなりません。名前解決には、以下の四つの方法があります。
- BIND を用いて、さくらの VPS でネームサーバを構築し、運用する。
- ドメインを取得した管理事業者が提供するネームサーバを利用する。
- さくらインターネットが提供するネームサーバを利用する。
- サードパーティのDNSサービス提供業者のネームサーバを利用する。
このうち、一番目の方法は、設定が難解なので、素人向きではありません。二番目と三番目は、それよりも簡単かつオーソドックスですが、四番目には、これから述べるように、二番目と三番目にないメリットもあるので、ここでは四番目の方法を採用することにします。
1.2. CloudFlare を利用する
世界には、無料のネームサーバ・サービスがたくさんありますが、中でもお勧めなのが、クラウドフレア(CloudFlare)のサービスです。CloudFlare は、以下の概略図に示されているように、たんにネームサーバ・サービスをしてくれるのみならず、ウェブ・サーバ上のコンテンツの中でキャッシュ可能なファイルを複数サーバにキャッシュすることで、ページ・ロードをスピードアップしたり、サーバのセキュリティを強化したりするなど、包括的なコンテンツ・デリバリー・ネットワーク・サービスを提供してくれます。しかも、SSL 通信を行うページを公開するなどの特殊なサイトを除けば、無料で基本的なサービスを受けることができます。
登録するには、Sign up のページに行って、以下の操作を行います。
1.登録するドメインを入力し“Add this domain”をクリックします。
2.メールアドレスとユーザ名、パスワードを設定し、チェックボックスにチェックをいれ、“ Sign up CloudFlare ”をクリックします。
3.“Continue to Step 2”ボタンが表示されたら、それをクリックします。
4.入力したドメインのDNS情報が表示されるので、IP アドレスを変更します。新しい IP アドレスは、申し込み後に送られてくる「仮登録完了のお知らせ」というメールに書かれているので、それを使いましょう。DNS 情報が何もない場合や必要なレコードが欠けている場合は、以下の表を参考に追加し、“continue”をクリックします。
| Name | Type | Value |
|---|---|---|
| A | IP アドレス | |
| www | A | IP アドレス |
| mysql | A | IP アドレス |
| domain.com | MX | 10 mail.domain.com |
| mail.domain.com | A | IP アドレス |
なお、ネームベースのバーチャルホストを構築する場合、“www”などのサブドメインのタイプは、“A”ではなくて“CNAME”を使うべきだという人もいますが、“sendmail”以外は、“A”で問題ありません。
5.ここで、CloudFlare を通さずにアクセスできるように、“direct”というホストが自動的に追加されます。特に、無料で SSL 接続をする場合は、“direct”というホストが必要です。設定を確認したら“My settings look good, continue”をクリックします。
6.“XXX.ns.cloudflare.com”という形の CloudFlare のネームサーバが二つ出てくるので、これをコピーします。
7.契約中のレジストラ(ドメインを取得・管理する、ICANN 公認の事業者)のサイトに行ってネームサーバを変更します。レジストラはどこでもかまいませんが、私は、プライバシー・オプション付きで、年間費用が 9.95ドルと格安な DreamHost を使っているので、それを例にとって説明しましょう。
DreamHost の場合、“Manage Domains > Domains > DNS”をクリックして、“Change domain.com's whois nameservers”を、
Nameserver 1 ns1.dreamhost.com Nameserver 2 ns2.dreamhost.com Nameserver 3 ns3.dreamhost.com
から
Nameserver 1 XXXX.ns.cloudflare.com Nameserver 2 YYYY.ns.cloudflare.com
というように変更し、3行目以下は空欄にして、“set these nameservers for domain.com!”ボタンをクリックします。“I want to refresh all of systemicsarchive.com's DNS info now!”もクリックすると、反映が早くなる。
8.CloudFlare に戻り、“I’ve updated my name servers, continue”をクリックします。“Congratulations!”と出てくれば、完了。
すでに登録している時には、My websites に行って、“Settings”から“DNS Settings”を選んで、変更事項を入力し、“I’m done entering my DNS records”をクリックすればよい。
1.3. 複合的なキャッシュ戦略
サーバをさらに高速化するために、クラウドフレアに加え、バーニッシュ(Varnish Cache)とエンジンエックス(NGINX)を導入しましょう。両者は、ともにリバース・プロキシ・サーバですが、Varnish が、動的サイト向けの HTTP アクセラレータであるのに対して、NGINX は、静的ファイルのキャッシングに優れており、得意分野が異なるので、両方使った方が、ロード時間短縮に効果があります。
プロキシ(proxy)とは、「代理」を意味する英語ですが、情報技術業界では、インターネット閲覧のための HTTP による接続を内部ネットワークのコンピュータに代わって中継する代理サーバのことを意味し、プロキシ・サーバの中には、外部との回線の負荷を軽減するために、一度読みこんだファイルをしばらく自分の中に保存しておくキャッシュ機能を持つものもあります。内部から外部に接続要求を中継するのではなくて、逆に外部から内部に接続要求を中継するプロキシ・サーバは、リバース・プロキシ・サーバと呼ばれ、キャッシュ保存により、アクセスの負荷を分散する機能を持ちます。
これに加えて、PHP の中間コードをキャッシュする拡張モジュール、APC(Alternative PHP Cache)、データベースへの問い合わせ結果を一時的にキャッシュして、データベースへのアクセス回数を減らすことで、動的なウェブ・アプリケーションを高速化する Memcached を使うことで、キャッシュを最大限活用するシステムを構築することができます。
このキャッシュ戦略に基づくシステムは、接続要求を聞いて、それを送る向きを矢印で表すと、以下のようになります。
Internet → CloudFlare → NGINX → Varnish → Apache + PHP(APC + Memcached)→ MySQL Database
ポート番号は、以下のように割り振ることにしましょう。
Nginx:80 番のポートで受信して、6081 番のポートに位置する Varnish に送る。
Varnish:6081 番のポートで受信して、8080 番のポートに位置する Apache に送る。
Apache:8080 番のポートで受信する。
このページでは、APC + Memcached の導入に先立って、Varnish + NGINX という二つのリバース・プロキシ・サーバを使って、Apache を活用する方法を解説します。設定の順番は、依存関係により、Apache, Varnish, NGINX の順になります。
2. Apache の設定
アパッチ(Apache HTTP Server)は、最も人気の高いウェブ・サーバ・ソフトウェアで、Nginx よりも動的サイトに適合的で、Nginx を使うからといって、不要というわけではありません。
2.1. 事前準備
各ドメインに割り当てるフォルダをあらかじめ作成しておきましょう。ユーザ名でログインする WinSCP でファイル転送ができるようにするために、まず親フォルダの所有者をルートからユーザに変更します。
cd chown -R ユーザ名:wheel /var/www/html
後は、FTP を使う要領で、WinSCP を使って、“html”フォルダ内に、“root”、“ドメイン名1”、“ドメイン名2”、“ドメイン名3”というフォルダを、パーミッションを“0755”にして作り、index.html ファイルをはじめとする必要ファイルをアップロードします。
2.2. Apache の起動
Apache をまだインストールしていない場合は、
yum --enablerepo=remi,epel,rpmforge install httpd httpd-devel
で、インストールしましょう。レポジトリを使わない時は、
yum -y install httpd httpd-devel
でもかまいません。“Complete!”と出たら、成功。
ルート権限がある状態で、以下のコマンドで、Apache を起動します。
/etc/rc.d/init.d/httpd start
“OK”と出たら、起動したということです。さらに、以下のコマンドで、電源が入った時、Apache が自動起動するようにします。
chkconfig httpd on chkconfig --list httpd
その結果、以下のように、起動設定されたラン・レベルの一覧が表示されます。
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
左から順に、0:システムの停止,1:シングル・ユーザ,2:ネットワーク機能なしのマルチ・ユーザ,3:CUI ログインのマルチ・ユーザ,4:カスタム,5:GUIログインのマルチ・ユーザ,6:システムの再起動の有無を表しています。ここで、3番目がオンになっていたら、成功。
2.3. 初期設定の変更
以下の二つのコマンドで、“httpd.conf”から“httpd.conf.org”へとファイルをコピーして、 それを vi で開きます。
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org vi /etc/httpd/conf/httpd.conf
以下のように編集します。矢印の左側が編集前、後が編集後です。
- OSの情報を表示させない
エラー・メッセージ出力時に、レスポンスヘッダにOS(Fedora)とか、Apache のバージョンとか、不必要な情報を表示させないようにします。以下のように、Prod を指定すると、レスポンスヘッダには Server: Apache という名前しか返されません。
ServerTokens OS → ServerTokens Prod
- ポート番号を指定する
アパッチのポート番号を、ウェブサーバ(HTTP)の標準的な番号である 80 から、プロキシ・サーバのポート番号である 8080 に変更します。
Listen 80 → Listen 8080
- 不必要なモジュールを無効にする
有効なモジュールを増やすと、それだけメモリを消費するので、不必要なモジュールは無効にしておいたほうがよい。以下は、無効にすることが望ましいモジュールとその役割のリストです。
#LoadModule authn_alias_module modules/mod_authn_alias.so 拡張認証の提供 #LoadModule authn_anon_module modules/mod_authn_anon.so 匿名ユーザの認証 #LoadModule authn_dbm_module modules/mod_authn_dbm.so DBMファイルを用いたユーザ認証を行う #LoadModule authz_dbm_module modules/mod_authz_dbm.so DBMファイルを用いたグループに基づくユーザ認証を行う #LoadModule ldap_module modules/mod_ldap.so LDAP用の基本モジュール(注) #LoadModule authnz_ldap_module modules/mod_authnz_ldap.so ユーザ認証にLDAPを使用する(注) #LoadModule ext_filter_module modules/mod_ext_filter.so データ返送時に外部プログラムを経由させる #LoadModule expires_module modules/mod_expires.so 期限切れ日を設定する #LoadModule usertrack_module modules/mod_usertrack.so Cookieを使用してユーザを追跡する #LoadModule dav_module modules/mod_dav.so WebDav 機能を提供する #LoadModule dav_fs_module modules/mod_dav_fs.so サーバファイルシステム上のリソースへのアクセス #LoadModule userdir_module modules/mod_userdir.so ユーザのホームディレクトにチルダ形式でアクセス #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so mod_proxyの拡張機能で、ftp接続機能を提供
(注)LDAP を使っていはずなのに、このコメントアウトを解除したところ、起動しなくなった Apache が起動するようになったということがありました。因果関係は不明ですが、コメントアウトしない方が無難かもしれません。
- サーバ管理者の指定
普段使っているメールアドレスを指定します。
ServerAdmin root@localhost → ServerAdmin admin@domain.com
- ディレクトリ内のファイル表示を無効化
この設定が有効であると、アクセスされたディレクトリ内に DirectoryIndex で設定されたファイルが見つからない場合、ファイル一覧ページが自動生成されるが、セキュリティ上の利用から、表示させないほうがよい。<Directory "/var/www/html"></Directory>内にある以下の箇所を修正(<Directory /></Directory>内はそのままでよい)。
Options Indexes FollowSymLinks → Options -Indexes FollowSymLinks
- .htaccess を許可する
.htaccess を許可するために、AllowOverride を All に変更します。
AllowOverride None → AllowOverride All
- ホームページの設定
ホームページ(ディレクトリにおけるデフォルトのページ)のファイル属性を増やしておきます。
DirectoryIndex index.html index.html.var → DirectoryIndex index.html index.php index.cgi index.html.var
- エラー画面でApacheのバージョンを表示させない
これも、セキュリティ上の利用から、表示させないほうがよい。
ServerSignature On → ServerSignature Off
- MIME 言語タイプの適用優先順位
日本語を最優先にしたければ、ja を一番前に持っていきます。ここでは、二番目にしておきます。
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 → LanguagePriority en ja de fr zh-CN zh-TW ca cs da el eo es et he hr it ko ltz nl nn no pl pt pt-BR ru sv
- バーチャルホストの設定
一つのIPアドレスに、複数のドメインをマッピングする時には、以下のように、ネームベースでバーチャルホストの設定を行います。
NameVirtualHost *:8080 ### Root <VirtualHost *:8080> ServerName www英数字.sakura.ne.jp ServerAdmin 電子メールアドレス DocumentRoot /var/www/html/root </VirtualHost> ###VirtualHosts of www subdomains <VirtualHost *:8080> ServerName www.domain1.com ServerAdmin 電子メールアドレス DocumentRoot /var/www/html/domain1 </VirtualHost> <VirtualHost *:8080> ServerName domain2 ServerAdmin 電子メールアドレス DocumentRoot /var/www/html/domain2 </VirtualHost>
以上の設定を終えたら、“:wq”で保存して終了。
sudo apachectl configtest
というテストで、“Syntax OK”と出れば、構文に問題はありません。
バーチャルホストの設定が正しく有効になっているかどうかは、
httpd -S
というコマンドで確かめましょう。
問題がなければ、Apache を再起動して、設定の変更を反映させます。
/etc/rc.d/init.d/httpd restart
“OK”と出れば、成功ですが、たんに“failed”とだけでて、原因がわからないときは、
tail /var/log/httpd/error_log
というコマンドで、エラーログを見ましょう。解決の糸口が見えるかもしれません。
なお、Apache が停止中か起動中かを知るには、
service httpd status
でわかります。
3. Varnish の設定
Varnish cache は、Squid cache よりも高性能な HTTP アクセラレータで、本来、Apache と併用するべきであって、必ずしも、NGINX と併用する必要はありませんが、ここでは、NGINX との併用を前提に、その使い方を解説します。
まだインストールしていない時は、以下のコマンドでインストールしてください。
yum --enablerepo=remi,epel,rpmforge install varnish
3.1. バックエンドの設定
デフォルトの設定ファイルを開きます。
vi /etc/varnish/default.vcl
ここで、以下のように、デフォルトのバックエンドを設定します。バックエンドとは、Varnish が加速するサーバで、ここでは、Apache に相当するので、ポート番号は 8080 になります。
backend default {
.host = "localhost";
.port = "8080";
}
保存して、閉じます。
3.2. デーモンの設定
次に、Varnish のデーモンの設定を行います。
vi /etc/sysconfig/varnish
デーモンの設定方法には、四つの選択肢がありますが、ここでは標準的な二番目の選択肢を選ぶことにします。
例えば、以下のように変更します。
DAEMON_OPTS="-a localhost:6081 \ -u varnish -g varnish \ -f /etc/varnish/default.vcl \ -s file,/var/lib/varnish/varnish_storage.bin,2G"
- -a :外部(NGINX)から来る接続要求のポート番号。ここでは、6081 になります。
- -u :ユーザの指定。
- -g :グループの指定。
- -f :設定ファイルのディレクトリ。
- -s :Varnish に割り当てる最大のメモリ。実際には、その倍になることもあるので、余裕を持たせて設定しましょう。
保存して閉じます。
3.3. Varnish の起動
最後に、Varnish を起動します。
/etc/init.d/varnish start
再起動の時は、
/etc/init.d/varnish restart
というコマンドを使います。“OK”と出れば、成功。
4. NGINX の設定
NGINX は、リバース・プロキシであるだけでなく、ウェブ・サーバや IMAP/POP3 のプロキシ・サーバとしても動作することができますが、ここでは、リバース・プロキシとして使用することにします。
NGINX とそのモジュールをまだインストールしていない時は、以下のコマンドで、リポジトリからインストールしてください。
yum --enablerepo=remi,epel,rpmforge install nginx zlib zlib-devel
4.1. Gzip 圧縮の設定
“nginx”とともにダウンロードした“zlib”と“zlib-devel”は、gzip 圧縮に必要なモジュールです。gzip とは、GNU ZIP の略で、データ圧縮プログラムとして、UNIX では広く用いられています。これを有効にすると、サーバからの出力を、ネットワークを 通してクライアントに送る前に、gzip で圧縮し、それによって、ネットワークの負荷を下げ、転送量を減らすことで、伝達時間短縮することができます。
これを有効にするために、NGINX の設定ファイルを開きます。
vi /etc/nginx/nginx.conf
以下のように書き換えることで、gzip 圧縮を有効にします。
#gzip on; ↓ gzip on; gzip_static on; gzip_disable "MSIE [1-6]\."; gzip_comp_level 2; gzip_proxied any; gzip_vary on; gzip_min_length 1000; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
設定事項の解説:
- gzip_disable “MSIE [1-6]\.”; MicroSoft IE のバージョン1 から 6 までを非対象にしています。
- gzip_comp_level 1; gzip の圧縮レベルを2に設定しています(レベルを上げると、CPU に負担をかけすぎてしまいます)。
- gzip_proxied any; Proxy 経由の要求でも圧縮対象にします。
- gzip_vary on; ヘッダ情報に Vary 情報を付加します。
- gzip_min_length 1000; 1kb 以下のファイルは圧縮しません。
保存して、閉じます。
4.2. サーバの設定
次に、この設定ファイルがインクルードするバーチャル・ホスト・ファイルを作って、開きます。
vi /etc/nginx/conf.d/virtual.conf
以下のように、ホストごとに、サーバの名前、アクセス・ログとルートのディレクトリ、プロキシ・ディレクティブを指定します。ドメインが複数あるときは、その数だけこうしたブロックを作ります。
upstream varnish {
server localhost:6081;
server localhost:8080 backup;
}
server {
listen IPアドレス:80;
server_name www.domain1.com;
access_log /var/log/nginx/www.domain1-access.log;
root /var/www/www.domain1.com/htdocs;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Server-Address $server_addr;
proxy_pass_header Set-Cookie;
proxy_pass http://localhost:6081;
}
}
server {
listen IPアドレス:80;
server_name www.domain2.com;
access_log /var/log/nginx/www.domain2-access.log;
root /var/www/www.domain2.com/htdocs;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Server-Address $server_addr;
proxy_pass_header Set-Cookie;
proxy_pass http://localhost:6081;
}
}
保存して閉じます。
4.3. NGINX の起動
以下のコマンドで、NGINX を起動します。
/etc/init.d/nginx start
再起動の時は、
/etc/init.d/nginx restart
というコマンドを使います。“OK”と出れば、成功。
5. 接続テスト
最後に、ブラウザからアクセスできるかどうかテストしてみましょう。まず、ブラウザで、ServerName で指定した IP アドレスを用いて、以下のようなURLをアドレスバーに入力して開きます。
http://IPアドレス/
以下のような“Apache 2 Test Page powered by CentOS”という画面が出てきたら、成功。

しかし、これだけでは、DNS の設定が成功であるかどうかはわからないので、登録したドメインにブラウザでアクセスして、アップロードしたファイルが表示されているかどうかを確かめなければなりません。
ブラウザを使わずに、設定が正しいかどうかを確認する方法もあります。
nslookup ドメイン名
あるいは
dig ドメイン名
というコマンドで、望んだ通の設定が反映されているかどうか確かめることができます。DNSサーバ接続確認というページからも確認ができます。
Internet → CloudFlare → Nginx → Varnish → Apache システムの構築が完了したら、次に、PHP の設定を行い、APC + Memcached でさらにサイトを高速化させましょう。
- Documentation: Apache HTTP Server - The Apache HTTP Server Project
- Using Varnish - Varnish version 3.0.1 documentation
- Configuration - NGINX Wiki
- Experiments with Varnish / NGINX / Apache on Centos by James Cacchione
- Apache クックブック ―Webサーバ管理者のためのレシピ集
- Apache ポケットリファレンス
- 使える!サーバ運用の実践テクニック:第13回 varnishを使おう ③─便利な機能を使いこなす|技術評論社
- さくら VPS + CentOS のチューニングや高速化もっとこうすれば良かった作業まとめ
- さくらのVPS Apacheの設定:浜村拓夫の世界
- さくらのVPS を使いはじめる 4 Apache のインストールと初期設定 | アカベコマイリ
- さくらVPSにApacheを入れてWebサーバを構築する さくらVPS設定メモ4 | Curiosity Drives Me
- ここで躓いた:さくらのVPSでVirtualHost、複数ドメイン
このページでのコメントの受付は終了しました。本ページに関して、御意見、御質問、御批判をお持ちの方で、私に回答を求める方は、システム論フォーラムに投稿してください。





