ユーザ用ツール

サイト用ツール


nginx

nginx

非同期IOで動作する高速なHTTPサーバ。読み方は「えんじんえっくす」

コンフィギュレーション

configファイルは cong/nginx.conf である。

Basic認証

Apache の htpasswd がそのまま使える。

Ubuntu 10.04では以下のパッケージに htpasswd コマンドが含まれている(Apache本体は不要)

$ sudo aptitude install apache2-utils

/etc/nginx/conf/nginx.conf

http {
  ..
  server {
    ..
    location / {
      ..
      auth_basic "Staff Only";
      auth_basic_user_file /etc/nginx/conf/htpasswd;
    }
  }
}

最大接続数

worker_processes  2;

events {
    worker_connections  1024;
}

worker_processes と worker_connections の積、この場合は2048リクエストが最大接続数となる。想定される最大クライアント数×1ページ当たりの平均ファイル数より多少大きい値を設定すると良い。

ファイルディスクリプタの制限

Linuxではユーザが使用可能なリソース数が制限されている。Ubuntuではデフォルトでファイルを1024以上オープンできないが、nginxで同時に大量のリクエスト処理を行うと1024を上回る可能性がある。

worker_rlimit_nofile で nginx プロセスがオープンできるリソースの制限を変更できる。

worker_processes  2;
worker_rlimit_nofile 4096;

events {
    worker_connections  1024;
}

※ この設定は1 worker_processesあたりの設定? worker_connectionsと同じで良いのか? 仮にそうだとしてkeep aliveやssiを使っていると1コネクションで複数ファイルを開くので、その場合はconnectionより大きい値を指定しないといけない? 要調査。

ログローテーション

Ubuntuのログローテーションの例(月単位でローテーション)

/var/log/nginx/*.log {
        monthly
        missingok
        rotate 12
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                test -f /var/run/nginx.pid && kill -USR1 `cat /var/run/nginx.pid`
        endscript
}

nginxはUSR1シグナルでログファイルを開き直す。

nginx.confに設定を追加

Rubyの設定(これはビルドすると最初から設定済み)

http {
    # ...

    passenger_root /var/lib/gems/1.8/gems/passenger-3.0.8;
    passenger_ruby /usr/bin/ruby1.8;

    # ...
}

Rails(Rack)の設定

http {
    # ...

    server {
        listen       80;
        server_name  rails.paulownia.jp;
        root         /var/www/rails.paulownia.jp/app/public;
        passenger_enabled on;
    }
}

Railsの特定のパス以下にbasic認証をかけたい場合は、basic認証をかけるフォルダでも passenger_enabled on を設定する。

http {
    # ...

    server {
        listen       80;
        server_name  rails.paulownia.jp;
        root         /var/www/rails.paulownia.jp/app/public;

	location / {
            passenger_enabled on;
	}

        location /auth/ {
            passenger_enabled on;
            auth_basic "Authentication Required";
            auth_basic_user_file "/var/www/rails.paulownia.jp/app/htpasswd";
        }
    }
}

PHP

Apacheにおけるmod_phpのようなモジュールは無いので、FastCGIでphpを動作させる。php-fpmまたはspawn-fcgiを使う。

php-fpm

PHP-FPM(PHP FastCGI Process Manager)はPHP5.3から導入されたFCGIのプロセス管理ツール。

Ubuntu 10.04標準のaptリポジトリにはパッケージが無い。nginxチームが作成したリポジトリにあるので、そのリポジトリを追加する。ただし標準のリポジトリではないので、次のLTS(12.04)リリース後はサポートされない可能性もあるので注意。

$ sudo aptitude install python-software-properties
$ sudo add-apt-repository ppa:nginx/php5
$ sudo aptitude update

インストール。起動スクリプトやconfigも作成される。デフォルトではport 9000でFCGIを起動する。

$ sudo aptitude install php5-fpm

起動と停止

$ sudo service php5-fpm start
$ sudo service php5-fpm stop

なお、PHPをFCGIプロセスとして起動するためには、FCGIを有効にしてPHPをビルドする必要がある。aptのPHPは有効になっているので気にしなくていいが独自ビルドする場合は注意する。

spawn-fcgi

$ sudo aptitude install php5-cgi
$ sudo aptitude install spawn-fcgi

起動スクリプトが無いので自分で作る。/etc/init.d/php5-fastcgi ファイルを作成

#!/bin/bash
 
PID_FILE="/var/run/php5-fcgi.pid"
 
FCGI_EXEC="/usr/bin/spawn-fcgi"
FCGI_OPTS="-a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -C 3 -P $PID_FILE"
 
RETVAL=0
 
start_fcgi() {
  $FCGI_EXEC $FCGI_OPTS
}
stop_fcgi() {
  kill $(cat $PID_FILE) 
}
 
case "$1" in
  start)
    start_fcgi
    RETVAL=$?
  ;;
  stop)
    stop_fcgi
    RETVAL=$?
  ;;
  restart)
    stop_fcgi
    start_fcgi
    RETVAL=$?
  ;;
  *)
    echo "Usage: php5-fastcgi {start|stop|restart}"
    exit 1
  ;;
esac      
exit $RETVAL

デーモンとして設定

$ sudo update-rc.d php5-fastcgi defaults

起動と停止

$ sudo service php5-fastcgi start
$ sudo service php5-fastcgi stop

nginx.conf

spawn-fcgiでもphp-fpmでも同じ

    server {
        listen 80;
        server_name  sample.paulownia.jp
        root         /var/www/sites/sample.paulownia.jp/htdocs;
        
        index        index.html index.php
        
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }

x-accel-redirect

nginx をバックエンドアプリケーションのプロキシとして使っている場合に、アプリにproxyした後にnginxがファイルを返すようにする仕組み。

主な用途は認証つきの静的ファイルダウンロード。nginxがファイルを返すためバックエンドアプリケーションに転送負荷をかけずに認証つきのファイルダウンロードを実装できる

アプリ側は権限などのチェックを行い、問題なければ200レスポンスに以下のようなレスポンスヘッダをつける

X-Accel-Redirect: /download/fifename1.png

nginx側

// アプリへのプロキシ
location / {
  proxy_pass: http://127.0.0.1:8080 
}

// x-accel-redirectを受け取る部分
location /download {
  internal;   // これを忘れると直接パス指定でダウンロードし放題になるので注意
  root /var/www/download;
}

ダウンロードさせるファイルは /var/www/download/ 以下に設置する

nginx.txt · 最終更新: 2020/05/29 09:30 by nullpon