taslamの日記

>>mizincogrammerに移転しました。こちらは、今後更新されません。<<

2008-08-11

[][]CentOS5(x86_64)にNginxをインストール

軽量なWebサーバ、Nginxが人気の様なので、リバースプロキシとして導入してみた。

EPELの導入

RHEL互換ディストリビューション用の追加リポジトリのひとつ「EPEL」を設定する。

wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-3.noarch.rpm
rpm -ihv epel-release-5-3.noarch.rpm

Nginxのインストール

yum install nginx

nginx.x86_64 0:0.6.31-3.el5がインストールできた。

NginxでSSLやDAVを使うには./configure時にオプションを指定する必要があるが、このパッケージでは有効になっているようだ。

[]Nginxでリバースプロキシ

2つのRailsアプリにリバースプロキシを使ってそれぞれ振り分ける例。

ディレクトリベースで振り分ける例

user              nginx;
worker_processes  4;

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

pid               /var/run/nginx.pid;

events {
  worker_connections  1024;
}

http {

  # Railsアプリの静的コンテンツはmongrel_clusterだと遅いのでもっと高速なサーバで
  upstream static {
    server 192.168.0.12:80;
    server 192.168.0.13:80;
  }

  # Railsアプリ mongrel_cluster
  upstream app1 {
    server 192.168.0.12:3000;
    server 192.168.0.12:3001;
    server 192.168.0.13:3000;
    server 192.168.0.13:3001;
  }
  upstream app2 {
    server 192.168.0.12:3010;
    server 192.168.0.12:3011;
    server 192.168.0.13:3010;
    server 192.168.0.13:3011;
  }

  # 静的ページかCGIだけ apache
  upstream web {
    server 192.168.0.8:80;
  }

  server {
    listen      80;
    server_name .taslam-example.jp;

    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host            $http_host;
    proxy_redirect    false;
    proxy_max_temp_file_size          0;

    # 静的コンテンツ
    location ~ ^/(app1|app2)/(javascripts|stylesheets|images)/.* {
      proxy_pass http://static;
      break;
    }

    # アプリケーション1に振り分け
    location /app1 {
      proxy_pass http://app1;
      break;
    }

    # アプリケーション2に振り分け
    location /app2 {
      proxy_pass http://app2;
      break;
    }

    # 上に当てはまらないものはwebサーバに振り分け
    location / {
      proxy_pass http://web;
      break;
    }
  }

}

ドメインベースで振り分ける例

user              nginx;
worker_processes  4;

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

pid               /var/run/nginx.pid;

events {
  worker_connections  1024;
}

http {

  # Railsアプリの静的コンテンツはmongrel_clusterだと遅いのでもっと高速なサーバで
  upstream static {
    server 192.168.0.12:80;
    server 192.168.0.13:80;
  }

  # Railsアプリ mongrel_cluster
  upstream app1 {
    server 192.168.0.12:3000;
    server 192.168.0.12:3001;
    server 192.168.0.13:3000;
    server 192.168.0.13:3001;
  }
  upstream app2 {
    server 192.168.0.12:3010;
    server 192.168.0.12:3011;
    server 192.168.0.13:3010;
    server 192.168.0.13:3011;
  }

  # 静的ページかCGIだけ apache
  upstream web {
    server 192.168.0.8:80;
  }

  # アプリケーション1に振り分け
  server {
    listen      80;
    server_name app1.taslam-example.jp;

    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host            $http_host;
    proxy_redirect    false;
    proxy_max_temp_file_size          0;

    # 静的コンテンツ
    location ~ ^/(javascripts|stylesheets|images)/.* {
      proxy_pass http://static;
      break;
    }

    location / {
      proxy_pass http://app1;
      break;
    }
  }

  # アプリケーション2に振り分け
  server {
    listen      80;
    server_name app2.taslam-example.jp;

    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host            $http_host;
    proxy_redirect    false;
    proxy_max_temp_file_size          0;

    # 静的コンテンツ
    location ~ ^/(javascripts|stylesheets|images)/.* {
      proxy_pass http://static;
      break;
    }

    location / {
      proxy_pass http://app2;
      break;
    }
  }

  # Webサーバに振り分け
  server {
    listen      80;
    server_name www.taslam-example.jp;

    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host            $http_host;
    proxy_redirect    false;
    proxy_max_temp_file_size          0;

    location / {
      proxy_pass http://web;
      break;
    }
  }
}

[]NginxでSSLラッパー

クライアント---(HTTPS)---Nginx---(HTTP)---Webサーバ

という使い方もできる。

user              nginx;
worker_processes  4;

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

pid               /var/run/nginx.pid;

events {
  worker_connections  1024;
}

http {

  upstream web {
    server 192.168.0.8:80;
  }

  # Webサーバに振り分け
  server {
    listen      443;
    server_name www.taslam-example.jp;

    # --------------- SSLの設定ここから ---------------
    ssl                     on;
    # サーバ証明書(サーバ証明書に中間CA証明書を連結したもの)
    ssl_certificate         /usr/local/certs/chained.crt;
    # 秘密鍵
    ssl_certificate_key     /usr/local/certs/server.key;
    # --------------- SSLの設定ここまで ---------------

    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host            $http_host;
    proxy_redirect    false;
    proxy_max_temp_file_size          0;

    location / {
      proxy_pass http://web;
      break;
    }
  }
}