Apacheでリバースプロキシ(mod_proxy)を活用する(2) – 設定編

2009 年 2 月 5 日 oinume コメントはありません

Apacheでリバースプロキシ(mod_proxy)を活用する(1) – インストール編に続いて、今回は実際にリバースプロキシサーバを構築してみたいと思います。

まずはバックエンドのサーバを準備

リバースプロキシを構築する前に、リバースプロキシサーバからリクエストが転送されるバックエンドのアプリケーションサーバを用意しておきます。今回はUbuntuでaptからインストールできるApacheを使用します。apache2パッケージがインストールされていない場合は、まずはこれをインストールしておきましょう。

$ sudo apt-get install apache2

インストールが完了したら下記のようなアプリケーションサーバ(といってもただCGIスクリプトを動かすだけのサーバ)の設定ファイルを /etc/apache2/httpd_backend_8080.conf として用意します。

#
# /etc/apache2/httpd_backend_8080.conf
#
User www-data
Group www-data
# modules
LoadModule authn_default_module /usr/lib/apache2/modules/mod_authn_default.so
LoadModule authz_default_module /usr/lib/apache2/modules/mod_authz_default.so
LoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so
LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so
LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so
LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so
 
ServerRoot "/etc/apache2"
Listen 8080
ServerName localhost:8080
PidFile /tmp/httpd_backend_8080.pid
ServerAdmin example_at_example.com
DocumentRoot "/var/www/html"
TypesConfig /etc/mime.types
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
ErrorLog /tmp/error_8080.log
CustomLog /tmp/access_8080.log combined
UseCanonicalName Off
AddHandler cgi-script .pl
 
<IfModule prefork.c>
    StartServers         1
    MinSpareServers      1
    MaxSpareServers      5
    MaxClients          20
    MaxRequestsPerChild 50
</IfModule>
<Directory /var/www/html>
    Options ExecCGI FollowSymLinks
    AllowOverride None
</Directory>

設定ファイルを用意したら以下のコマンドでDocumentRootで指定したディレクトリを作成し、その下にCGIスクリプトである index.pl を用意します。

$ sudo mkdir -p /var/www/html
$ sudo chmod 755 /var/www/html
$ sudo vi /var/www/html/index.pl
#!/usr/bin/perl
 
use strict;
use CGI;
 
my $q = CGI->new;
print $q->header(
    -type => 'text/html',
);
 
print <<"EOS";
<html>
<head>
<title>Hello world</title>
</head>
<body>
<h1>Hello world!!</h1>
<img src="httpd_logo_wide.gif" />
</body>
</html>
EOS

index.pl を作成したら実行権限を付与します。そしてサンプルのための画像を Apache のサイトからダウンロードして /var/www/html/httpd_logo_wide.gif として保存します。

$ sudo chmod +x /var/www/html/index.pl
$ cd /var/www/html
$ sudo wget http://httpd.apache.org/images/httpd_logo_wide.gif

これで準備が整いました。アプリケーションサーバの Apache を起動しましょう。

$ sudo /usr/sbin/apache2ctl -f /etc/apache2/httpd_backend_8080.conf -k start

起動したら http://example:8080/index.pl にアクセスして Hello world!! なページが表示されることを確認します。example のホスト名は例なので、お手持ちのマシン名に置き換えてください。これでバックエンドのサーバの設定は完了です。もし起動しない場合はエラーログが /tmp/error.log にあるので、これを確認してみてください。

リバースプロキシの準備

次は肝心のリバースプロキシの設定です。前回 /usr/local/httpd_proxy_2.2.11 にインストールしたので、/usr/local/httpd_proxy_2.2.11/conf/httpd.conf を以下のように修正します。
リバースプロキシの設定については ProxyPassReverse を使うやり方と mod_rewrite の [P] を使う2種類のやり方があると思いますが、今回は mod_rewrite でやりたいと思います。

--- httpd.conf.orig     2009-02-01 13:06:48.000000000 +0900
+++ httpd.conf  2009-02-04 22:40:14.000000000 +0900
@@ -106,7 +106,7 @@
 # documents. By default, all requests are taken from this directory, but
 # symbolic links and aliases may be used to point to other locations.
 #
-DocumentRoot "/usr/local/httpd_proxy_2.2.11/htdocs"
+DocumentRoot "/var/www/html"
 
 #
 # Each directory to which Apache has access can be configured with respect
@@ -412,3 +412,15 @@
 SSLRandomSeed startup builtin
 SSLRandomSeed connect builtin
 </IfModule>
+
+<Directory /var/www/html>
+    Options Indexes FollowSymLinks MultiViews
+    AllowOverride Indexes Limit
+    Order allow,deny
+    Allow from all
+</Directory>
+
+RewriteEngine on
+RewriteRule ^/(.+)\.pl$ http://localhost:8080/index.pl [L,P,QSA]
+RewriteRule ^/(.+)\.(gif)$ /var/www/html/$1.$2 [L,QSA]

修正内容を順番に大雑把に解説すると

  1. DocumentRootの変更
  2. /var/www/htmlディレクトリの設定
  3. mod_rewriteによるリバースプロキシの設定

となります。詳しく見ておきたいのは3.の部分で

RewriteEngine on

というディレクティブで mod_rewrite によるURLの書き換えを有効にし

RewriteRule ^/(.+)\.pl$ http://localhost:8080/index.pl [L,P,QSA]

で 拡張子が .pl のファイルを先ほど設定したバックエンドのサーバに転送し

RewriteRule ^/(.+)\.(gif)$ /var/www/html/$1.$2 [L,QSA]

拡張子が .pl 以外の .gif ファイルはこのリバースプロキシサーバ自体が処理する、という設定になっています。つまり、index.pl 内で使用しているスタティックな画像ファイル httpd_logo_wide.gif はプロキシサーバによって処理されますが、index.pl のファイルは動的にコンテンツを生成するCGIスクリプトなので、バックエンドのアプリケーションサーバにリクエストが転送されます。

ちなみに RewriteRule で使っている L, P, QSA のようなオプションの意味ですが

  • L – このルールが適用されたらそれ以降のルールは実行されない
  • P – プロキシとしてURLの書き換えを行う
  • QSA – URLの?以降のQUERY_STRINGを転送先のURLに常につける

という意味になります。詳しくはmod_rewrite – Apache HTTP Serverに書いてあるので参照してみてください。

動作確認

これで全ての準備が整ったので mod_proxy サーバを起動します。

$ sudo /usr/local/httpd_proxy_2.2.11/bin/apachectl -k start

そしてブラウザから http://example/index.pl にアクセスしてみましょう。Hello world!! のあとにApache のロゴが表示されているでしょうか。表示されていればリバースプロキシサーバの構築は完了ですが、念のため本当にリバースプロキシで動いているのか、アクセスログを見て確認してみましょう。リバースプロキシのログは /usr/local/httpd_proxy_2.2.11/logs/access_log にあります。

192.168.1.54 - - [05/Feb/2009:02:12:43 +0900] "GET /index.pl HTTP/1.1" 200 129
192.168.1.54 - - [05/Feb/2009:02:12:44 +0900] "GET /httpd_logo_wide.gif HTTP/1.1" 200 -

このログには上のような2つのログが出ているはずです。次にバックエンドのサーバのログを見てみます。これは /tmp/access.log にあります。

127.0.0.1 - - [05/Feb/2009:02:12:43 +0900] "GET /index.pl HTTP/1.1" 200 129 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5"

こちらのログには index.plのアクセスのみで httpd_logo_wide.gif へのアクセスはないはずです。これが確認できれば mod_proxy によるリバースプロキシサーバ構築に成功ということになります。ここまで設定できれば、あとは応用で「バックエンドのサーバを2台にして運用する」ということも可能になります。次回はそういう負荷分散も視野にいれたエントリを書きたいと思います。

なお、今回記載した Apache の設定は、簡潔なサンプルであるためセキュリティ的にはよろしくありません。なので、インターネットにつながっているサーバではこの記事の内容を試す場合、動作確認後すみやかに Apache のプロセスを落としておいた方が良いかと思います。

2009/04/06: 後世のためにバックエンドの設定ファイルの名前を /etc/apache2/httpd_backend.conf から /etc/apache2/httpd_backend_8080.conf に変更しました。

Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集

著者/訳者:Ken Coar Rich Bowen

出版社:オライリージャパン( 2008-09-26 )

大型本 ( 308 ページ )


カテゴリー: Apache タグ: ,

ケータイ対応だけじゃ駄目だよね

2009 年 2 月 4 日 oinume コメントはありません

ミクシィのケータイへのシフトを読み解く at Naofumi Kagamiというエントリの最後の方に書いてある

日本のインターネット産業には、安易に携帯電話にシフトするのではなく、パソコンでのビジネスモデルをどのように発展させていくかということをもっと真剣にやってもらいたいと思っています。

という一文にはっと思いました。確かに今の日本のモバイルの利用状況は半端なく、今や携帯で転職活動までしてしまう時代ですが、そういう状況はいつまでも続かないよね、っていうのを完全に忘れていました。昨年は日本でもiPhoneが発売されたし、Googleのアンドロイド携帯もそろそろ来そうな感じなので、携帯電話のPC化という土壌は徐々に出来上がっているのだと思います。
ケータイの過熱ぶりに冷水を浴びせるいいエントリだと思いました。

カテゴリー: 日記 タグ:

UQ WiMAXモニターに申し込みました

2009 年 2 月 4 日 oinume コメントはありません

IT Mediaの記事によると

KDDIや米Intel Capitalなど6社が出資するUQコミュニケーションズは2月3日、モバイルWiMAXサービス「UQ WiMAX」の無償トライアルを2月26日に始めると発表した。有料の本サービスは7月1日にスタート。月額4480円で使い放題になる。

 UQ WiMAXは、国内で唯一、全国をカバーする予定のWiMAXサービス。下り最大40Mbps、上り最大10Mbpsで通信でき、発表会を行った帝国ホテル(東京都千代田区)では、下り約16Mbps、上り約3.9Mbpsで通信していた。

とのことなので、勢いで6月まで無料なモニターに応募してみました。興味のある人はこちらからどうぞ。今年はwilcomも高速データ通信をリリースするはずなので、今年はモバイル通信が楽しくなりそうです。

カテゴリー: 日記 タグ:

FirefoxでDNSプリフェッチを行うアドオン

2009 年 2 月 1 日 oinume コメントはありません

Chromeはなぜ速いのか − @ITの記事でDNSプリフェッチで高速化をしているということが載っていたので、Firefoxで同じことができないかを調べていたら、DNS Prefetch :: Firefox Add-onsというそのままずばりのアドオンを見つけました。

で、早速入れてみたのですが、体感的には「ちょっと速くなったかも」というレベルのものでした。ウチのネットワークにはDNSキャッシュサーバがあるので、そもそもそんなに名前解決に時間かかっていなかったのかも…プロバイダが提供しているDNS使っている場合とかは恩恵に預かれるのでしょうか…

カテゴリー: Firefox タグ: ,

WordPressをインストールしてからインストールしたプラグイン

2009 年 1 月 30 日 oinume コメントはありません

WordPressをインストールしてからそろそろ1ヶ月になるので、その間にインストールしたプラグインをまとめてみました。全部実用に足るものだったので個人的にはおすすめです。*印がついているものはこのブログの該当エントリーへのリンクで、それ以外はプラグイン本体へのリンクです。

*All in One SEO Pack

投稿ごとにmetaタグのkeywordsやdescriptionが設定できるようになったり、titleタグにブログのタイトルを設定できるようになります。

*Breadcrumb Navigation XT

パンくずナビゲーションを追加します。サイト内のリンク構造を改善することでSEO効果が得られるようになります。

Broken Link Checker

ブログ内のリンクでリンク切れになっているものを見つけてくれるプラグイン。

Dagon Design Sitemap Generator

ブログのサイトマップを生成するプラグイン。サイトマップを作ると検索エンジンのクローラーがページを巡回してくれる確率が高くなります。

*FeedBurner FeedSmith

生成されるRSSのURLを変更できるようにするプラグイン。

Google (XML) Sitemaps Generator for WordPress

Google Sitemapプロトコルに対応した XML のサイトマップファイルを自動で生成するプラグイン。これを導入するとクローラーがページを巡回する確率が高くなります。

*Ktai Style (携帯対応プラグイン)

WordPressを日本の携帯端末に対応させるプラグイン。URLはそのままで携帯端末でアクセスするとモバイル用の画面が表示されます。

pagebar

TOPページやカテゴリの一覧ページなど、投稿を一覧表示する画面にPagenationを埋め込むプラグインです。SEO対策で全ページくまなくインデックスされるように仕込んでみました。

Search Word Highlight for Multibyte

検索エンジンからサイトに飛んできた際に、検索エンジンでの検索語をサイト上でハイライト表示するプラグインです。はてなダイアリーでもこのような機能がついているので入れてみました。

*Similar Posts

今表示している投稿に似ている投稿を表示するプラグイン。投稿の単語を調べて似ているものを探しているようです。読者のために似ている投稿をおすすめすることでPVアップが見込めるでしょう。またサイト内のリンク構造も改善されるのでSEO対策としても有効だと思います。

Ultimate Google Analytics plugin for WordPress

Google Analyticsの設定をWordPressの管理画面で行うためのプラグイン。WordPressにログインしている場合はトラッキングしないなどの設定が行えます。

WordPress Database Backup

WordPressのデータベースのバックアップを管理画面から行ってファイルをダウンロードできるようにするプラグイン。定期的にバックアップを取ってメール送信するようなこともできます。

Wordpress Media Flickr

WordPressの管理画面からFlickrの写真を選択してブログに引用できるようにするプラグイン。インタフェースがわかりやすくて使いやすいです。Flickrのヘビーユーザにおすすめのプラグインです。

*WP-chgFontSize

WordPressのテーマはなぜかフォントサイズが小さいので、フォントサイズを変更するプルダウンを表示するプラグインです。このブログでは右ナビに設定しています。

*WP-Syntax

ソースコードをカラー表示にしてくれるプラグイン。存在するプログラミング言語にはほぼ全て対応しているのと、<>のタグを自動でエスケープしてくれるのが素晴らしいです。

wp-tmkm-amazon

投稿内でAmazonの書籍などを引用するためのプラグインです。Amazon系のプラグインは色々乱立していたのですが、これが一番シンプルっぽいので選びました。

なお、プラグインの選定に関しては以下のページを参考にさせてもらっています。

カテゴリー: WordPress タグ:

Apacheでリバースプロキシ(mod_proxy)を活用する(1) – インストール編

2009 年 1 月 29 日 oinume コメントはありません

Apacheはとてもとても有名なWeb Serverですが、今日はそのチューニング方法の一つであるリバースプロキシについて書きたいと思います。

Webサーバの種類

一口にWebサーバと言っても、ダイナミックなWebコンテンツを生成するサイトにおいてWebサーバがserveするものは2種類あります。一つはプログラムで動的に生成されるHTMLファイル。もう一つがGIFやJPEG, PNGなどの画像、および Flash, JavaScript, CSSなどの静的なファイルです。

プログラムで動的にHTMLを生成するためには、そのプログラムを動かす実行環境がWebサーバ(Apache)と連携する必要があります。いわゆるCGIとか最近だとFastCGI, mod_php, mod_perl, mod_rails, mod_pythonなどのスクリプト環境がよく使われています。これらの環境は昨今では「事前に実行環境(インタープリター)の起動をしてプログラムをコンパイルしておきそれを再利用する」というような使われ方をするため、Apacheがクライアントからの要求を処理するために生成する子プロセスのメモリ使用量が肥大化し、プロセスを起動する処理が重くなる傾向にあります。

一方で、単純にファイルの中身をそのままクライアントに渡せばいいようなスタティックなファイルが、このような肥大化したプロセスで処理されることには非常に無駄があります。そこでリバースプロキシの出番です。リバースプロキシの動作は凄くシンプルで、リクエストを受けたら、ダイナミックなページのリクエストのみバックエンドのアプリケーションサーバに渡し、それ以外のスタティックなファイルは自分自身で直接処理します(*1)。図にするとこんな感じでしょうか。

リバースプロキシのイメージ

このような単純な動作なので、リバースプロキシ自体にはmod_perlやmod_phpなどを組み込む必要がなくなり、プロセスのサイズは非常にスリムになります。実際このブログを動かしているマシンでも

  • リバースプロキシのプロセスサイズは3.5MB程度
  • mod_phpのプロセスサイズは25MB程度

となっており、一プロセスあたりで20MBも違います。

さらに、リバースプロキシは動作がシンプルなので、ApacheのMPM(Multi-Proccessing Module)にworkerというものを選択することができます。worker mpmはクライアントからのリクエストを処理するのにプロセスより軽量なスレッドを使用するため(*2)、prefork mpmと比べて動作が軽いという特徴があります。

*1)これは設定自体でどうにでも変更できます
*2)厳密に言うとプロセス+スレッドのハイブリッド方式です

また、フロントエンドのリバースプロキシ+バックエンドのアプリケーションサーバという構成にしておくことで、リバースプロキシは止めずにバックエンドのサーバを増やしたり交換したりすることが可能です。このため負荷分散のためのメンテナンスが非常にやりやすくなります。このあたりはmod_proxy_balancerというモジュールの話になるので今回は割愛しますが、また機会があればということで。

Apache 2.2.11のインストール

前置きが長くなりましたが、リバースプロキシを導入するメリットがわかったところで実際にApacheをインストールしてみたいと思います。環境は Ubuntu 8.10 Interpid です。
まずは最新版である2.2.11のソースを Apache本家 からダウンロードしておきます。

$ tar xvzf httpd-2.2.11.tar.gz
# ちょっとでも最適化する
$ export CFLAGS="-O3"
$ cd httpd-2.2.11
$ ./configure --prefix=/usr/local/httpd_proxy_2.2.11 \
 --with-mpm=worker \
 --enable-shared \
 --enable-so \
 --disable-asis \
 --disable-cgid \
 --disable-proxy-connect \
 --disable-proxy-ftp \
 --disable-proxy-ajp \
 --disable-userdir \
 --disable-actions \
 --enable-modules='rewrite proxy proxy_balancer proxy_http cgi deflate headers expires' \
 --enable-mods-shared='ssl cache disk_cache mem_cache' \
 && make && sudo make install

でインストールが完了です。configureにいろいろとオプションを渡していますが、これらは

  • 確実に使用するモジュールを静的にリンクさせる
  • 不要なモジュールは無効にする
  • 必要になるかもしれないモジュールはDSOとして組み込めるようにしておく

という指定です。/usr/local/httpd_proxy_2.2.11 にApacheのファイル一式がインストールされているので、起動確認を行いましょう。

$ sudo /usr/local/httpd_proxy_2.2.11/bin/apachectl start

でサーバが起動するので、http://localhost/ にアクセスしてみてください。”It works!”と表示されればインストール成功です。次回は具体的なリバースプロキシの設定方法を説明します。

Apache辞典 (DESKTOP REFERENCE)

著者/訳者:松本 光春

出版社:翔泳社( 2004-09-17 )

単行本 ( 463 ページ )


カテゴリー: Apache タグ:

ブログのファイルをSubversionリポジトリで管理するように

2009 年 1 月 25 日 oinume コメントはありません

色々気になるところがあってiNoveのテーマのファイルをいじりまくっているのですが、テーマをバージョンアップするとせっかく施した修正が吹っ飛んでしまうので、どこをどう修正したのかを管理するためにSubversionでバージョン管理するようにしました。

世間の流れ的に、最初は張り切ってgitを使っていたのですが

  • git statusとかgit commitとか、フルスペルでタイプしないといけない(svnはsvn st、svn ciとか略式がある)
  • git push origin master とかコマンド群がわかりづらい
  • git status の表示が見にくい

という点がどうしても気になったので、慣れ親しんだsvnで管理することにしました。まぁ上の3点ははっきりいって慣れの問題ですし、gitのブランチの作成→マージのお手軽さは素晴らしいのですが、svnが許されるのは小学生までと言われるまではsvnで頑張ろうと思います。ヒマがあったらbazaarも試してみたいです。

カテゴリー: 日記 タグ:
Pages: << 1 2 3 ...12 13 14 15 16 17 18 19 20 >>