monolithic kernel

WebサーバをNginxに移行してみる

うちのサイトのWebサーバをApacheからNginxに移行しました。Ubuntu 9.10の環境で試した手順をメモしておきます。

インストール

インストールはaptitude一発で簡単です。Apacheなどが動いている場合は、あらかじめ停止させておきましょう。

sudo aptitude install nginx

ここから設定を行いますが、設定は再読み込みを行わないと反映されません。設定を行った後は以下のコマンドで再読み込みさせましょう。

sudo /etc/init.d/nginx reload

VirtualHostの設定

基本的な設定方法はDebian系のApacheと同様で、/etc/nginx/sites-available以下にVirtualHostごとの設定ファイルを配置し、/etc/nginx/sites-enabledにシンボリックリンクを張って利用します。ただし、Apacheのようにa2ensite/a2dissiteコマンドが用意されているわけではないようなので、ln -sコマンドを利用して手動でリンクを張る必要があります。

静的なWebサイトのための設定

server 内に設定を記述します。serverが複数存在する場合には、listenで指定したポートやserver_nameがマッチするものが選択されます。

静的なWebサイトを構築する場合には、/の位置に対してrootディレクティブでドキュメントルートを指定し、indexディレクティブでディレクトリに対してアクセスされた場合に開くファイル名を指定すれば完了です。

server {
  listen 80;
  server_name monoweb.info;
  location / {
    root /home/mono/public_html/monoweb.info;
    index index.html;
  }
}

PHPを利用するための設定

NginxにはApacheのmod_phpのようにWebサーバにPHPインタプリタを組み込む機能は存在しないため、FastCGIとして別プロセスで動作させておき、必要なときはそちらに処理を投げるようにします。

PHPをFastCGIとして動作させる

PHPをFastCGIとして動作させるためにはphp5-cgiを利用します。また、起動と死活監視のためにdaemontoolsを活用します。php5-cgiをインストールするには以下のコマンドを実行します。

sudo aptitude install php5-cgi

daemontoolsのrunファイルに以下のように記述すると、localhostの9000番ポートでFastCGIの待ち受けをしてくれます。

#!/bin/sh
exec setuidgid www-data php5-cgi -b 127.0.0.1:9000

NginxからFastCGIを利用する

拡張子が.phpのファイルにアクセスしようとした場合に、fastcgi_passディレクティブを利用して先ほど起動させたプロセスに処理を投げるようにします。この時FastCGIに渡すパラメータを定義しておく必要がありますが、SCRIPT_FILENAME以外のパラメータについては、自動的に定義してくれる設定ファイルがデフォルトで用意されているので、includeして利用しています。

server {
  listen 80;
  server_name blog.monoweb.info;
  location / {
    root /home/mono/public_html/blog.monoweb.info;
    index index.php index.html;
  }
  location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass localhost:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /home/mono/public_html/blog.monoweb.info$fastcgi_script_name;
  }
}

リバースプロキシとして動作させるための設定

LLで作成したWebアプリケーションを動作させる場合、以前はmod_perl/mod_rubyといったApacheモジュールをサーバに組み込む形が一般的でしたが、最近では単体でサーバとして動作させることが増えてきました。ここでは、80番ポートで待ち受けを行っているNginxから別のポートのアプリケーションにリクエストを投げてみます。

以下の設定ファイルでは、app.monoweb.info以下にリクエストがあった場合に9001番ポートで動作しているアプリケーションに処理を投げています。また、ifディレクティブを利用して静的なファイルが存在した場合には何もせずにそのファイルを開くようにしています。

server {
  listen 80;
    server_name app.monoweb.info;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    location / {
      root /home/mono/public_html/app.monoweb.info;
      if (-f $request_filename) {
        break;
      }
      proxy_pass http://localhost:9001;
  }
}

Basic認証を利用するための設定

簡単な認証を行う場合、Basic認証やDigest認証を使うと便利です。本当はDigest認証を利用したかったのですが、方法が分からなかったのでひとまずBasic認証を利用してみます。

以下のように、auth_basicディレクティブで認証の名前、auth_basic_user_fileディレクティブでユーザの情報を定義したファイルを指定します。ファイル名は/etc/nginxからの相対パスか絶対パスで指定します。auth_basic_user_fileディレクティブで利用するファイルには、Apacheと同じフォーマットのものが利用可能です。

server {
  listen 80;
  server_name private.monoweb.info;
  auth_basic "Authentication Required";
  auth_basic_user_file .htpasswd;
  location / {
    root /home/mono/public_html/private.monoweb.info;
    index index.php;
  }
}

今回はprivate.monoweb.info以下のすべてのリクエストに対してBasic認証を行っていますが、auth_basicディレクティブとauth_basic_user_fileディレクティブをlocationディレクティブの内側に記述すれば、特定のリソースのみに対して認証を行うことも可能です。