- 追加された行はこの色です。
- 削除された行はこの色です。
-Apache全般情報。現在の主流は1.3と2.2系
#contents
*基本情報 [#mc9886f1]
**バージョン毎の特徴 [#e6d442f0]
-1.3.x
2010年1月でついに新規リリース停止。2007年あたりからバイナリパッケージではほぼ入手困難になりつつあるのでコンパイルの知識が必要とされる。
-2.0.x
スレッドを使えるようになったが、実際にはこれまでと同じプロセスを増やしていく起動(prefork)がデフォルトになっていることが多い。2.2がリリースされてちょっと中途半端な位置づけに感じる。
-2.2.x
最新バージョンだが、すでにFedoraや比較的安定志向のVineですらバイナリパッケージを用意している。Tomcatと容易に連携できる。
-2.4系
**設定ファイルの場所 [#q3373e35]
たいていのOSにはバイナリパッケージも用意されていてその場合はOS毎に違ってくる。コンパイルの場合は何も指定していなければ/usr/local/apache/conf以下になる。
|RedHat系|/etc/httpd/conf|
|Debian系|/etc/apache/conf|
*内部IP対応 [#x5a8934b]
-private IPを別のログに出したい
SetEnvIf Remote_Addr 192.168.1. no_log
CustomLog /var/log/httpd/access_log common env=!no_log
-private IPならカスタムヘッダー追加
SetEnvIf Remote_Addr 192.168.1. no_log
Header add MyHeader "%D %t mytext" env=no_log
*DOS対策 [#o905c9fa]
+mod_evasive
+mod_dosdetector
+mod_limitipconn
+fail2 ban
**mod_evasive [#gd9023e2]
-yumがあり導入が簡単
-ブラックリストは設定できない。
-レスポンスは403固定
-プロセス単位で見ているので、mod_dosdetectorに比べると精度におとるかも?
yum search mod_evasive --enablerepo=epel
LoadModule evasive20_module modules/mod_evasive20.so
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 30
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 30
# DOSEmailNotify "-s 'DoS Alert' [email protected]"
DOSLogDir "/var/tmp/"
# DOSWhitelist 127.0.0.1
# DOSWhitelist 192.168.1.*
</IfModule>
***パラメータの意味 [#iaf7c522]
上記の例だと同一ページに1秒間5アクセス、もしくは同一サイトに1秒間30アクセスだとブロックリストに入り、30秒間はブロックされる。ブラックリストのIPからのアクセスがあった場合はまた30秒になるので、長い時間を指定する必要はない。
|DOSHashTableSize|内部のメモリ、小さいと記憶できるIPが少なくなる|
|DOSPageCount|一つのページに対する閾値|
|DOSSiteCount|サイト全体に対する閾値|
|DOSPageInterval|一つのページに対するDOSと判定する計測時間|
|DOSSiteInterval|サイト全体に対する計測時間|
|DOSSystemCommand|OSコマンドを実施できる。内部での通知に使いたい場合など|
|DOSWhitelist|DOS検地除外IPなど|
**mod_dosdetector [#fe170d82]
-はてなの人が作成。
-こちらはコンパイル必要である。httpd-devel,gccが必要。
-forkバージョンもあり、ホワイトリスト対応
-Apache2.4系でコンパイルする場合はパッチ必要
***コンパイル [#pb5e3d54]
sudo yum install -y httpd-devel gcc
wget http://downloads.sourceforge.net/project/moddosdetector/moddosdetector/version-0.2/mod_dosdetector-0.2.tar.gz
tar xvzf mod_dosdetector-0.2.tar.gz
cd mod_dosdetector-0.2/
make
make install
***設定 [#jdb142fa]
-make installするとhttpd.confにモジュール有効化の記載がされている。
-直接エラーを返すことはできず、あくまで環境変数をセットするだけ(ログには出る'127.0.0.1' is suspected as DoS attack! (counter: 11))
DoSDetection On
DoSPeriod 10
DoSThreshold 10
DoSHardThreshold 20
DoSBanPeriod 15
DoSTableSize 10
DoSIgnoreContentType image/*
RewriteEngine on
RewriteCond %{ENV:SuspectHardDoS} .+
RewriteRule .* - [R=503,L]
**mod_limitipconn [#bbedb89b]
*コンパイル [#k538e786]
**2.0.x系 [#i526c73c]
./configure --enable-mods-shared=all --enable-shared=yes --enable-ssl --enable-proxy
※SSLを有効にした場合opensslのライブラリが必要
再コンパイル時の注意./configure でやるとLoadModule一切なしのhttpd.confが作成される
そのあと--enable-mods-shared=allしてもhttpd.confはそのままなので注意
いったん消してmake installする
-成功事例
--Vine2.6r4,3.0
--MiracleLinux2.1,3
--RedHatLinux8.0,9,3
--CentOS3.4
**2.2.x系 [#p945c70b]
./configure --prefix=/usr/local/apache22 --enable-mods-shared=all --enable-proxy-ajp --enable-proxy
**[[mod_sslを静的に組み込む:http://www.stackasterisk.jp/tech/systemConstruction/apache09_03.jsp#3]] [#s7535e43]
**PHP [#w6eb0f41]
LoadModuleは自動で入る。残りはhttpd.confに以下の設定をする
# for PHP
AddType application/x-httpd-php .php
***PHP4.x [#g4cd15b8]
コンパイルにbison,flex必要gnuからとってきて、bison,flexの順でconfigureのmake installする。/usr/local/binにパスを通しておくこと!
今回はPostgresを有効にしてコンパイル
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pgsql=/usr/local/pgsql --enable-mbstring
PostgresもMYSQLも入ってれば以下でOK(MiracleLinux3.0 フルインストール)
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pgsql --with-mysql --enable-mbstring
***PHP5.x [#b3734f30]
flex,libxml-devel,libxml2-devel,postgresql-devel必要
./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --enable-mbregex --with-pgsql --with-openssl=/usr/local/ssl/ --without-mysql --with-libxml=/usr/local/lib
*Apacheの動作モード [#k329f1f0]
preforkとworkerとがありApache2.0より追加されたスレッドで動作するのがworkerだが、実態はほとんどpreforkが継続して使われている。以下のコマンドで複数プロセスが見えればpreforkである。
ps -ef | grep apache
*httpd.confの設定 [#i226af0b]
**インストール後のtodo [#td7a690d]
実行ユーザーはwwwにする
groupadd www
useradd -g www -s /sbin/nologin www
+AddDefaultCharSetコメントアウト(2.0.53より削除されている)
+LanguagePriority ja
+User www
+Group www
実行時のバージョンを隠す
ServerSignature Off
-[[NameVirtualHost:http://www.ns-labs.com/linux/tsubo5.html]]
**LocationとDirectoryの使い分け [#u6f7d664]
Locationはファイルシステムの外にあるものを設定するときに使う。DocumentRoot以下に対する設定ならばDirectoryを使う。全体に対する設定にもLocationを使う。
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.0.1
</Location>
**ユーザーディレクトリ使用可能にする [#td7b9ca2]
rootでchmod 751 username
**CGIディレクトリ [#e1e92006]
<Directory /home/httpd/cgi-bin>
Options ExecCGI
</Directory>
CGI実行は
httpdの実行者がapacheユーザーとなるので755にしないと500エラー
#For UserDir CGI
ScriptAliasMatch ^/~([a-zA-Z0-9_-]+)/cgi-bin/(.+) /home/$1/cgi-bin/$2
<Directory /home/*/cgi-bin/>
Options ExecCGI
AddHandler cgi-script .cgi
</Directory>
**ログの設定 [#q6aa89b3]
***ログ設定の基本commonとcombined [#g7843ad0]
|combined|LogFormat "%h %l %u %t ¥"%r¥" %>s %b ¥"%{Referer}i¥" ¥"%{User-Agent}i¥"" combined|
|common|LogFormat "%h %l %u %t ¥"%r¥" %>s %b" common|
+リモートホスト
+認証領域
+認証ユーザー
+時間
+リクエストの最初の行
+ステータス
+送信バイト
+リファラー
+UA
***ワームログの除去と家庭内アクセス(192.168.1.0/24)を別のログに記録する [#x6b3f9ec]
#Log setting
SetEnvIf Remote_Addr 192.168.1. homelog nolog
SetEnvIf Request_URI "default.ida" wormlog nolog
SetEnvIf Request_URI "root.exe" wormlog nolog
SetEnvIf Request_URI "cmd.exe" wormlog nolog
SetEnvIf Request_URI "Admin.dll" wormlog nolog
SetEnvIf Request_Method "(GET)|(POST)|(PUT)|(DELETE)|(HEAD)" !worm
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(swf)$" nolog
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/home_log common env=homelog
CustomLog logs/worm_log common env=wormlog
CustomLog logs/access_log combined env=!nolog
**SSLの設定 [#r55d5b05]
LoadModule ssl_module modules/mod_ssl.so
<IfDefine SSL>
LoadModule ssl_module modules/mod_ssl.so
Listen 443
SSLSessionCache shm:/var/cache/ssl_gcache_data(524288)
<VirtualHost _default_:443>
DocumentRoot /usr/local/apache2/htdocs
SSLEngine on
SSLCertificateFile conf/ssl/server.crt
SSLCertificateKeyFile conf/ssl/server.key
<Files ~ "\.(cgi|shtml)$">
SSLOptions +StdEnvVars
</Files>
<Directory /home/httpd/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
</IfDefine>
**SSIの利用 [#g941a4c6]
<Directory "xxx">
Options Includes or IncludesNoExec
AddHandler server-parsed .shtml
AddType text/html .shtml
</Directory>
上記設定でxxxディレクトリ以下で.shtmlのみ利用可能になる
**リバースプロキシ [#i610af17]
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#Proxy
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /tu/ http://192.168.1.78/
ProxyPassReverse /tu/ http://192.168.1.78/
-SSLに対してリバースプロキシをする場合は下記を追加
SSLProxyEngine On
**WebDAVの設定 [#y3e36cee]
1.3系は日本語問題ありなのでできれば2.0系で運用すべし
+mod_dav.soをインストール
+httpd.confに以下のように追加
**Windowsで2.0とjkで連携 [#p0404a8a]
mod_jk.soはバイナリを入れる。configの設定はlinuxとまったく同じでよい
*ワンテク [#pabebdbe]
|BASIC認証回避|http://id:pass@URL/|
**コマンドラインログ解析 [#rb50316c]
awk -F " " '{print $1}' access_log | uniq
-Fの後がデリミター。ここではスペースを指定している。さらに{print $1}で区切られた一つ目(アクセス元IP)を表示している。
awk -F " " '{print $1}' access_log | sort | uniq -c | sort
-応用編。IP毎にアクセス数を算出する。
*利用しているモジュール解説 [#td8b003f]
**mod_rewrite [#ga8cd507]
URL書き換えできるモジュール。ローカルアドレスをそのまま返すのでリバースプロキシーになりません。サイト移転時などに重宝する。
AllowOverride FollowSymLinks
RewriteEngine On
RewriteRule ^/app/(.*)$ http://転送先/$1
-サーバー環境変数も使える
RewriteRule ^hoge\.html /hogehoge\.html?%{QUERY_STRING} [L,PT]
**mod_header [#xeddebc9]
レスポンスヘッダーに付け加えたりできる。キャッシュコントロールなどをまとめて入れておくと便利。
*パフォーマンスについて [#e92fa4a2]
**KeepAliveについて考察する [#g765cc0c]
時間切れまでつなぎっぱなしという恐るべきリソース消費。詳細は要調査
なおPHPを有効にするとプロセスのサイズが膨れるのでKeepAliveを短く(1秒ほど)して、プロセスが増えないようにしたほうが良い。
*有用リンク [#a0e09bcc]
-[[パフォーマンスチューニング:http://tech.bayashi.net/svr/doc/apache/tune.html]]
#counter