案内編論文編書籍編雑記編

さくらの 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アドレスを対応付けさせる名前解決を行わなければなりません。名前解決には、以下の四つの方法があります。

  1. BIND を用いて、さくらの VPS でネームサーバを構築し、運用する。
  2. ドメインを取得した管理事業者が提供するネームサーバを利用する。
  3. さくらインターネットが提供するネームサーバを利用する。
  4. サードパーティのDNSサービス提供業者のネームサーバを利用する。

このうち、一番目の方法は、設定が難解なので、素人向きではありません。二番目と三番目は、それよりも簡単かつオーソドックスですが、四番目には、これから述べるように、二番目と三番目にないメリットもあるので、ここでは四番目の方法を採用することにします。

1.2. CloudFlare を利用する

世界には、無料のネームサーバ・サービスがたくさんありますが、中でもお勧めなのが、クラウドフレア(CloudFlare)のサービスです。CloudFlare は、以下の概略図に示されているように、たんにネームサーバ・サービスをしてくれるのみならず、ウェブ・サーバ上のコンテンツの中でキャッシュ可能なファイルを複数サーバにキャッシュすることで、ページ・ロードをスピードアップしたり、サーバのセキュリティを強化したりするなど、包括的なコンテンツ・デリバリー・ネットワーク・サービスを提供してくれます。しかも、SSL 通信を行うページを公開するなどの特殊なサイトを除けば、無料で基本的なサービスを受けることができます。

An Overview of CloudFlare
図1 Cloudflare がある場合(左)とない場合(右)。[An Overview of CloudFlare

登録するには、Sign up のページに行って、以下の操作を行います。

1.登録するドメインを入力し“Add this domain”をクリックします。

2.メールアドレスとユーザ名、パスワードを設定し、チェックボックスにチェックをいれ、“ Sign up CloudFlare ”をクリックします。

3.“Continue to Step 2”ボタンが表示されたら、それをクリックします。

4.入力したドメインのDNS情報が表示されるので、IP アドレスを変更します。新しい IP アドレスは、申し込み後に送られてくる「仮登録完了のお知らせ」というメールに書かれているので、それを使いましょう。DNS 情報が何もない場合や必要なレコードが欠けている場合は、以下の表を参考に追加し、“continue”をクリックします。

DNS レコード記入例
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”という画面が出てきたら、成功。

Apache 2 Test Page powered by CentOS
図2 http://IPアドレス/ にアクセスしたときの画面

しかし、これだけでは、DNS の設定が成功であるかどうかはわからないので、登録したドメインにブラウザでアクセスして、アップロードしたファイルが表示されているかどうかを確かめなければなりません。

ブラウザを使わずに、設定が正しいかどうかを確認する方法もあります。

nslookup ドメイン名

あるいは

dig ドメイン名

というコマンドで、望んだ通の設定が反映されているかどうか確かめることができます。DNSサーバ接続確認というページからも確認ができます。

Internet → CloudFlare → Nginx → Varnish → Apache システムの構築が完了したら、次に、PHP の設定を行い、APC + Memcached でさらにサイトを高速化させましょう。

参考文献
[投稿者:永井俊哉]
ブログ内移動
カテゴリー内移動
お知らせ

このページでのコメントの受付は終了しました。本ページに関して、御意見、御質問、御批判をお持ちの方で、私に回答を求める方は、システム論フォーラムに投稿してください。

Sponsored Links
Books