Linux Tips


Lighttpd/コンフィグ

パッケージとしてインストールした場合、通常 /etc/lighttpd/lighttpd.conf が設定ファイルとなる。ただし、初めにインストールされるものは、Apacheのものと比べると説明がないので、サンプルとしてはちょっと分かりにくかった。

なお、Apache の .htaccess の様なしくみはないので、ディレクトリ毎の設定が必要ならば、全て設定ファイルへ書き込む必要がある。

基本設定

_ port

特に設定しない場合、port 80で起動。

server.port = 80

_ アクセス制限

これを設定すると、そのアドレスからしかアクセスできないようになる(と思う)。

server.bind = "localhost"

その他のアクセス制限は、後述の url.access-denyアクセス元での条件設定 などにて。

_ 起動ユーザ、グループ

lighttpdをどのユーザで実行するかの設定。rootでの実行は、危険なので避けた方が無難だろう。

server.username  = "www-data"
server.groupname = "www-data"

_ アクセスログ

apacheと同様、virtual host毎などに設定することが出来る。

accesslog.filename = "/var/log/lighttpd/access.log"

また、フォーマットの書式は、apacheのものと同様。

accesslog.format   = "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

_ エラーログ

アクセスログと違い、エラーログは1つしか設定できないようで、複数設定すると、最後に読み込まれたものが適用される。

server.errorlog = "/var/log/lighttpd/error.log"

各種設定

_ シンボリックリンク

apacheでの、"Options FollowSymLinks"にあたる設定。

server.follow-symlink = "enable"

_ Directory Index

apacheでの、"DirectoryIndex"の設定。ファイル名が省略されたときに表示するファイルの優先順位。同様なものに、"server.indexfiles"というのがあるようなのだが、両方設定したところうまく動かなかった。 "index-file.names" の方を使うべきらしい。

index-file.names = (
    "index.html",
    "index.fcgi",
    "index.cgi",
    "index.rb",
    "index.shtml"
)

_ Directory Listing

URLにディレクトリを指定し、なおかつ "index-file.names" で指定したファイルがない場合に、ファイル一覧を表示するかどうかの設定。apache での、 "Options Indexes" にあたる。

server.dir-listing = "disable"

_ アクセス拒否

例えば、拡張子で拒否する場合はこんな感じ。

url.access-deny = ( "~", ".old", ".inc", ".rhtml"  )

全て拒否の場合は次の通り。

url.access-deny = ( "" )

_ module

使用するmoduleの設定。

server.modules = (
       "mod_access",
#       "mod_alias",
       "mod_accesslog",
       "mod_auth",
       "mod_rewrite",
       "mod_redirect",
       "mod_status",
       "mod_setenv",
       "mod_fastcgi",
       "mod_cgi",
	"mod_rrdtool",
#       "mod_simple_vhost",
)

当然、使用しないものはコメントアウトした方が、使用メモリを減らせる。また、必要に応じ、追加することもあると思うが、使用できる module は、 /usr/lib/lighttpd/ を見れば分かる。ちなみに、1.4.x では以下の3つの module は、ここに書かなくてもあらかじめ有効になる。

  • mod_indexfiles
  • mod_dirlisting
  • mod_staticfile

ディレクトリ、アクセス元での条件設定

上で紹介した、各種設定などは、バーチャル ホスト、ディレクトリ、アクセス元などの条件を加えて設定することが出来る。また、 それらを別ファイルにして、includeする形にすると、見やすくなるだろう。その場合、普通はバーチャルホスト毎にファイルを分けると思うが。詳しくはドキュメント を参照。

_ アクセス元での条件設定

$HTTP["remoteip"] != "192.168.0.0/24" {
        url.access-deny = (
                "/server-status"
        )
}

_ アクセス元+URLでの条件設定

$HTTP["remoteip"] != "192.168.0.0/24" {
        $HTTP["url"] =~ "^/old" {
                url.access-deny = ( "" )
        }
}

ちなみに、下のように条件の順番を入替えると、なぜかうまくいかない。おそらく、条件の参照順の問題という感じ。バグだろうか。←1.4.9のバグだった。 1.4.10では修正済み。

$HTTP["url"] =~ "^/server-status" {
       $HTTP["remoteip"] != "192.168.0.0/24" {
               url.access-deny = ( "" )
       }
}

CGIの設定

_ CGIの拡張子

lighttpdでは、CGIプログラムの拡張子ごとに、それを実行するプログラムを指定する必要がある。 Apacheでは、各プログラムを見てから実行するはず。おそらく、この辺りで実効速度の違いが生じるような気がする。

cgi.assign = (
        ".bin" => "",
        ".pl" => "/usr/bin/perl",
        ".cgi"=> "/usr/bin/perl",
        ".rb" => "/usr/bin/ruby"
)

しかし、そのためちょっと面倒な問題もある。この例だと、例えば検索用の namazu.cgi は、そのままだと perl を介して実行されてしまうため、うまく動かない↓

Unrecognized character \x7F at /home/foo/public_html/cgi-bin/namazu.cgi line 1.

そこで、バイナリのものは、上の様に".bin"という名前でシンボリックリンクを張って対処している。

apacheから乗り換えて、cgiが動くかどうか、とりあえず確認したいのなら、

cgi.assign = (
        ".cgi" => ""
)

としてしまえば良いはず。

_ CGIプログラムとして扱うファイルの拡張子

CGIプログラムとして扱う、いわゆる静的コンテンツではないファイルの拡張子を記述する。

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".cgi", ".rb" )

FastCGI

トラフィック量/リクエスト数の監視

Apacheと同じく、server-status, server-info にてコネクション、設定などを確認できる。

status.status-url  = "/server-status"
status.config-url  = "/server-config"

また、server-statistics にて、FastCGI の状態をテキスト形式で確認できる。

status.statistics-url = "/server-statistics"

更に、別の機能として、mod_rrdtoolを用いて、トラフィック量/リクエスト数のグラフを作成することが出来る。

Rewrite

URLに対し、一度だけ操作を行う url.rewrite-once と、何度も行う url.rewrite-repeat が用意されている。実際には、これと環境変数の $HTTP["url"] や $HTTP["referer"] などを組み合わせて使うことが多いと思う。訂正 : url.rewrite-* は、$HTTP["url"]内では使えないようだ。

例えば、tDiaryで 日付.html でアクセスしたときに、その日の日記にアクセスできるようにするための設定は以下の様になる。

url.rewrite-once = (
        "^/diary/([0-9]+)\.html$" => "/diary/index.fcgi?date=$1",
)

なお、現在(1.4.11)のところ url.rewrite と url.rewrite-final は、url.rewrite と同じとなっている。

Redirect/リダイレクト

トップページのコンテンツ(ファイル名はアルファベット)を port 8080 へリダイレクトする例。

url.redirect = (
       "^/$" => "http://mini13i.gotdns.org:8080/",
       "^/([a-zA-Z]+\.html)" => "http://mini13i.gotdns.org:8080/$1"
)

pukiwikiを編集可能なモードで使っていると、diffなどのページが検索でヒットして、訪問されることがある。そういった訪問者をメインコンテンツへ導くには、

$HTTP["referer"] =~ "(www.google|search.yahoo.co.jp)" {
        url.redirect = (
                "^\/\?cmd=.+\&page=(.+)$" => "http://linux.mini13i.gotdns.org/?$1",
        )
}

上から更に変更。

$HTTP["referer"] =~ "(www.google|search.yahoo)" {
        url.redirect = (
                "^/\?cmd=diff\&page=(.+)$" => "http://linux.mini13i.gotdns.org/?$1",
                "^/\?cmd=backup\&page=([^\&]+)$" => "http://linux.mini13i.gotdns.org/?$1",
                "^/\?cmd=backup\&page=([^\&]+)\&age=[1-9]+\&action=.*" => "http://linux.mini13i.gotdns.org/?$1",
                "^/\?cmd=backup\&action=diff\&page=([^\&]+)\&age=.*" => "http://linux.mini13i.gotdns.org/?$1",
                "^/\?plugin=template\&refer=(.+)$" => "http://linux.mini13i.gotdns.org/?$1",
                "^/\?(.+)=$" => "http://linux.mini13i.gotdns.org/?$1",
#               "^/\?cmd=[a-z]+\&page=(.+)$" => "http://linux.mini13i.gotdns.org/?$1",
#               "^/\?plugin=[a-z]+\&refer=(.+)$" => "http://linux.mini13i.gotdns.org/?$1",
        )
}

ここまでやるなら、diffなどをcrawler から隔離した方が良さそう。

mod_compress

apacheのものと同様、静的コンテンツを圧縮する。圧縮率の指定は…出来たっけ? ドキュメントには書いてなかった気がする。ファイルへのアクセス時に圧縮されたファイルを cache-dir に生成し、ファイルに変更がない限りそれを使うので、サーバへの負担も少ない。圧縮には、gzip, bzip2 が使われる。

compress.cache-dir = "/var/lib/lighttpd/cache/compress/"
compress.filetype  = ("text/css", "text/javascript", "text/plain", "text/html")

ディレクトリ毎に filetype の設定を分ければ、圧縮あり/なしの切替えも可。

これとは別に、(多分)動的コンテンツも圧縮することの出来る、 mod_deflate も本家のサイトに上がっている。おそらく、次のリリース時にマージされるのではないだろうか。

:Lighttpd


  • mod_compressとmod_expireの2つのモジュールを同時に有効にしたいのですが、設定法をご存じでしょうか? -- たかさん? 2008/04/14 (月)
  • mod_expireは使ってないのですが、ubuntuのサンプルでは、
    expire.url = ( "/buggy/" => "access 2 hours", "/asdhas/" => "access plus 1 seconds 2 minutes")
    の様になっています。 -- ぬし? 2008/04/14 (月)
Last-modified: 2010/09/28 (火)