Apache Tips

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

favicon.ico がエラーログに出て邪魔

httpd.confに以下の記述を追記。でもたぶんこれだとfavicon.icoがあっても無視されるので、
すべてのバーチャルホストで不要な場合にしか使えないと思われ。
Redirect 404 /favicon.ico

<Location /favicon.ico>
  ErrorDocument 404 "No favicon"
</Location>


ログのローテート

VirtualHost

以下をVirtualHostディレクティブとか、ログ出力を定義してるところに追加、編集する。

設定例
CustomLog "| /usr/sbin/rotatelogs -l /home/example.com/logs/access_log.%Y%m%d 86400"
 combined_costom env=!except-request

ここは基本的に固定
CustomLog "| /usr/sbin/rotatelogs

ローカルの時間を基準にローテートするとか、指定しないとGMTを使う予感
-l

ログ出力先パス、後ろの方は日付とか
/home/example.com/logs/access_log.%Y%m%d

ローテートする間隔(86400秒=1日)
86400"

httpd.confにあるcombined_costom(任意の名前)ログ設定を使います、みたいな
combined_costom

但し、httpd.confにあるexcept-request(任意の名前)以外の場合ログ出力、みたいな
env=!except-request

ちなみにパイプでつないでrotatelogsを使ってApacheのログをローテートさせると、
バーチャルホストの数だけプロセスが常駐する模様。
なので、プロセス数も増えlogrotateよりサーバー負荷も高くなってしまうので、
バーチャルホストが多いサーバーだと使わない方がいいようだ

logrotateでログ出力する場合の記述
CustomLog /home/cms/adv/angel.afhd.jp/open/logs/access_log combined_costom env=!except-request

で、ローテートの設定ファイルを以下に置く
/etc/logrotate.d/

内容はこんな感じ
/home/*/logs/*log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

他のオプションは各自調べてもらうとして、重要なのは1行目
この設定だと、/home/example.com/logs/access_log.1のようなログの置き方をする

同じ深さの階層の/home下にサイトを並べる場合、これ1つで全てローテートされるようだ

logrotateを使うメリットとしては、古くなったログを自動削除してくれる。
また、デメリットとしてローテートの際にApacheプロセスのリロードが自動でかかってしまうことらしいが、
逆にメモリをリフレッシュできるから1週間に1回くらいむしろした方がいいんじゃね?という気もする。

rotatelogsは削除の仕組みをユーザーが実装しなければならない。
いまどきバーチャルホストが1つ2つというサーバーも稀だろうし、
何より放っておくとログでサーバーがいっぱいになってしまう危険があるので、
ログを自動で削除してくれるのは大変ありがたいし、自前で削除バッチを作って動かすよりも安全な仕組みだと思われるので
結局あんまりrotatelogsを使うメリットがないような・・・。


httpd.conf

こんなのを追記、後半は携帯用のヘッダを追加したりしてる。ちなみにこれは携帯サイトに特化したログ出力形式。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%U\" \"%q\" \"%{User-Agent}i\" \"%{cookie}i\"
 \"%{Referer}i\" \"%{X-Up-Subno}i\" \"%{x-jphone-uid}i\" \"%{X-DCMGUID}i\" %I %O" combined_costom

SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)|(ico)$" except-request

無駄なログを抑制するためにexcept-requestに、画像とかcssを指定している。

追記 (2012/3/2)
前任者がどこかから持ってきたものをそのままコピーして長らく使用してきたが、
ここに来てなんか、このSetEnvIfの正規表現の指定が間違っているというウワサを耳にした
ttp://d.hatena.ne.jp/paulownia/20100521/1274019436

従来の設定でもほとんどの場合画像等のログは排除されるし、実害は少ないようだが、意図した挙動ではないとのこと

で、これが改良型
SetEnvIfNoCase Request_URI "\.(gif|jpg|png|css|js|ico)$" except-request
ちなみに、従来の設定では「test.PNG」など拡張子が大文字だとログに出ていたので排除しようとしたが、
正規表現中に大文字と小文字の区別をしないオプションを指定することはできず、関数?自体が違うようだ


Apacheの接続拒否

通常ファイアウォールでport80はすべて許可しているので、
特定のIPアドレスからの80ポートへのアクセスを拒否というのは難しい。
hosts.denyファイルもapacheは関係ないとのこと。
で、httpd.confに以下の設定を入れることによって、全サイトで特定IPアドレスを拒否できる。
<Location />
 Order allow,deny
 Allow from all
 Deny from 192.168.1.31
</Location>

.htaccessに記述する場合

order allow,deny
allow from all
deny from 119.63.192.0/21
deny from 204.232.*
ネットワークの指定も、ワイルドカードも使用できる模様

sshでログインさせないユーザー(FTP専用ユーザー)

useradd -d /home/hoge/hoge.co.jp -u 1000 -s /sbin/nologin (ユーザー名)
オプション -s でログインシェルを指定、nologinにするとログインできなくなる

何らかの理由でFTPユーザーとログインユーザーを分ける

useradd hoge.com -u 1000
useradd -M -d /home/hoge.com/public_html -g 1000 -s /sbin/nologin -o -u 1000 hogeftpuser

これで、uidは共通のhoge.comとhogeftpuserの2つのユーザーが作られるが、後者はsshではログインできない
この場合vsftpの設定にはhogeftpuserだけを入れて、/home/hoge.com以下はhoge.comの所属にするが
この直下にシステムファイル等を置いてFTPユーザーには/home/hoge.com/public_html以下しか
公開しないという使い方ができる

オプション -o がユニークでないuidユーザーを作成するオプション
最終更新:2012年04月09日 11:12