page_adsence

ラベル Apache の投稿を表示しています。 すべての投稿を表示
ラベル Apache の投稿を表示しています。 すべての投稿を表示

2014年2月4日火曜日

Apacheの条件付きログ

Apacheの条件付きのログを残す方法。

例えば、ドメインは一緒だけど、一階層目のディレクトリでサイトが異なる場合。

http://hogehoge.co.jp/a/
http://hogehoge.co.jp/b/

こういった場合に普通にバーチャルホスト切ると、
ログファイルが一緒になってしまい、混乱を招くので条件によってログファイルの出力先ファイルを変更するようにしました。

最終的なバーチャルホストはこんな感じ
<VirtualHost *:80>
    ServerAdmin admin@hogehoge.jp
    DocumentRoot /path/to/dir/web
    ServerName hogehoge.jp
    ErrorLog /path/to/dir/logs/error_log

    SetEnvIf Request_URI "^\/site_a.*$" a_log
    ErrorLog /path/to/dir/logs/error_log env=a_log
    CustomLog /path/to/dir/logs/access_log common env=a_log

    SetEnvIf Request_URI "^\/site_b.*$" b_log
    #ErrorLog /path/to/dir2/logs/error_log env=b_log
    CustomLog /path/to/dir2/logs/access_log common env=b_log
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !^/site_a
        RewriteCond /path/to/dir/web/%{REQUEST_FILENAME} -d
        RewriteCond /path/to/dir/web/%{REQUEST_FILENAME} -s [OR]
        RewriteCond /path/to/dir/web/%{REQUEST_FILENAME} -l
        RewriteRule ^(.*)$ /site_a$1 [PT]
        Alias /site_a /path/to/dir/web/

        RewriteCond %{REQUEST_FILENAME} !^/site_b
        RewriteCond /path/to/dir2/web/%{REQUEST_FILENAME} -d
        RewriteCond /path/to/dir2/web/%{REQUEST_FILENAME} -s [OR]
        RewriteCond /path/to/dir2/web/%{REQUEST_FILENAME} -l
        RewriteRule ^(.*)$ /site_b$1 [PT]
        Alias /site_b /path/to/dir2/web/
    </IfModule>
</VirtualHost>

2010年7月13日火曜日

mod_rewriteが効かない

symfonyでrouting.ymlに記述しているにも関わらず、全然効いてない。
キャッシュかなと思ったけど、symfony ccしてみたけど直らない。
で、mod_rewriteがちゃんと効いてるかどうか確認してみたら、これが効いてなかった・・・。
AllowOverrideはちゃんと書いたのになんでだろうと思って、
httpd.confをよく見てみたら

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

になってた・・・。
Directoryは記述された階層で書いた設定が、それ以下のディレクトリ全体に反映される。
つまり今回の場合は全てのディレクトリでAllowOverrideは使えないよって状態になっていた。
前からこんなの書いてあったっけと思いつつもこのDirectoryの部分をコメントアウト。
apache再起動。

Internal Server Error

あれっと思ってエラーログを確認すると、

[Wed Jun 16 18:19:22 2010] [alert] [client 192.168.XXX.XXX] /path/to/directory/web/.htaccess: Option FollowSymLinks not allowed here

FollowSymLinksは有効になってないからだめってことみたい。
ちなみにFollowSymLinksとはシンボリックリンクが有る場合はそのリンク先の参照を許可するって設定。

$ vi web/.htaccess
Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>
RewriteEngine On

# uncomment the following line, if you are having trouble
# getting no_script_name to work
#RewriteBase /

# we skip all files with .something
#RewriteCond %{REQUEST_URI} \..+$
#RewriteCond %{REQUEST_URI} !\.html$
#RewriteRule .* - [L]

# we check if the .html version is here (caching)
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f

# no, so we redirect to our front web controller
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

確かにsymfonyの初期状態で生成される.htaccessにはFollowSymLinksの指定が追加されている。
じゃあこれを消せば問題解決のはず。
$ vi web/.htaccess
Options +ExecCGI
以下略


で、アクセスしてみたら問題なかった。

2010年7月12日月曜日

Apacheを再起動しようと思ったらエラーになった。

設定ファイルをリロードしようと思って、

# /etc/rc.d/init.d/httpd reload

としたけど、どうせだから再起動するかと思ってapacheの再起動をかけてみたら下記のようなエラーがでた。

# /etc/rc.d/init.d/httpd restart
httpd を起動中: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[失敗]

再起動に失敗・・・。
何が原因なんだと思ってググってみた。
どうやら原因は何かしらのプロセスが80番ポート使ってるから、再起動できませんってことみたいです。
なんか他に使うようなことしてたっけかなーと思って確認してみた。
80番と443番ポートをオープンしているプロセスを表示

# lsof -i:80,443
httpd 9326 root 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9326 root 6u IPv6 63291 TCP *:https (LISTEN)
httpd 9328 apache 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9328 apache 6u IPv6 63291 TCP *:https (LISTEN)
httpd 9329 apache 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9329 apache 6u IPv6 63291 TCP *:https (LISTEN)
httpd 9330 apache 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9330 apache 6u IPv6 63291 TCP *:https (LISTEN)
httpd 9331 apache 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9331 apache 6u IPv6 63291 TCP *:https (LISTEN)
httpd 9332 apache 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9332 apache 6u IPv6 63291 TCP *:https (LISTEN)
httpd 9333 apache 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9333 apache 6u IPv6 63291 TCP *:https (LISTEN)
httpd 9334 apache 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9334 apache 6u IPv6 63291 TCP *:https (LISTEN)
httpd 9335 apache 4u IPv6 63286 TCP *:http (LISTEN)
httpd 9335 apache 6u IPv6 63291 TCP *:https (LISTEN)

なんかいっぱいでてきた。
でもこれ全部apacheのプロセスじゃん・・・。
restartする時にちゃんとプロセスが終了しなかったのが原因っぽい。
なぜちゃんとプロセスが終了しなかったのかは今のとこ不明。

対応としてはapacheのプロセスをいったん全部killしてあげる。
killコマンドとはプロセスに対してシグナルを送るコマンド。
このシグナルの中にプロセスを終了させる意味のあるシグナルが含まれている。

# kill 9326

で、プロセスが全部終了しているか確認。

# lsof -i:80,443

何も出なければOK。
apache再起動する。

# /etc/rc.d/init.d/httpd restart

これで問題は解決。
よかったよかった。

2010年6月5日土曜日

apacheでVirtualHost作ったら403 Forbidden

ApacheでVirtualHostを作ってサイトを作ろうと思ったらVirtualHostの設定を書いたらForbiddenになるという現象にあった。

httpd.confはVirtualHostの記述以外はほぼ初期状態で変更した部分は以下の通り。
・DocumentRootは/var/www/html
・ServerNameはコメントアウトしたまま
・Directory関連の記述もそのまま
・IPでアクセスする時に/var/www/htmlが参照される状態

#NameVirtualHost *:80 → NameVirtualHost *:80

以下を追記

<VirtualHost *:80>
ServerAdmin admin@mailaddress.co.jp
DocumentRoot /home/linux_user/sites/sitename/web
ServerName dummy.servername.co.jp
ErrorLog /home/linux_user/sites/sitename/log/error_log
CustomLog /home/linux_user/sites/sitename/log/access_log common
</VirtualHost>
<Directory /path/to/document_root>
AllowOverride All
Order allow,deny
Allow from all
</Directory>


で、再読み込み

# /etc/rc.d/init.d/httpd reload

するとdummy.servername.co.jpにアクセスしてもIPでアクセスしてもForbiddenがでるようになってしまった。
VirtualHostの設定を削除し、IPでアクセスするとまた見れるようになる。
いろいろ調べてみたがSELinuxも切ってあるし、ファイルのパーミッションも問題なさげ。
apacheのOrderの記述も問題ない。
とりあえず原因の切り分けのために、httpd.confのDocumentRootを書き換えてみた。
するとForbidden・・・。
ということはファイルのパーミッションかということで確認してみると、
VirtualHost設定内に書かれているlinux_userのとこ(今回の場合は自分のホームディレクトリ)のパーミッションが700になっていた。
ここを755に修正して再度確認すると問題なかった。
その後にもう一度VirtualHostの設定をすると、問題なく表示された。

2010年6月4日金曜日

Apacheの初期設定

エラーページ等でOS名を表示しないようにする

ServerTokens OS → ServerTokens Prod

エラーページ等に表示される管理者メールアドレスを指定

ServerAdmin root@localhost → ServerAdmin webmaster@centossrv.com

サーバー名を指定(VirtualHostをメインとして使う場合はコメントアウトしたままでOK)

#ServerName www.example.com:80 → ServerName centossrv.com:80

ディレクトリ内のファイルを表示しないようにする

Options Indexes FollowSymLinks → Options FollowSymLinks

エラーページ等でApacheのバージョンを表示しないようにする

ServerSignature On → ServerSignature Off

文字化けしないようにApacheでContents-typeのcharsetの指定をしないようにコメントアウトする

AddDefaultCharset ISO-8859-1 → #AddDefaultCharset ISO-8859-1

Test Pageを表示しないようにコメントアウト

vi /etc/httpd/conf.d/welcome.conf

#<LocationMatch "^/+$">
#    Options -Indexes
#    ErrorDocument 403 /error/noindex.html
#</LocationMatch>

VirtualHostのみを使用する場合は以下のようにする
DocumentRootをコメントアウト
DocumentRoot /var/www/html → #DocumentRoot /var/www/html

IPアドレスでアクセスされないようにする
<VirtualHost *:80>
ServerName any
DocumentRoot /tmp
</VirtualHost>
<Directory /tmp>
order deny,allow
deny from all
</Directory>