#freeze
**他設定 [#u7f15710]

#contents

----
***Digest認証 [#zfdc96cc]
アカウントファイルの作成。~
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>

***キャッシュ設定 [#i13f0ac1]
更新頻度の低い静的コンテンツはサーバでキャッシュするもよし。

 <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>
***Mod CIDR Lookup [#ic8c4a86]
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>
など、アクセス避けをしてみたり( ´ω`)

***FastCGI(mod_fcgid)でPHP [#l4629d68]
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プロセスを起動する。


***FastCGI(mod_fastcgi)でPHP [#b82fd538]
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>

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS