Tag Archives: Apache

サイトメンテ時には503

これは目からウロコ。よくやるのが200 OKのまま文面は「ただいまメンテナンスを行っております。しばらくしてから再度ごアクセスください。」って出している。auのEZwebだとApacheエラーは画面表示させてくれないのでユーザビリティ上しかたないとか(得に404に関してはレギュレーションで指定されているし)あるのでつい200 OKのままなんですよね。それだと検索エンジンのクロールでキャッシュされてしまう危険を伴う。403/404出していると次回からクロール来なくなる可能性があるし500は論外。でも下記URLの記事によれば503の場合は検索エンジンも次回のクロールの機会が来るまで待ってくれるみたいなので大丈夫だそうです。

サイトメンテナンス時には、HTTP 503エラーを使う » 海外SEO情報ブログ・メルマガ
http://www.suzukikenichi.com/blog/using-503-error-at-site-maintenance/

元記事ではドキュメントルートからメンテする場合の設定で困っているそうですが、とりあえず動作した設定をここで公開しておきます。

Alias /maintenance/ “/home/www/maintenance/”
ErrorDocument 503 /maintenance/503.html
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/maintenance/503.html$
RewriteRule ^.*$ – [R=503,L]
<Directory “/home/www/maintenance/”>
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>

ドキュメントルート以下にメンテ用ファイルを置きたくなかったのでAliasにしましたが、R=503としたのでRewriteRule の飛び先はこの場合何書いても同じだったので – にしました。あと必ず ErrorDocument 503 を定義しておくことです。

他には外部サーバや内部でバーチャルホストを作ってそこにスクリプトを置き、リバースプロキシで転送という方法も思いつきましたがリソースの無駄遣いなので伏せておきます。(本当の理由は自宅サーバにProxy入れて無かった・・・)

mod_ktaiに画像変換モジュールを追加

最近登場した携帯サイト用Apacheモジュールのmod_ktaiに画像変換モジュールが追加され、端末の仕様に合わせて自動変換を行うようです。確かにGDやImageMagickで毎回変換すると大量アクセス時に重くなるし、だからといってファイルに変換して置くのも移設とか面倒になるし、Keitai Pictureはバージョンアップするごとに検索リスエストがスパム化して返って激重になるし・・・。ということでApacheモジュール大賛成です。負荷試験で効果の比較したのち本格導入検討しようかな。

ゆめみ、Apacheモジュール「mod_ktai」シリーズに画像変換モジュールを追加 – ITmedia +D モバイル
http://plusd.itmedia.co.jp/mobile/articles/0810/30/news130.html

ApacheModuleの作り方

C言語のCGIは速いと思っていましたが実は遅かったんですね。Servletみたいにプログラムがメモリに常駐されていればディスクアクセスが発生するCGIに勝ち目は無いのか・・・でもFastCGI組み込んだらどうなんだろ?

以下の記事はCGIをC言語で作るというより、Apacheモジュールの作り方に重点を置いています。Webシステムのモジュールをバイナリ形式で配布する際にとても参考になりそうです。

ApacheModuleでWebアプリケーションをつくろう:CodeZine
http://codezine.jp/a/article/aid/2502.aspx

携帯向けHTML変換Apacheモジュールmod_chxj

今月に入って活発に更新されているHTML変換モジュールがバージョン0.11.0にアップしていました。PHSを無視していいなら高価でJavaが必要なx-Servletよりも無料で直接Apacheで動作するmod_chxjの方が断然パフォーマンス良さそうですがどうかな?

国内の主要携帯(3キャリア)向けコンテンツ変換ミドルウェアをApache2.x用のモジュールとして作成します。CHTMLや通常のHTMLで作成したコンテンツを出力時にUserAgentを見てそれぞれの端末用に変換します(画像はJPG、GIF、PNGからJPG、GIF、PNG、BMPへ)。QRコード生成機能付。

sourceforge.jp Project Info – mod_chxj
http://sourceforge.jp/projects/modchxj

Apacheの動的モジュール追加

Apacheでwwwサーバを構築していて良くあるのが、最初は最小構成で構築していたものの後からモジュールだけ必要になる場合。全く同じOSの別サーバがあればそこからsoファイルを持ってくるという荒業もありますが、正当な方法で追加モジュールを組み込みたいとググってみました。

apxsでapacheにモジュールを追加する
http://kazmax.zpp.jp/apache/apache3.html

なるほどapxsでコンパイル・インストールすることでモジュールを追加できるようです。PHPのオプションにapxsの項目があるのはそういうことなんですね。

Apache2.2.4で追加した時は以下のように操作しました。

Rewiteのインストール
# cd /usr/local/src/httpd-2.2.4/modules/mappers
# /usr/local/apache/bin/apxs -c mod_rewrite.c
# /usr/local/apache/bin/apxs -i -a -n rewrite mod_rewrite.la

 

Apache,MySQL用top

apachetopとmytopというApache用、MySQL用のtopのようなものを見つけたのでインストールして試してみました。

mytopのインストール

mytop – a top clone for MySQL
http://jeremy.zawodny.com/mysql/mytop/

入手したtarボールを展開
# mv mytop-1.6.tar.gz /usr/local/src/
# cd /usr/local/src/
# tar zxf mytop-1.6.tar.gz
# cd mytop-1.6

Makefileの作成
# perl Makefile.PL
Checking if your kit is complete…
Looks good
Warning: prerequisite Term::ReadKey 2.1 not found.
Writing Makefile for mytop

コンパイル
# make
cp mytop blib/script/mytop
/usr/bin/perl “-MExtUtils::MY” -e “MY->fixin(shift)” blib/script/mytop
Manifying blib/man1/mytop.1

テスト
# make test
PERL_DL_NONLAZY=1 /usr/bin/perl “-Iblib/lib” “-Iblib/arch” test.pl
1..1
ok 1

インストール
# make install
Installing /usr/local/man/man1/mytop.1
Installing /usr/local/bin/mytop
Writing /usr/local/lib/perl5/site_perl/5.8.7/i386-freebsd/auto/mytop/.packlist
Appending installation info to /usr/local/lib/perl5/5.8.7/i386-freebsd/perllocal.pod

試しに実行
# mytop
Can’t locate Term/ReadKey.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.7/i386-freebsd /usr/local/lib/perl5/5.8.7 /usr/local/lib/perl5/site_perl/5.8.7/i386-freebsd /usr/local/lib/perl5/site_perl/5.8.7 /usr/local/lib/perl5/site_perl .) at /usr/local/bin/mytop line 175.

実行にはReadKey.pmが必要ということで失敗したのでReadKeyを追加します。

ReadKeyをCPANから入手して展開

Jonathan Stowe – TermReadKey-2.30 – search.cpan.org
http://search.cpan.org/~jstowe/TermReadKey-2.30/

# mv TermReadKey-2.30.tar.gz /usr/local/src/
# cd /usr/local/src/
# tar zxf TermReadKey-2.30.tar.gz
# cd TermReadKey-2.30

Makefileの作成
# perl Makefile.PL
Checking if your kit is complete…
Looks good
Writing Makefile for Term::ReadKey

コンパイル
# make
cp ReadKey.pm blib/lib/Term/ReadKey.pm
AutoSplitting blib/lib/Term/ReadKey.pm (blib/lib/auto/Term/ReadKey)
/usr/bin/perl -I/usr/local/lib/perl5/5.8.7 genchars.pl

インストール
# make install
Installing /usr/local/lib/perl5/site_perl/5.8.7/i386-freebsd/auto/Term/ReadKey/ReadKey.so
Installing /usr/local/lib/perl5/site_perl/5.8.7/i386-freebsd/auto/Term/ReadKey/ReadKey.bs
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl5/site_perl/5.8.7/i386-freebsd/Term/ReadKey.pm
Installing /usr/local/lib/perl5/site_perl/5.8.7/i386-freebsd/auto/Term/ReadKey/autosplit.ix
Installing /usr/local/man/man3/Term::ReadKey.3
Writing /usr/local/lib/perl5/site_perl/5.8.7/i386-freebsd/auto/Term/ReadKey/.packlist
Appending installation info to /usr/local/lib/perl5/5.8.7/i386-freebsd/perllocal.pod

mytopの再実行
# mytop -uhoge -phogehoge
オプションの内容は-u[ユーザ名] -p[パスワード]です。
これでMySQLの負荷を簡単に確認できるようになりました。

次にapachetopを試します。

apachetopを入手して展開

ApacheTop – Trac
http://www.webta.org/projects/apachetop/

# mv apachetop-0.12.6.tar.gz /usr/local/src/
# cd /usr/local/src/
# tar zxf apachetop-0.12.6.tar.gz
# cd apachetop-0.12.6

設計
# ./configure

コンパイル
# make

インストール
# make install
Making install in man
/bin/sh ../config/mkinstalldirs /usr/local/man/man1
/usr/bin/install -c -m 644 ./apachetop.1 /usr/local/man/man1/apachetop.1
Making install in src
/bin/sh ../config/mkinstalldirs /usr/local/bin
/usr/bin/install -c apachetop /usr/local/bin/apachetop
Making install in config

実行
/usr/local/bin/apachetop -f ログファイル名
apachetopはログファイルのリアルタイム監視を行います。私の環境ではログファイル名を常に変える形のローテーションなので日付変更と同時に中断して新しいログファイル名でコマンドを打ちます。rpm版Apacheのようにデフォルトがシステムでローテーションさせてる場合はどうなるんでしょうね?そこまで気長に放置しませんがw

Apacheクックブックは駄本でした。。。

最近凄い勢いで他人のソースを見てデバッグする機会が多く、多重にrequireしているソースになるともうかなり面倒です。特に動的ページ同士のパラメータのやり取りに関しては仕様書がないとソース解析の範囲が一気に増えて面倒です。

そうなって来るとプログラムにトレースを打ちまくって確認するのですが、他人が管理しているプログラムに改造しまくるのはサーバが余っていてコピー環境作成できないと難しい…。あとファイル数やポイントが多ければそれだけでも大変な作業になる。

GETに関してはApacheログに普通に出せるので楽だが、殆どはPOSTの中が重要だったりします。それでApacheでPOSTの情報を出せないかと探索してもPOSTの長さを出すのが精一杯。さらに検索すると『Apacheクックブック』の目次に『POSTの内容をログに記録する』というのがあるじゃありませんか、早速Googleブック検索で調べたら日本語版なし、まぁApacheの設定だし英語でもドンと来い状態なので英語も検索するとログの章は非公開。

買うしかないのかと即注文して今日届いたのですが、

本書を執筆している時点では、そのようなフィルタは存在しない。

目次では2ページ分だったので少しは期待しましたが1ページ目が7行(3行は回答、残りは言い訳)で2ページ目は言い訳の残りが2行で終了です。

他にも『クライアントのMACアドレスをログに記録する』で、ネットワークの仕様上、常識的に不可能でMACアドレス取得しても直近のルータやロードバランサーのMACアドレスだから負荷分散等に使うのかな?て見たら。

Aapcheでは全くできない

この項目も全部で6行です。他の項目もApacheサイトや一般的なApache本で普通に書いてることと同じだし、こんな個人ブログにだらだらと書いた内容の寄せ集めみたいな本だったので無駄投資。買う人が詐欺被害に会ったみたいでかわいそうだし面倒で転売する気も起きません。。。orz

他のものに例えたらフォローが中途半端な質問掲示板そのものですね。質問だけあって、解決になって無い無駄書きと不可能発言のスレッドみたいです。(ググってもこういうのによく当たりますね:;)

さてApache2でPOST内容の書き出しは一旦置いといて別のサーバ構築しますか(´・ω・)

ApacheのBASIC認証

あまりにも定番過ぎてどこにも書いてなかったw 健忘録としてカキコ。

下記はディレクトリ/usr/local/apache/htdocs/test2に
testuserで認証する場合の記述です。
AuthUserFileはパスワードファイルの設置場所
AuthNameは認証ダイアログに記述するメッセージです。

#httpd.conf内で設定する場合の記述
<directory “=”” usr=”” local=”” apache=”” htdocs=”” test2″=””>
AuthType Basic
AuthName “Please enter username and password”
AuthUserFile /usr/local/apache/conf/.htpasswd
Require user testuser

#対象ディレクトリに.htaccessを作成する場合の記述
AuthType Basic
AuthName “Please enter username and password”
AuthUserFile /usr/local/apache/conf/.htpasswd
Require user testuser

ユーザを指定せずにパスワードファイルに入っているユーザ全てに許可する場合は
Require user testuserの行をRequire valid-userにします。

パスワードファイルの生成方法は
/usr/local/apache/bin/htpasswd -c /usr/local/apache/conf/.htpasswd testuser

というようにします。
-cはcreate(新規作成)なので同じパスワードファイルにユーザを追加する時は
-cオプションを外してください。

.htaccessを使う場合はhttpd.confで利用可能にされているかどうかとディレクトリで設定の上書き可能かのチェックが必要です。

Apache2.2.4でwarning

多分Apache2.2以降だけだと思うが、ソースからインストールして起動する際に、

[warn] (2)No such file or directory: Failed to enable the ‘httpready’ Accept Filter

と出ることがある。
だからと言って動作に問題は出ないのだが気になるので調べたところ、適正に設定を行えばソケットの最適化をやってくれるらしい。

具体的には、通常サーバに対してリクエストを送信するとまずApacheとのソケット通信を開始してデータを送ります。これをOS側でクライアントからのリクエストが完了するのを待って初めてApacheへ接続しApacheのコネクション数の節約を行うようです。

FreeBSDの場合、デフォルトでこのような機能を組み込んだいないため、カーネルにロードしてあげます。

対象モジュール:
/boot/kernel/accf_http.ko

カーネルにロード
# kldload accf_http.ko

起動時に読み込むようにloader.confに追加
# echo ‘accf_http_load=”YES”‘ >> /boot/loader.conf