iT邦幫忙

DAY 4
11

Rails 的簡單任務系列 第 4

[RoR] 用 nginx 作為 RoR 的前端

ruby為基礎的web server,像WEBrick, mongrel, thin, ebb或其他會被陸續發展出來,雖然可以直接以80 port啟動,若碰到流量大、連接數蠻多的時候,就有需要在前端加上reverse proxy,可讓反應的速度提昇些。

常作為RoR的前端常見的是lighttpd、nginx及在apache上所謂的 mod_rails: passenger ,愈新出來的產品就效能愈快;在此簡述自己用nginx設定的方式。
nginx 的安裝及設定
安裝 nginx
yum install nginx

通常我在一台機器中,我都以虛擬主機的功能來設定,通常是公佈說我的網址是SITE_NAME_1,,web server上就在virtual host的設定段指到SITE_NAME_1的目錄中;另外就做一個 Default 的目錄,來接受處理 非SITE_NAME_1 名稱的 query,像以IP來query或其他不同的名稱query指到本身機器來。

以下的範例,是這樣子考量的: 在 /home/ironman 的家目錄之中,是放每個RoR的各別的project,其中 Default的目錄中建立 htdocs logs 目錄,通常這裡都讓所沒有指定到的hostname的query,都指向這裡。

在此將我所用的nginx的設定檔分享於此:

user              nginx;
worker_processes  1;
pid               /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] $request '
                      '"$status" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

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

    #sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    gzip  on;

### 修改您所開啟的 port,這裡 upstream 的設定也可改寫在 /etc/nginx/conf.d/upstream-fair.conf
### upstream 後面的 mongrel 也可設其他名稱,只要跟 virtual 裡面所指向的名稱一致即可。
    upstream mongrel {
        server 127.0.0.1:3000;
    }

    # Load config files from the /etc/nginx/conf.d directory
#所指定的虛擬主機設定,可寫在本檔案,或者寫到下述 /etc/nginx/conf.d/virtual.conf 的檔裡面
    include /etc/nginx/conf.d/*.conf;

    #
    # 將所有未指定到的hostanme的query都指到這預設的server
    #
    server {
        listen       80 default;
        server_name  _;
### 看您要將log定在哪個目錄,別忘了注意nginx以什麼身份來寫入的權限問題
        charset utf-8;
        access_log  /home/ironman/Default/logs/access.log  main;
        error_log  /home/ironman/Default/logs/error.log;

### 目錄要設在哪裡
        location / {
            root   /home/ironman/Default/htdocs;
            index  index.html index.htm;
        }
### 若要跑PHP的話,加上此段
        location ~ /pzone/.*\.php$ {
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/ironman/Default/htdocs/$fastcgi_script_name;
            include fastcgi_params;
        }

        error_page  404              /404.html;
        location = /404.html {
            root   /usr/share/nginx/html;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

而在 /etc/nginx/conf.d/virtual.conf 的設定內容:

    server {
        listen          80;
### 設被 query 的主機名稱
        server_name     SITE_NAME_1;
        charset utf-8;
### log 檔的位置
        access_log      /home/ironman/test1/log/access.log main;
        error_log       /home/ironman/test1/log/error.log;

    location / {
      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;
      if (-f $request_filename/index.html) {
        rewrite (.*) $1/index.html break;
      }

在nginx 上執行 PHP 的設定
一些好用的PHP的程式,仍需在nginx上執行,

Fedora上安裝可執行php依下列動作進行:

#可以有php-cgi這執行檔
yum install php-cli

#Ubuntu是裝php-common就可以有php-cgi
#然後需要裝fastcgi的程式,Fedora是在lighttpd裡面:
yum install lighttpd-fastcgi

#是為了有: /usr/bin/spawn-fcgi 這個執行程式。

建置一個啟動 php-cgi 的 script
為/usr/local/bin/php-fastcgi

#!/bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi

在/etc/init.d/init-fastcgi 建置啟動的script

#!/bin/bash
PHP_SCRIPT=/usr/local/bin/php-fastcgi
RETVAL=0
case "$1" in
    start)
      $PHP_SCRIPT
      RETVAL=$?
  ;;
    stop)
      killall -9 php-cgi
      RETVAL=$?
  ;;
    restart)
      killall -9 php-cgi
      $PHP_SCRIPT
      RETVAL=$?
  ;;
    *)
      echo "Usage: php-fastcgi {start|stop|restart}"
      exit 1
  ;;
esac
exit $RETVAL

啟動即可被nginx所用

在此指定 Default 中的 php 的目錄才可執行 PHP 的程式, nginx.conf 中加入

        location ~ /php/.*\.php$ {
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/ironman/Default/htdocs/$fastcgi_script_name;
            include fastcgi_params;
        }

然後啟動 /etc/init.d/init-fastcgi,如果 pgrep -lf php-cgi 可以看到php-cgi有在跑的話,就可在nginx中執行PHP了。網址就是 http://IP/php/test.php 即可看到執行結果。

參考連結
http://rubyjudo.com/2006/8/27/nginx-yet-another-rails-deployment-option
http://www.howtoforge.com/lemp\_nginx\_mysql\_php\_ubuntu\_debian
http://bianbian.org/tag/nginx


上一篇
[RoR] 簡單完成 CRUD 的動作
下一篇
[RoR] 簡單完成登入登出的授權機制
系列文
Rails 的簡單任務33

1 則留言

0
gric
iT邦高手 1 級 ‧ 2009-03-13 14:41:06

謝謝分享咯!

我要留言

立即登入留言