• [apache] apacheでリバースプロキシーを設定したときのメモ

    apacheでリバースプロキシの設定をしました。 ■ 条件など ・Apacheのバージョンは2.2.8 ・画像、css、jsなどの静的ファイルについてはリバースプロキシで配信を行う。 ・動的なファイルのときはアプリケーションサーバにリクエストをプロキシする ・画像、css、jsのパスはそれぞれ以下の通り``` wadslab.net/images wadslab.net/css wadslab.net/js **■ 設定** リバースプロキシの設定を行うのに必要なApacheのモジュールは以下のとおりです。``` mod\_rewrite mod\_proxy mod\_proxy\_http ```設定は、リバースプロキシサーバーのhttpd.confとか、httpd.confの下のほうにある``` \# Virtual hosts #Include conf/extra/httpd-vhosts.conf ```のIncludeの部分をコメントアウトして、httpd-vhosts.confを編集します。 設定の内容は以下のようになります。``` ServerName wadslab.net RewriteEngine On RewriteRule ^/(images|css|js|)/ - \[L\] RewriteRule ^/(.\*)$ http://192.168.0.100/$1 \[P,L\] ```これでapacheを再起動すればバースプロキシの設定は終了です。簡単ですね。 一度リクエストをかけた後、リバースプロキシ、アプリケーションサーバの両方でaccess\_logをみて、うまくリクエストを振り分けられたかどうか確認できます。 **■ ssl通信を処理するときの設定** 上記設定は80番のポートに対しての設定だったので、ssl通信についてもリバースプロキシで処理する場合はもう少し設定が必要す。 sslでのリクエストの場合は、私の環境ではhttpd.confを以下のように編集して、``` \# Secure (SSL/TLS) connections Include conf/extra/httpd-ssl.conf #コメントをはずす ```httpd-ssl.confというファイルで設定をしています。 以下、これを前提に記述します。 sslでリクエストがきた場合、httpd-ssl.conf内の``` ... ```のディレクティブの設定が適用されます。 設定自体は、上記ディレクティブ内に``` RewriteEngine On RewriteRule ^/(images|css|js|)/ - \[L\] RewriteRule ^/(.\*)$ http://192.168.0.100/$1 \[P,L\] ```と書けばOKです。 設定の通り、リバースプロキシーとアプリケーションサーバ間のリクエストは非sslとなるので、アプリケーション側でsslでのリクエストかどうかを知りたい場合は、ちょっと工夫が必要です。 以下のように、プロキシさせる場合にはヘッダーを設定して、``` RewriteEngine On RewriteRule ^/(images|img|css|js|favicon\\.
  • [mysql][Apache] mod_log_sql関連のベンチマーク

    前回設定した項目についてベンチマークをとりました。 今回のテストケースは 通常のaccess_log(ファイル)に保存 BufferedLogsディレクティブをONにしたaccess_log mod_log_sql+MyISAMストレージエンジン mod_log_sql+Archiveストレージエンジン の4つです。 それぞれ上記設定をしたwebサーバに、apacheのabコマンドを使ってテストしました。``` # /usr2/apache2/bin/ab -c 100 -n 10000 http://example.com/ 1度に100ユーザ同時接続し、合計で10000回リクエストをかけています。 リクエストをかけると、以下のようなシンプルなレスポンスが帰ってきます。 これは静的ファイルで用意されています。 test テストケース リクエスト数/秒 1に対する割合 1 7598.81 100% 2 8670.88 114.1% 3 4340.90 56.7% 4 3119.29 41.0% mod\_log\_sqlを使うと、MyISAMを用いた場合はもともとの57%弱、Archiveに至っては40%程度しかパフォーマンスが出ていません。結構性能が落ちていますね。 INSERTパフォーマンスは、ArchiveだとMyISAMの1.5倍くらいあると聞いていたので、Archiveのほうがパフォーマンスがよくなると予測していたのですが、そのような結果にはなりませんでした。同時接続数とか条件で変わってくるのかもしれませんが、今回は検討しません。 続いて、ログファイルのサイズについて検討します。 dbに保存されたデータについては、``` SHOW TABLE STATUS LILE 'access\_log'\\G \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 1. row \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* Name: access\_log Engine: ARCHIVE Version: 10 Row\_format: Compressed Rows: 119070 Avg\_row\_length: 11072 Data\_length: 2764858 Max\_data\_length: 1318343040 Index\_length: 0 Data\_free: 0 Auto\_increment: NULL Create\_time: 2008-12-02 16:30:49 Update\_time: 2008-12-02 16:30:49 Check\_time: NULL Collation: utf8\_general\_ci Checksum: NULL Create\_options: Comment: 1 row in set (0.
  • [mysql][Apache] mod_log_sqlを使ってApacheのアクセスログ(access_log)をmysqlのARCHIVEストレージエンジンに保存する

    mod_log_sqlを使って、Apacheのアクセスログをmysqlに保存する設定をしたときのメモです。 アクセスログを保存するmysqlのストレージエンジンには、前からずっと気になっていたARCHIVEストレージエンジンを使用しました。 ■ ARCHIVEストレージエンジンについて ロギングや監査用途に向いている。SELECT、INSERT命令しか使えない INSERTのパフォーマンスはMyISAMの1.5倍、InnoDBの3.5倍 データは圧縮して格納(圧縮率70~80%) インデックスは非対応 一般ユーザーの利用率は5%程度 すべて以前行ったセミナーでもらった資料より抜粋です。 ■ ログを保存するデータベースを作成 mysqlのインストールは完了しているものとして割愛します。 ただmysqlをソースからビルドしてインストールする場合には、configure時に–with-archive-storage-engineオプションを追加しないとARCHIVEストレージエンジンは使用できません。 現在のMySQLでARCHIVEストレージエンジンが有効かどうかを調べるには以下のようにします。``` mysql> show variables like ‘have_archive’; +—————+——-+ | Variable_name | Value | +—————+——-+ | have_archive | YES | +—————+——-+ 1 row in set (0.00 sec) 結果にYESと出ればARCHIVEストレージエンジンを使用できます。 もしNOと出た場合には、--with-archive-storage-engineオプションをつけて再度mysqlをビルドする必要があります。 続いてログ保存用のデータベースを、apachelogsという名前で、ストレージエンジンをARCHIVEで作成します。 /etc/my.cnfに以下のように設定してデフォルトのストレージエンジンをARCHIVEにします。設定後にmysqlを再起動します。 [mysqld] default-storage-engine=archive ストレージエンジンの設定方法は他にも色々あります(テーブル作成時に設定とか、alter tableとか)が、ここでは割愛します。 続けてログを保存するデータベースの設定をします。 mysql> create database apachelogs; Query OK, 1 row affected (0.00 sec) mysql> use apachelogs; Database changed mysql> grant INSERT, CREATE ON apachelogs.
  • [Apache] mod_deflateでコンテンツをgzip圧縮して通信する 2

    前回の続き。 proxyサーバを経由してアクセスしている場合に、mod_deflateでコンテンツを圧縮して通信していると問題になるのがproxyのキャッシュです。 アクセスによっては、gzip圧縮非対応のブラウザがgzipされたコンテンツを受け取ってしまうようなケースが出てきます。 対策として、サーバからのレスポンスにVaryというヘッダーを追加すると、このヘッダで設定した項目に従ってproxyへキャッシュさせるかどうかを指定させられます。 例えば、``` Vary: Accept-Encoding というヘッダを追加すると、リクエストヘッダにAccept-Encodingという名前のヘッダの値ごとにキャッシュをするようになります。 Accept-Encodingヘッダは、クライアントがサポートしている圧縮方法を表しています。もしサポートしていない場合はこのヘッダは見つかりません。よって、 Vary: Accept-Encoding というヘッダがレスポンスにあれば、少なくともあgzip対応、非対応のクライアントで使用するキャッシュを分けることができます。こうすれば、gzip非対応のクライアントにgzipされたコンテンツが渡されることはなくなります。 ちなみに、上記のヘッダはApache2.xのmod\_deflateではデフォルトで付加されるようです。 VaryヘッダにAccept-Encodingだけでなくその他のヘッダ(例えばUser-Agent)も加えたい場合には、以下のように Header append Vary ヘッダ名 の記述をhttpd.confに加えます。また、新しくVaryヘッダを設定しなおす場合には Header set Vary ヘッダ名 と記述します。 このような Header xxx の設定を行うには、以下のようにしてmod\_headersモジュールを組み込みます。 % ./configure –enable-headers % make clean % make su make install
  • [Apache] mod_deflateでコンテンツをgzip圧縮して通信する

    mod_deflateを使って通信を圧縮する設定をします。 圧縮するコンテンツのタイプは、htmlとcss、javascriptを対象とします。 Apacheのコンパイル Apacheのバージョンは2.2.9を使用``` $ ./configure –enbale-deflate=shared $ make $ su make install **httpd.confの編集** 一番簡単な設定は以下の1行を追加するだけです。 AddOutputFilterByType DEFLATE text/html text/css application/x-javascript 特定のディレクトリ以下にだけ適用する場合は以下のように、ディレクティブ内に記述します … AddOutputFilterByType DEFLATE text/html text/css application/x-javascript もう少し細かく設定もできます。 例えば、ブラウザによってはgzip圧縮に対応していない場合があるので、それらのブラウザ(ユーザーエージェント)からのアクセスされた場合には圧縮しないように設定ような場合は、以下のようになります。 BrowserMatch ^MSIE [6-9] gzip BrowserMatch ^Moxilla/[5-9] gzip 続いて、正しく圧縮されているかどうかを確認するために、ログの設定を行います。 DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio LogFormat ‘"%r” %{outstream}n/%{instream}n (%{ratio}n%%) %{User-agent}i’ deflate CustomLog logs/deflate_log deflate DeflateFilterNoteのInputは圧縮前のバイト数、Outputは圧縮後のバイト数、Raitoは圧縮率(Input × Output × 100)をあらわします。 設定の詳細および、その他の設定は[Apacheのドキュメンテーション](http://httpd.apache.org/docs/2.2/mod/mod_deflate.html)を参照してください。 **設定できたか確認する** これで基本的な設定が終了しましたので、実際に圧縮されているか確認します。 Apacheを再起動後、設定をしたページにアクセスしてdeflate\_logを確認します。 $ less /usr/local/apache2/log/deflate_log “GET / HTTP/1.1” 5464/44920 (12%) Mozilla/5.