Browse Tag: apache

mod_proxy_html

mod_substitue を使うと、手軽に Apache プロキシ経由で HTML コンテンツを書き換えることができて、とても便利です。

例えば、ActiveMq の管理画面なんかは、次のような設定にすると http://proxy/mq1/ 以下に手軽にまとめることができます。


<Location /mq1>
ProxyPass http://mq1:8161
ProxyPassReverse http://mq1:8161
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s| href=[\"']([^\"\?]*)[\"']| href=\"/mq1$1\"|"
Substitute "s| src=[\"']([^\"\?]*)[\"']| src=\"/mq1$1\"|"
Substitute "s|url\(([^(]*)\)|url(/mq1$1)|"
</Location>

Hadoop(CDH) の管理画面の場合は、次のような設定になります。同じく、/dfs でアクセスできるようにしています。

<Location /dfs>
ProxyPass http://namenode1:50070
ProxyPassReverse http://namenode1:50070
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s| href=[\"']([^\"\?]*)[\"']| href=\"/dfs$1\"|"
Substitute "s|;url=([^\"\?]*)\"|;url=/dfs/$1\"|"
</Location>

JobTracker の場合は、次のような感じですね。

<Location /jobtracker1>
ProxyPass http://jobtracker1:50030
ProxyPassReverse http://jobtracker1:50030
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s| href=[\"']([^\"\?]*)[\"']| href=\"/hj1$1\"|"
Substitute "s|;url=([^\"\?]*)\"|;url=/hj1/$1\"|"
Substitute "s| src=[\"']([^\"\?]*)[\"']| src=\"/hj1$1\"|"
</Location>

同じような Apache module に、mod_proxy_html があるんですが、思い通りに HTML コンテンツを書き換えることができなかったので、mod_substitute でやってみました。

 

闇Webサーバ勉強会 #5 – Apache 2.4 Changelog 和訳編

みなさん、こんばんは。
先日、Webサーバ勉強会 #5という楽しい勉強会が開催されたようです。
この勉強会には参加できなかったのですが、その日の夜日本のどこかでこっそり一人で闇Webサーバ勉強会 #5を開催したので、そのときの資料を公開します。#5 といっても、五回目ではなく、Webサーバ勉強が五回目だったので、それにあわせているだけです。

そこに広がるのは、無限の、闇、闇、そして闇。
一部内容におかしい箇所があるかもしれませんが、そこは闇ということでご了承下さいませ。

mod_log_rotate をミラーしました

日頃、愛用している mod_log_rotate の公式ページがリンク切れになってしまったので、github の方に取り急ぎ、こちらにミラーしました。

mod_log_rotate 細かいところを改善したいことがあるので、対応次第、このブログにアップしていきたいと思います。

あと、個人的には公式の rotatelogs とのパフォーマンス測定などもしてみたいです。

mod_rewrite で独自の変数を使う方法

Apache の mod_rewrite で、SetEnv や SetEnvIf した変数を使う方法にすこしはまったので、備忘録として残しておきます。

まず、最初にやりたかったのは、次のような VirtualHost を定義している状態で、任意のサーバへリバースプロキシとして設定しているとき、リクエストホスト名ごとにリバースプロキシするときのポート番号を変更したかった。


ServerName s*.example.com
LogLevel warn
ErrorLog "|/usr/sbin/cronolog /var/log/server_error_log.%Y%m%d"
CustomLog "/var/log/example_access_log.%Y%m%d" combined

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SetEnvIf User-Agent “.*MSIE.*” \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

SSLProxyEngine On
RewriteEngine On
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [P,L]

RewriteRule の中で変数を使うには、%{ENV:変数名} という書式を使用する。なので、その前に SetEnv あるいは SetEnvIf すればその変数を使えるのかなと試してみたけれど、使えなかった。

結局、次のようにしたらできるようになった。

...
SSLProxyEngine On
RewriteEngine On
RewriteRule ^(.*)$ - [E=PORT:2381]
RewriteCond %{HTTP_HOST} ^s[1-5]\.example\.com$ [NC]
RewriteRule ^(.*)$ - [E=PORT:1311]
RewriteRule (.*) https://%{HTTP_HOST}:%{ENV:PORT}%{REQUEST_URI} [P,L]

上のルールだと、リクエストホスト名が s1.example.com から s5.example.com までのとき、バックエンドの sX.example.com:1311 にリバースプロキシ接続する。それ以外のホスト名のとき、sX.example.com:2381 へ接続するというルールになる。

第三回ウェブサーバ勉強会で話してきました

先月になりますが、行われた第三回ウェブサーバ勉強会で話してきました。
テーマは、個人的に前々から使ってみたいと思っていた mod_security で、超入門編です。分からないところがいくつかあってすいません。。。
個人的な想像よりも、mod_security かなり複雑な様子なので、しっかり習得する時間を作る必要がありそうです。

また、その後の懇親会で、次回のテーマがざくっと決まったので、次回も楽しみです。
ウェブサーバ勉強会は、参加者が全員発表するという珍しいスタイルの勉強会ですが、主催者の oranie さんが教えてもらうという立場でやっている緩い勉強会なので、興味のある方は参加してみましょう!

Apache で特定の URL のみ Basic 認証を外す方法

Apacheのベーシック認証の応用をみて、試してみた。

例えば、次のような設定を書いたとする。

<VirtualHost * *:443>
ServerName test.localhost
DocumentRoot /var/www/html

<Directory /var/www/html>
Allow from All
</Directory>

<Location />
AuthType Basic
AuthName “test”
AuthUserFile /var/www/.htpasswd
Require valid-user
</Location>

<Location /test>
Order allow,deny
Allow from all
Satisfy Any
</Location>
</VirtualHost>

このような VirtualHost を設定しておくと、http://test.localhost 以下の /test 以外は Basic 認証がかかった状態になる。たまに、こういった設定も必要なときがあるので、これは便利。

参考資料

Apache の mod_asis モジュール

Apache のモジュールに、mod_asis というモジュールがあります。このモジュールを使うと、静的ファイルに HTTP の応答ヘッダーの情報を含ませることができます。

このモジュールを使うと、例えば GIF ウェブビーコンファイルを配信するときにキャッシュさせないように HTTP の応答ヘッダーの情報を含ませて配信することができます。プログラムを通さずに、静的ファイルな配信となるところがよいです。

まず、mod_asis はデフォルトでは読み込まれていないので、次のように LoadModule でモジュールを読み込みます。下記は、64 ビット OS の場合です。

LoadModule asis_module /usr/lib64/httpd/modules/mod_asis.so

次に VirtualHost の中などで、mod_asis のハンドラを設定します。

AddHandler send-as-is asis

これで、asis という拡張子のファイルが mod_asis の対象になります。

あとは、asis ファイルを作成して DocumentRoot 以下に配置するだけです。次のようなテキストファイルと対象の GIF を cat コマンドで結合するだけです。

Status: 200 OK
Content-Type: image/gif
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Pragma: no-cache
Cache-Control: no-cache

HTTP の応答ヘッダーなので、最後に1行空行を追加するのを忘れないでください。

作成した GIF の asis ファイルは、次のようになります。

Status: 200 OK
Content-Type: image/gif
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Pragma: no-cache
Cache-Control: no-cache

GIF89 …<GIF のバイナリデータ>

あとは、curl –head などで、対象の GIF ファイルにアクセスしてみて、設定した応答ヘッダーを返しているかチェックして完了です。

例えば、メンテナンス中に、さきほど作成した画像を表示するには、次のように mod_rewrite を設定します。

AddHandler send-as-is asis

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteRule ^(.*)$ /images/maintenance.gif.asis [NC,L]

ある HTTP 応答ヘッダーを返したいとき、プログラムを通さずにできるので重宝しそうな Apache モジュールです。

Apache がセマフォを使いきる

Apache の負荷が高いときに Apache を service httpd restart として再起動すると、まれに次のようなエラーメッセージを表示して Apache を再起動できないときがある。

[Mon Feb 09 17:54:50 2009] [crit] (28)No space left on device: mod_rewrite: could not create rewrite_log_lock
Configuration Failed

えっ、ハードディスクの空き容量がなくなったと勘違いしそうなエラーメッセージだけれど、これは Apache がセマフォを使いきっているために起こる現象。サーバを再起動すればすぐになおすことができるが、そうそうサーバを再起動できないので、次のコマンドで Apache ユーザが使用しているリソース一覧を表示して確認する。

$  sudo ipcs -s | grep apache

0x00000000 7831552    apache    600        1

(略)

Apache が起動していないのに、Apache ユーザが使用しているリソースがあるのはおかしいので、次のコマンドでリソースを解放する。

$ sudo ipcs -s | grep apache | awk ‘{print “sudo ipcrm -s “,$2}’  | sh

これで、ちゃんと Apache を起動することができる。

mod_log_rotate のススメ

Apache HTTP Server で、logrotate したくないとき、CustomLog や ErrorLog を日付別に出したい。調べてみると、次の二つのがメジャーのようだ。

どちらもパイプ経由でアクセスの多いサーバだと重いかなと懸念していたんだけれど、開発を依託している技術者から mod_log_rotate という Apache モジュールがあることを教えてもらった。
さっそく、Apache HTTP Server 2.2.11 で試していた。
インストールは、wiki にあるとおり、次のコマンドを実行するだけ
$ sudo apx -i -a -c mod_log_rotate.c
続いて、次のように設定する。
LoadModule log_rotate_module modules/mod_log_rotate.so
RotateLogs On
RotateLogsLocalTime On
RotateLogsLocalTime On がないと、ログのファイル名の日時が UTC になるので注意。あとは、CustomLog に次のような設定する。
 CustomLog “/var/log/httpd/access_log.%Y%m%d” combined
このように設定すると、/var/log/httpd/access_log.YYYYMMDD というファイル名になる。ErrorLog は、Apache の仕様でハンドリングできないということで ErrorLog の方は出力されないのが普通なので cronolog を使うことにした。rotatelogs は、ある時間ごとにアクセスログを切替える機能なのでアクセスログに日付をつけたいときは使えない。
mod_log_rotate も、本番に投入するため RPM にした。SPEC ファイルは、このあたりのをカスタマイズして使った。
VirtualHost を使っている場合は、必ず VirtualHost ごとに CustomLog の設定が必要なので要注意。設定しないと、access_log.[UINX タイムスタンプ] でアクセスログが出力されてしまう。
あとは、古いログを cron かなんかで削除してあげればよい。
もちろん、最良なのはアクセスログなど不要な情報は /dev/null にするのが当然だと思う。とはいってもどうしても必要なログはあるわけなので、そういうときは mod_log_rotate を使うのがいい感じ。
今のところ、大きな問題はないけれど0時ちょうどになると、次のようなログが出力されることだ。
[Mon Feb 02 00:00:00 2009] [error] (13)Permission denied: could not open transfe
r log file /dev/null.1233532800.
これは、mod_log_rotate.c を変更すればなおせそうな感じだけれど。今晩、様子をみてみることにする。
ちなみに、mod_log_rotate が組み込まれているときの設定したときは、次のように設定すればよい。
#
# mod_log_rotate
# http://www.hexten.net/wiki/index.php/Mod-log-rotate
#
<IfModule log_rotate_module>
    RotateLogs On
    RotateLogsLocalTime On
</IfModule>

SSL の自己認証局証明書をさくっと作れるスクリプト

Apache の RPM から抜粋。1年だとよくきれるので、10年にしてみた。

#!/bin/sh

if [ ! -f /etc/httpd/conf/ssl.key/server.key ] ; then
openssl genrsa -rand /proc/apm:/proc/cpuinfo:/proc/dma:/proc/filesystems:/proc/interrupts:
/proc/ioports:/proc/pci:/proc/rtc:/proc/uptime 1024 > /etc/httpd/conf/ssl.key/server.key 2
> /dev/null
fi

FQDN=”s1.example.co.jp”
if [ “x${FQDN}” = “x” ]; then
FQDN=localhost.localdomain
fi

if [ ! -f /etc/httpd/conf/ssl.crt/server.crt ] ; then
cat << EOF | openssl req -new -key /etc/httpd/conf/ssl.key/server.key -x509 -days 3650 -ou
t /etc/httpd/conf/ssl.crt/server.crt 2>/dev/null

SomeState
SomeCity
SomeOrganization
SomeOrganizationalUnit
${FQDN}
root@${FQDN}
EOF
fi

  • 1
  • 2