他設定


Digest認証

アカウントファイルの作成。
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>

Mod CIDR Lookup

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

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

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
Last-modified: 2014-08-27 (水) 20:48:55