Posted by & filed under server.


研究室での仕事の一環で,以前から気にはなっていたnginxに触れる機会があり,そのシンプルな設定と,動作の軽さに感動したので,自宅サーバの一部WebサーバをApacheからnginxに移行してみました.

インストール

Ports Collectionにあるので,それをそのままインストールします.

# portmaster www/nginx

オプションは以下を選択しました.

  • IPV6 – IPv6サポート
  • HTTP – HTTPを有効化
  • HTTP_CACHE – cacheを有効化
  • HTTP_REWRITE – rewriteを有効化
  • HTTP_SSL – HTTPSにも対応
  • CACHE_PURGE – cacheの手動削除を可能にする
  • HTTP_AUTH_DIGEST – Digest認証を有効化

移行する環境では,一部phpを使用しているので,nginxと連携するためにfastcgiラッパもインストールします.

# portmaster www/spawn-fcgi

設定

自動的に作成された, /usr/local/etc/nginx/nginx.conf を編集していきます.
初期ではバーチャルホストの設定もすべてnginx.confに書いてありますが,管理しやすいようにバーチャルホストごとに ファイルを分割できるようにしています.

user  www;
worker_processes  2;

error_log   /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    gzip_disable "msie6";

    access_log  /var/log/nginx/access.log;

    include /usr/local/etc/nginx/conf.d/*.conf;
    include /usr/local/etc/nginx/sites/*;
}

あとはバーチャルホストごとの設定を書いていきます.
Apacheの設定ファイルをnginxの書式に書き換えていきます.

リバースプロキシの設定

Apache

ProxyRequests off
ProxyPass / http://localhost:8080/
<Location />
    ProxyPassReverse http://localhost:8080/
    ProxyPassReverseCookieDomain localhost example.com
    ProxyPassReverseCookiePath / /
</Location>

nginx

upstream up {
  server localhost:8080;
}
server {
<< snip >>
  location / {
    proxy_pass http://up/;
    proxy_redirect http://localhost:8080/ /;
    proxy_cookie_domain localhost example.com;
    proxy_cookie_path / /;
  }
}

mod_rewriteを使用したリバースプロキシ

Apache

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^/hoge/([0-9A-Za-z]+)$ http://192.168.0.32:8080/hoge.php?key=$1 [P,L,QSA]
  RewriteRule ^(.*) http://192.168.0.32:8080/$1 [P,L,QSA]
  ProxyPassReverse    / http://192.168.0.32:8080/
</IfModule>

nginx

upstream up {
  server 192.168.0.32:8080;
}
server {
<< snip >>
  location / {
    proxy_pass http://up/;
    proxy_redirect http://192.168.0.32:8080/ /;
  }
  location /hoge/ {
    rewrite ^/hoge/([0-9A-Za-z]+)$ /hoge.php?key=$1 break;
    proxy_pass http://up/;
  }
}

Digest認証(IP認証と組み合わせ)

Apache

<Location />
  Satisfy Any
  Order deny,allow
  Deny from all
  Allow from 192.168.0.
  AuthType Digest
  AuthName "Auth Digest"
  AuthUserFile /path/to/htdigest
  Require valid-user
</Location>

nginx

location / {
  satisfy any;
  allow 192.168.0.0/24;
  auth_digest 'Auth Digest';
  auth_digest_user_file /path/to/htdigest
}

起動

rc.confに以下を追記して起動します.

nginx_enable="YES"
spawn_fcgi_enable="YES"
spawn_fcgi_username="www"
spawn_fcgi_groupname="www"
spawn_fcgi_bindaddr="172.0.0.1"
spawn_fcgi_bindport="9000"
spawn_fcgi_app="/usr/local/bin/php-cgi"
# service spawn-fcgi start
# service nginx start

 

すぐに設定できるだろうと考えていましたが,ディレクティブの有効範囲などで結構躓いて時間がかかってしまいました.

ここでは詳しく書きませんが,特にphpとの連携部分に手間取りました.対象のスクリプトが見つからない時は,

No input file specified.

とエラー文が表示されますが,どういう引数でfastcgiを呼び出した結果なのかがログに残っておらず,手探りで修正を余儀なくされたためです.

試行錯誤して,どうにか設定が終わった後に,EchoというModuleの存在を知りました…
これを使って変数等を出力してやれば設定が楽になりそうです.

キャッシングの設定はまた後日…