teematsu @ ウィキ
Apache
最終更新:
teematsu
バーチャルホスト追加
/etc/apache2/site-available/fooを追加
a2ensite foo
モジュールの有効化
a2enmod module_name
組み込まれているモジュール一覧
sudo apache2ctl -M
ログファイルの所有者、パーミッション
Apache自体が作成するログファイルは、root/root, 644 になっているっぽい。 logrotate時に新規作成されるファイルは、/etc/logrotate.d/apache2で指定する。
デフォルトでは次のとおり。
create 640 root www-data
SetHandler/AddHandler
-
SetHandler ディレクティブ
マッチするファイルがハンドラで処理されるようにする
拡張子によらず、すべてそのハンドラで処理
-
AddHandler ディレクティブ
ファイル名の拡張子を指定されたハンドラにマップする
マップの追加
.htaccess
.htaccessはサブディレクトリにも適用される。 → http://httpd.apache.org/docs/2.2/ja/howto/htaccess.html
ファイル名を指定してアクセスを禁止
指定したファイル名と、アクセス対象ファイルのbasenameがマッチすると適用される。basenameなので パス名は比較対象に入らない。
ファイル名パターン
<Files *.bak> Order allow,deny Deny from all </Files>
.htaccessはサブディレクトリにも適用されるので、foo.bakもbar/baz.bakにもこの設定が適用される。
正規表現
<Files ~ "^\.ht"> Order allow,deny Deny from all </Files>
マシンメモリが枯渇する現象
-
Apacheの子サーバープロセスが何度もリクエストを処理する過程で、使用メモリが少しずつ増えていく
-
初期
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 21428 www-data 20 0 255m 49m 4324 R 76.7 4.9 0:26.54 apache2
-
問題発生時
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2948 www-data 20 0 429m 110m 40 D 4.0 11.0 3:07.57 apache2
-
初期
-
利用可能メモリだだんだん減っていく。物理メモリが減り、スワップも減り、buffersで使っているメモリも減ったところで、突然処理が進まなくなる。
Mem: 1029424k total, 1020476k used, 8948k free, 116k buffers Swap: 915664k total, 915664k used, 0k free, 15144k cached
- 定期的にcronで処理を動かすことで、phpやpostgresのプロセスが作成されるが、これらは動作できないまま溜まる
top - 15:25:54 up 39 min, 3 users, load average: 7.35, 4.31, 2.52 Tasks: 94 total, 1 running, 93 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3%us, 43.8%sy, 0.0%ni, 0.0%id, 55.8%wa, 0.1%hi, 0.1%si, 0.0%st Mem: 1029424k total, 1020476k used, 8948k free, 116k buffers Swap: 915664k total, 915664k used, 0k free, 15144k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 22617 tmatsu 20 0 165m 17m 40 D 5.1 1.7 0:02.00 php 2948 www-data 20 0 429m 110m 40 D 4.0 11.0 3:07.57 apache2 22632 postgres 20 0 99516 304 96 D 4.0 0.0 0:00.70 postgres 22616 www-data 20 0 161m 13m 44 D 3.7 1.4 0:01.58 php 22630 postgres 20 0 98.1m 1272 104 D 3.7 0.1 0:01.16 postgres 2627 ntp 20 0 22384 144 16 D 3.5 0.0 0:02.58 ntpd 22627 postgres 20 0 98.1m 1352 136 D 3.4 0.1 0:01.28 postgres 2707 root 20 0 215m 400 12 S 3.2 0.0 0:02.38 apache2 221 root 15 -5 0 0 0 D 3.1 0.0 0:05.52 kswapd0 22618 tmatsu 20 0 164m 16m 44 D 3.1 1.6 0:01.08 php 2611 root 20 0 116m 7768 72 S 2.9 0.8 0:07.60 ruby 2756 tmatsu 20 0 80092 320 36 D 2.6 0.0 0:00.40 smbd 2869 tmatsu 20 0 18828 400 192 R 2.3 0.0 0:04.52 top 2464 postgres 20 0 99768 508 108 D 2.0 0.0 0:02.78 postgres 22629 postgres 20 0 98.0m 1072 64 S 1.5 0.1 0:00.82 postgres 2559 root 20 0 55536 272 116 D 1.1 0.0 0:02.30 nmbd 22623 postgres 20 0 98.5m 1496 96 D 1.1 0.1 0:00.54 postgres 2465 postgres 20 0 70060 360 40 S 0.9 0.0 0:03.48 postgres 2836 tmatsu 20 0 65932 108 4 S 0.9 0.0 0:00.96 sshd 1035 root 15 -5 0 0 0 S 0.6 0.0 0:00.64 kjournald 22612 root 20 0 29324 220 32 S 0.6 0.0 0:00.08 cron 2847 tmatsu 20 0 66064 124 4 S 0.5 0.0 0:01.44 sshd 1920 root 20 0 50552 252 80 D 0.3 0.0 0:01.52 vmware-guestd 1 root 20 0 10316 32 12 S 0.2 0.0 0:01.96 init 2870 tmatsu 20 0 25632 36 8 S 0.2 0.0 0:00.30 screen 2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0 4 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
- kernel がプロセスをkillするが、killの対象が多くの場合postgresやphpであり、メモリを消費しているapacheがkill対象になることがほとんどない。
Jul 20 14:00:20 ------------- kernel: [760857.389578] Out of memory: kill process 17421 (p ostgres) score 85809 or a child Jul 20 14:00:20 ------------- kernel: [760857.389755] Killed process 31582 (postgres)
- 溜まったプロセスの実行は進まない。
対策として、次の処置を実施する。
-
MaxRequestsPerChild を設定する。
子サーバープロセスがリクエストを処理する上限の回数。デフォルトでは、0(制限なし)。0以外を指定すれば、その回数リクエストを処理した後にプロセスが破棄されるため、メモリ使用量が段々増大する場合でもメモリを食い尽くすことを防げる。 -
MaxKeepAliveRequests を小さ目の値にする。
KeepAlive On にしている場合は、MaxRequestsPerChild はリクエスト数上限としてでなく、コネクション数上限として機能する。つまり、クライアントがコネクションを貼りっぱなしでリクエストを多数送信してくる場合、MaxRequestsPerChild が1でもそれらリクエストすべて完了するまで子サーバープロセスは生き続ける。コネクション貼りっぱなしのクライアントが子サーバープロセスを延命させてメモリを圧迫する場合には、MaxKeepAliveRequests(コネクションあたりのリクエスト数の上限) を小さ目に設定して、延命を防ぐ必要がある。
mod_rewrite
- RewriteCond の行を並べて書いた場合はANDになる。ORにするには、RewriteCond の行の最後に[OR]をつける。mod_rewrite
-
RewriteCondの適用対象のRewriteRuleは、RewriteCondの直後の1行のみのようだ。RewriteRuleを2行以上ならべて、それら全体にRewriteRuleを適用することはできない?
- ただ、RewriteRuleに[C](Chain)フラグがある場合は後続のRewriteRuleと一体処理されるようだが (リライトルールのサンプル集のRewriteCondの説明)、[C]の使い方がよく理解できないRewriteRule Flags
-
「正規表現にマッチした場合は書き換えない」場合は、置き換え後の文字列に - を指定。
RewriteRule ^api/.*$ - [L]
証明書関係
CSR: 証明書発行時に登録する、自身の情報
内容確認方法
openssl req -text -in foobar.csr