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