アカウントファイルの作成。
htdigestコマンドを使用する。
cd /usr/local/apache2 bin/htdigest -c conf/.htdigestpw realm hoge Adding password for hoge in realm realm. New password: Re-type new password: -c : createオプション。ファイルが既に存在すると、そのファイルを消去してから作成するので注意。 realm : レルム。AuthNameディレクティブで指定する文字列になる。 hoge : 追加するユーザー名
ディレクティブの記述。
<Directory "/hoge/huga"> AuthType Digest AuthName "realm" AuthDigestAlgorithm MD5 AuthDigestProvider file ここではバックエンドにローカルファイルを使用する。 MySQLなどのDBやLDAPを使用する場合はまた異なる。 AuthUserFile /usr/local/apache2/conf/.htdigestpw .ht*はアクセス不可にしているか確認。 それ以前に外部からアクセス出来る場所に置かない。 Require valid-user 特定ユーザに絞ることも可能。 BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On 一部ブラウザのbug回避の為のおまじない </Directory>
更新頻度の低い静的コンテンツはサーバでキャッシュするもよし。
<IfModule cache_module> CacheEnable disk / CacheEnable mem /images CacheDisable /acvive_contents CacheMaxExpire 1800 CacheDefaultExpire 1800 CacheIgnoreNoLastMod Off CacheIgnoreCacheControl Off CacheStoreNoStore Off CacheIgnoreHeaders Set-Cookie CacheLastModifiedFactor 0.1 <IfModule disk_cache_module> CacheRoot /usr/local/var/apache2/cache CacheDirLength 2 CacheDirLevels 3 CacheMaxFileSize 102400 CacheMinFileSize 1 </IfModule> <IfModule mem_cache_module> MCacheSize 100 MCacheMaxObjectCount 1009 #MCacheMinObjectSize 0 デフォルトは0だが、0を設定すると怒られる不思議 MCacheMaxObjectSize 10000 MCacheRemovalAlgorithm LRU MCacheMaxStreamingBuffer 10000 </IfModule> </IfModule>
REMOTE_ADDRがCIDR形式で用意したアドレスに一致すると
X_CLIENT_TYPEという環境変数に値をセットしてくれる大変便利なモジュール。
httpd.conf LoadModule cidr_lookup_module modules/mod_cidr_lookup.so CIDRFile "/usr/local/apache2/conf/hoge"
/usr/local/apache2/conf/hoge xxx.xxx.xxx.xxx/xx yyy.yyy.yyy.yyy/yy このファイルネーム部分(hoge)が環境変数にセットされる文字になる
と準備する。
REMOTE_ADDRがxxx.xxx.xxx.xxx/xx内のIPアドレスだったら
X_CLIENT_TYPEに"hoge"がセットされる。
例えばMicrosoftのCrawlerと思われるアクセスだが
UAにmsnbotと書かれていなかったり
crawlなんちゃらというようにホスト名が解決できず
IPアドレスのみだったりと
一見普通のアクセスに見えるものがある。質の悪い(`・ω・´)
こういうモノをCIDRで指定してまとめて蹴飛ばすことも出来る。
例えば
CIDRのファイル"/usr/local/apache2/conf/MS_Crawl"に 65.52.0.0/14 70.37.0.0/17 70.37.128.0/18 207.46.0.0/16 とリストアップしておくと、一致IPアドレスのアクセスの X_CLIENT_TYPEに"MS_Crawl"とセットされる。
コレを利用して
SetEnvIf X_CLIENT_TYPE MS_Crawl search <Directory "/hoge/huga"> Order Deny,Allow Deny from env=search </Directory>
など、アクセス避けをしてみたり( ´ω`)
Apache製の方。
環境変数を盛り込んだPHPのラッパを作成。 #!/bin/sh PHP_FCGI_MAX_REQUESTS=10000 export PHP_FCGI_MAX_REQUESTS exec /usr/local/bin/php /usr/local/bin/php-wrapper として保存。実行権つける。
公式の意訳。PHPの環境変数について。
PHPの考慮事項
PHPのFastCGIプロセスは規定値で500のリクエストを処理した後に終了します。
既にPHPアプリケーションと接続しているときに終了するとエラーをログに出力し
クライアントには500ステータスを返します。
このPHPの動作は、PHP_FCGI_MAX_REQUESTSを0に設定することで無効にできますが
PHPアプリケーションがメモリリークを起こしている場合など問題が起こる事があります。
PHP_FCGI_MAX_REQUESTSは、この問題(500エラー)の頻度を減らすために
規定値よりもはるかに高い値に設定することができます。
またFcgidMaxRequestsPerProcessディレクティブをPHP_FCGI_MAX_REQUESTS以下に設定することで問題を解決出来ます。
タイミングが悪いと500エラーが出るけど、メモリリークとか考えるとそれなりのリクエスト数で終了させる方がよいというお話の様子。
PHP_FCGI_CHILDRENは子プロセス管理のための変数ですが
mod_fcgidではmod_fcgidが要求して生成するプロセスのみにすべきです。
PHPが作る他の子プロセスは効果的に使用されません。
(子プロセスが正しく終了しない事もあります。※PHPのバグっぽい。修正済み)
規定値でPHP_FCGI_CHILDRENは0で、PHPの子プロセスの管理が無効になっています。
子プロセス管理を行わないとFastCGIプロセス間でAPCなどのコードキャッシュを共有出来ません。
従ってキャッシュの有効性がmod_fcgidでは制限されています。
APCなどはPHP自身がフォークした子プロセスに対し有効だが
mod_fcgidが生成したプロセス間では共有出来ないので、APCなどは使えませんよというお話の様子。
PHPのマニュアルにはlighttpdでの説明があるが、そちらではPHP_FCGI_CHILDRENを設定しましょうとのこと。
http://php.net/manual/ja/install.unix.lighttpd-14.php
ディレクティブ。PHP以外も勿論使えるが、ここではPHPだけ設定。
FcgidIdleScanInterval 60 #60秒おきにプロセス状態を確認する FcgidIdleTimeout 60 #60秒でタイムアウト FcgidProcessLifeTime 600 #600秒経ったアイドルプロセスは終了 FcgidMinProcessesPerClass 0 #Classの意味がよくわからないが、残したい常駐スクリプト数の様子 FcgidMaxProcessesPerClass 1 #同上。最大でもこの数までしか常駐させないっぽい #上2つの組み合わせだと「稼働中は常駐してすぐ返事するが、暇になったらプロセス終了してメモリ解放」的な FcgidMaxRequestsPerProcess 4000 #4000リクエスト処理したらプロセス終了 FcgidWrapper /usr/local/bin/php-wrapper .php #ラッパの指定 AddHandler fcgid-script .php #mod_fcgidで持っているハンドラ これで mod_fcgid がラッパを介してPHPプロセスを起動する。
ORACLEの以下のエントリを基に。
https://blogs.oracle.com/opal/entry/php_fpm_fastcgi_process_manager
■プロセス管理をmod_fastcgiで行う FastCGIServer /usr/local/bin/php ScriptAlias /php-fcgi /usr/local/bin/php #Actionで使うための準備 AddHandler fastcgi-php .php #ここでは.php に対し fastcgi-phpというハンドラを設定 Action fastcgi-php /php-fcgi #fastcgi-phpハンドラは /php-fcgiを起動 最近のPHPはCGIモードの区別がないが、php-cgiなどのバイナリがあるならばそちらを指定しておくとよい。
■PHP-FPMを使う Apache2.2系でPHP-FPMを利用するとなると、コレしか方法がないのではなかろうか? PHP-FPMはソケット /var/run/php-fpm/www.sock で待ち受けるとする。 ScriptAlias /php-fcgi /php-fcgi #第二引数は実際に存在しなくてよい AddHandler fastcgi-php .php virtual #第三引数に virtual を指定 Action fastcgi-php /php-fcgi #/php-fcgiを起動 FastCGIExternalServer /php-fcgi -socket /var/run/php-fpm/www.sock <他オプション> #/php-fcgiへのリクエストをソケットに投げる FastCgiWrapper Off #デフォルトはOff 例えばphp-fpmのステータスを表示するには <Location /fpm-status> #PHP-FPMのpm.status_pathで指定した場所 SetHandler fastcgi-php #上で定義したハンドラを指定 Order Allow,Deny Allow from env=local </Location>