-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 RequestHeader 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' hoge@example.com" 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] レスポンスヘッダーに付け加えたりできる。キャッシュコントロールなどをまとめて入れておくと便利。 レスポンスヘッダーに付け加えたりできる。キャッシュコントロールなどをまとめて入れておくと便利。カスタマイズした内容を確認するにはPHPなどの動的スクリプトで!HttpHederを見てもわからんぞ。 SetEnvIf Remote_Addr xx.xx.xx.xx internal RequestHeader add X-INTERNAL-LAN "true" env=internal RequestHeader add X-ENV "staging" *パフォーマンスについて [#e92fa4a2] **KeepAliveについて考察する [#g765cc0c] 時間切れまでつなぎっぱなしという恐るべきリソース消費。詳細は要調査 なおPHPを有効にするとプロセスのサイズが膨れるのでKeepAliveを短く(1秒ほど)して、プロセスが増えないようにしたほうが良い。 *有用リンク [#a0e09bcc] -[[パフォーマンスチューニング:http://tech.bayashi.net/svr/doc/apache/tune.html]] #counter