【Apache】error out of dynamic memory in yy_create_buffer()というエラーが頻発する。

WordPressを2.8.2に更新したあたりから、

out of dynamic memory in yy_create_buffer()

というApacheのエラーが頻発するようになった。
このエラーなんだろうといろいろ調べたけど。。。
情報がほとんどない。。。

WordPressのサポートフォーラム
Googleグループの「out of dynamic memory in yy_create_buffer」検索結果

エラーが出たという情報はあるけど、対処法がほとんど見あたらない。。。

どうやら色々と調べた結果、WordPressの
2.7
2.8.2
で出るみたい。

どうもメモリ不足のエラー。
MySQLのキャッシュの問題かな??
と思い、MySQLの設定をいろいろといじるが、変化なく。。。

プラグインとの相性が悪いのか??と思い。いろいろと試すが変化なく。。。

メモリの問題だから。。。とメモリを増設するも意味がなく。。。

途方にくれていた。

この際、Apacheモジュールの整理もしようと急に思い立ち、整理を行ってみた。
すると、使わないモジュールをコメントアウトするだけで、メモリ使用量がだいぶ減った。
その結果、表記のエラーは全く出なくなった。

恐らくだけど。。。アクセス数が増え、プロセスが増加し、Apacheモジュールが使用してたメモリが最大を超えてたのでは。。。という結論。
プロキシつかってるし、WordPressのプラグインたちが吐き出す、.htaccessも冗長になってきてるし。。。
サーバーへの負荷が大きくなってたんだろうね。。。

表記のエラーが出て困ってる方。
とりあえずの対処法として、サーバーの設定(Apacheの設定)と.htaccessの見直しをおすすめします。

【Apache】HTTPヘッダの確認方法とセキュリティ対策(レスポンスヘッダの変更方法)

通常HTTPヘッダを確認する時は、telnetを使ったりするが、コマンドって何かとめんどくさかったりする。
ブラウザがFirefoxだったら、LiveHTTPHeadersというアドオンを使うと簡単に、リクエストヘッダとか、レスポンスヘッダ等のHTTPヘッダ情報を確認できる。

実際に確認すると。。。
下のようにApacheのバージョン、phpのバージョンまで出力されている。
これはセキュリティ的によくない。

Server: Apache/2.2.6 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5

Apacheのバージョン情報を隠すために、httpd.confのServerTokensとServerSignatureの設定を変更すればよい。
設定がない場合は以下の2行を記述。
ServerSignatureは、エラーメッセージ出力時にフッタを表示するかしないか。
ServerTokensはApacheのバージョンをどこまで細かく出力するか。
※例えばApache2までとかApache/2.2までとか指定できる。ここではApacheって製品名だけを表示する設定。
完全に非表示にする設定もあっていいと思うんだけど。。。

ServerSignature Off
ServerTokens ProductOnly

そして、ApacheをRestartさせて、HTTPヘッダを確認すると、

Server: Apache
X-Powered-By: PHP/5.2.5

ServerのApacheのバージョン情報とphpの情報がなくなった。

でも、X-Powered-Byをみると、まだPHPのバージョン情報が残ってるので、httpd.confのmod_headersを有効にして(下の記述の#コメントを除去)、ヘッダ情報の書換を可能にする。

#LoadModule headers_module modules/mod_headers.so

そして、次の一行を追記。

Header unset X-Powered-By

これで、X-Powered-Byが非表示になる。

Apacheのバージョンとphpのバージョンを伏せるのってサーバー管理の基本だと思うけど。。。
実行してないサーバーもまだまだ多いね。。。

【Apache】mod_rewriteでサブドメイン化

今じゃSEO的効果が減ったとしても
http://○○○.com/?pid=△△△
みたいなURLを、すっきりと
http://△△△.○○○.com/
みたいなサブドメイン化して、URLをすっきりとしたい時がある。

その時はApacheのhttpd.confに以下を記述

ServerName ○○○.com 
ServerAlias *.○○○.com 
DocumentRoot D:/htdocs/ 
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^(.+)\.○○○.com$ 
RewriteRule ^/$ /top.php?pid=%1 [QSA,L]

6行目の [QSA]は
http://△△△.○○○.com/?●●=××

http://○○○.com/?pid=△△△&●●=××
と変換してくれる。

.htaccessに記述しがちだけど、.htaccess はサーバへの負荷がかかるため推奨されてないみたい。

これで冗長なURLもすっきりとする。
でも、余計なアクセスも増えるので、考えないと。

【Apache】ログファイルを月別ファイルに保存する

これもよく忘れがちなのでメモ。
Apacheのログはどんどん肥大化していく。
これを月別のLog Fileに保存する方法

元々の設定

CustomLog logs/access.log combined env=!VLOG

月別ファイルに分けたときの設定

CustomLog "| bin/rotatelogs.exe logs/access%Y%m.log 86400" combined env=!VLOG