[轉貼] RoR:Ruby on Rails的部署方案選擇

我沒在玩 Ruby on Rails,但是底下這一篇我覺得寫的不錯,可以參考看看,裡面有介紹一下目前當紅 web daemon 的一些基本知識 RoR的部署方式從架構上來說分為前端和後端: 一、前端 前端的作用就是處理靜態資源,將動態請求分發到後端,有時候也帶有一些額外的功能,例如對特定URL進行rewrite和redirect,對HTTP輸出進行gzip壓縮等等。 前端目前已知的可以選擇apache, lighttpd, litespeed, nginx, haproxy 1、apache2.2 apache是全球市場佔有率最高的web server,超過全球互聯網網站50%的網站都用apache。apache2.2 + mod_proxy_balancer是一個非常流行,非常穩定的方案。 使用apache2.2唯一的問題就是apache的性能和後面那些輕量級web server相比,差太遠了。一方面在處理靜態請求方面apache要比lighttpd慢3-5倍,內存消耗和CPU消耗也高出一個數量級,另一方面 mod_proxy_balancer的分發性能也不高,比haproxy差很遠。 2、lighttpd lighttpd 是一個輕量級高性能web server,一個在MySQL Inc工作的德國人寫的。性能很好,內存和CPU資源消耗很低,支持絕大多數apache的功能,是apache的絕好替代者。目前lighttpd已經上升到全球互聯網第四大web server,市場佔有率僅此於apache,IIS和Sun。 lighttpd唯一的問題是proxy功能不完善,因此不適合搭配mongrel來使用。lighttpd下一個版本1.5.0的proxy模塊重寫過了,將會解決這個問題。 3、litespeed 和 lighttpd差不多,商業產品,收費的。比lighttpd來說,多一個web管理界面,不用寫配置文件了。litespeed專門為單機運行的 RoR開發了一個lsapi協議,號稱性能最好,比httpd和fcgi都要好。他的proxy功能比lighttpd完善。 litespeed 的缺點我卻認為恰恰是這個lsapi。因為lsapi不是web server啟動的時候啟動固定數目的ruby進程,而是根據請求繁忙程度,動態創建和銷毀ruby進程,貌似節省資源,實則和apache2.2進程模型一樣,留下很大的黑客攻擊漏洞。只要黑客瞬時發起大量動態請求,就會讓服務器忙於創建ruby進程而導致CPU資源耗盡,失去響應。 當然,litespeed也支持httpd和fcgi,這個和lighttpd用法一樣的,到沒有這種問題。 4、nginx 一個俄國人開發的輕量級高性能web server,特點是做proxy性能很好,因此被推薦取代apache2.2的mod_proxy_balancer,來和mongrel cluster搭配。其他方面和lighttpd到差不多。 要說缺點,可能就是發展的時間比較短,至今沒有正式版本,還是beta版。沒有經過足夠網站的驗證。 5、haproxy 就是一個純粹的高性能proxy,不處理靜態資源的,所有請求統統分發到後端。 二、後端 後端就是跑ruby進程,處理RoR動態請求了。運行後端ruby進程有兩種方式: 1、fcgi方式 準確的說,不能叫做fcgi方式,其實就是啟動一個ruby進程,讓這個ruby進程監聽一個tcp/unix socket,以fcgi協議和前端通訊。所以fcgi不是指ruby進程的運行方式,而是ruby進程使用的通訊協議。這就好比你tomcat可以用 http也可以使用ajp通訊一樣,tomcat自己的運行方式都一樣的,只是通訊方式不一樣。 fcgi方式啟動ruby進程,可以使用lighttpd帶的一個spawn-fcgi工具來啟動(JavaEye目前採用這種方式)。 值得一提的是,apache2.2的mod_fastcgi的方式和上面還不太一樣,由apache動態創建fcgi進程和管理fcgi進程,這種方式和 litespeed的lsapi面臨的問題是一樣的,此外apache的mod_fastcgi自己也有很多嚴重的bug,是一種很糟糕的部署方式。這種糟糕的部署方式也敗壞了fcgi的名聲。 fastcgi只是一種協議,雖然古老,但並不是不好用,http協議也很古老。沒有必要因為 apache的mod_fastcgi的運行方式的問題而連帶把fastcgi都一同否定了。fastcgi只是一個協議(程序之間的語言),是 apache的mod_fastcgi這個模塊有問題。打個比方,有個人英語水平很差,和你用英語對話,總是結結巴巴的,那你說是英語(fastcgi) 這種語言有問題呢?還是和你對話的這個人 (mod_fastcgi)有問題呢? 2、http方式 也就是用mongrel去跑ruby進程,由於mongrel實際上已經是一個簡單的http server,所以也可以單獨作為web server使用。mongrel現在越來越受歡迎了。 用fcgi方式還是http方式,我個人覺得區別不大,關鍵還是看應用的場合,一般而言,推薦的搭配是: lighttpd + fcgi 或者 nginx +mongrel,而apache因為性能差距,而不被推薦。 JavaEye為什麼用lighttpd + fcgi呢?原因如下: 1) lighttpd發展了好幾年了,市場佔有率也相當高,是一個經過實踐檢驗的server,它的文檔也很全;而nginx還沒有經過足夠的市場檢驗,文檔也很缺乏 2) JavaEye的ruby進程和web server在一台機器上面跑,通過unix socket使用fcgi協議通訊可以避免tcp的網絡開銷,其通訊速度比使用tcp socket使用http協議通訊要快一些。 什麼場合使用haproxy? 大規模部署,例如你的RoR應用到十幾台服務器上面去,你用haproxy會更好,可以方便的添加刪除應用服務器節點,proxy性能更好。 資料來源: Csdn – http://news. [Read More]

[FreeBSD]解決 lighttpd log Permission denied 問題

今天早上伺服器 lighttpd 沒有跑起來,發現是因為沒有寫入 lighttpd.access.log 的權限,所以造成不能啟動

2008-07-04 08:37:15: (mod_accesslog.c.535) opening access-log failed: Permission denied /var/log/lighttpd/lighttpd.access.log 目前的解法大概就是不能去改 /var/log 這個資料夾權限,所以我在 /var/log 底下新增 lighttpd 這個資料夾

[Read More]

[FreeBSD]Lighttpd + php5 + 解決 wordpress Permalinks mod_write

今天轉換跑道了,最近玩 Apache 玩的很不順,因為只要線上人數一多,就會吃很多記憶體,導致必須重新開 Apache,所以今天來玩看看 lighttpd試試看,看看結果如何,其實轉換到 lighttpd 需要注意很多事情,那就是 Lighttpd 並不支援 .htaccess 檔案,所以 mode_rewrite 功能要設定到 Lighttpd.conf 裡面,然後也去找看看 Lighttpd 的 virtual host 的寫法,然後還有一點就是 wordpress 的 Permalinks 的問題,算是今天都解決了,底下來寫一下作法:

[Read More]

[FreeBSD]Apache 噴出 signal Segmentation fault (11)

最近在玩 FreeBSD 伺服器的加強效能,其實我自己試了很多套:eAcceleratorPear APC,跟 Zend Optimizer,這三套都是可以加速php的速度,當你的 apache 效能遇到瓶頸,就可以選用這三個來改善網頁瀏覽速度,不過應該沒有人三個都用吧,畢竟三個東西,感覺都是cache幫助,所以達成我們所想要的要求,有時候並不是全部安裝就是代表你的伺服器一定會超快,因為我的經驗是三個不能同時裝,只要裝了兩個都會出問題,這是我這幾天測試的結果,只要裝了Pear APC,就不能裝Zend Optimizer跟eAccelerator了,因為我的 httpd 的 log 會噴出底下訊息:

signal Segmentation fault (11) 跟 pid 15879 (httpd), uid 80: exited on signal 11

[Read More]

[FreeBSD & Linux]網站分流:簡易架設 HAProxy 伺服器

最近在玩這套 Web 的 Load Balance 軟體,其實這是之前我寫的一篇:[筆記] FreeBSD 一張網卡多重 ip 實現 Round Robin DNS Load Balancing,有網友留言給我說可以玩看看 HAProxy,這樣的確改善了很多效能,而且也是正確達到 load balance 的效果,不然用 DNS Robin DNS Load Balancing 的方式的卻沒辦法做的很好,關於 HAProxy 在 google 了一下,好像國內很少人在寫這方面的教學,我自己來寫一下筆記好了,其實我還不是對設定很熟悉,只是大概知道他的原理罷了,底下我們來看看官網的一張圖 haproxy-pmode

[Read More]

[FreeBSD]解決swap不夠的情況:Add Swap Space

最近在使用 FreeBSD 架站,apache + MySQL + PHP,但是最近常常會吐出來 swap 不夠的情形,然後系統就會吐出下面訊息

Jun 19 20:59:57 backup kernel: swap_pager_getswapspace(7): failed Jun 19 20:59:57 backup kernel: swap_pager_getswapspace(16): failed Jun 19 20:59:57 backup kernel: swap_pager_getswapspace(2): failed Jun 19 20:59:57 backup kernel: swap_pager_getswapspace(5): failed 目前上網看到的解決方法,都是增加 swap 的容量,那底下是在 FreeBSD 下面得作法:

[Read More]

基本優化 tuning apache 跟 tuning mysql 跟 php 效能

最近在玩優化 Apache 跟 MySQL 部份,然後就在 google 上面找一些資料,當然對我自己的網站當然改變不少,速度有增快許多,所以來紀錄一下,其實都是還蠻基本的改 config 檔案就可以了 1. apache 部份 for FreeBSD

#
# 利用 ports 安裝
# 在安裝 Apache 時,加入此參數 WITH_MPM=XXXX 即可。 
#
cd /usr/ports/www/apache22 ; make WITH_MPM=worker install clean
如果是要裝在 Linux 機器的話,可能要自己編譯,在 Apache 2.0 有很多效能上得改變,所以原本預設是 prefork
#
# 編譯加上 
# 
./configure --with-mpm=worker
在 Ubuntu 底下作法很奇怪,利用 apt-get 方式不能安裝 mpm worker,因為你安裝 php 的時候他會幫你移除,然後裝上 prefork,所以很奇怪,這部份我還不知道怎麼解決。 [Read More]

[FreeBSD] 安裝 PHP APC 加速網頁速度

最近在維護自己的機器,發現網站每秒 request 只要10幾次就會感覺吃很多資源,然後莫名 CPU 飆高到100%,後來只好去找怎麼去 tuning Apache,MySQL,PHP,至於改善 apache 跟 MySQL 我先不講了,我之後會在寫,我先處理了加速 PHP 的部份,我是安裝了 APC(Alternative PHP Cache),來改善執行 PHP 的速度,這個程式必須先安裝好 PECL(PHP Extension Community Library),再來安裝 APC 就沒問題了。 1. 首先安裝 APC

#
# 先切換到該軟體下面
#
cd /usr/ports/www/pecl-APC/; make install clean
[Read More]

[筆記] FreeBSD 一張網卡多重 ip 實現 Round Robin DNS Load Balancing

來紀錄一下好了,其實這兩年前,我自己就試過了,當時在弄 web 系統 Load Balancing,因為找不到更好的方法,所以使用 Round Robin DNS Load Balancing 技術來達到這功能,可是當然這不是很準確的做到 load balance,只是能解決暫時性的問題,真正要做到 Load Balancing 可能要靠硬體的技術了。 我自己是在 FreeBSD 系統上面實做的,當然弄 Load Balancing 一定要在網卡上面綁定多重ip,Linux 作法跟 FreeBSD 不大相同

#
# Linux 作法
#
ifconfig eth0:0 inet xxx.xxx.xxx.xx(1~9) netmask 255.255.255.0 broadcast xxx.xxx.xxx.255
#
# FreeBSD 作法
#
# /etc/rc.conf - add a new IP address to the NIC
# 在 rc.conf 加入底下 entry
ifconfig_rl0_alias0="192.168.0.57 netmask 0xffffffff" 
#
# 指令
#
ifconfig rl0 alias 192.168.0.57 netmask 0xffffffff
 
[Read More]

[FreeBSD&Linux] 如何用 mount 取代 ln 去實現連結檔(Symbolic Link)

我們在 Linux 或者是 FreeBSD 底下如何建立連結檔(Symbolic Link) ,也就是在 Windows 底下的捷徑啦,這個在鳥哥的網站都有寫的很清楚:連結檔的介紹: ln,最重要搞清楚 hard link 跟 soft link 就可以了,簡單來說,hard link 只可以針對檔案,不可以對目錄,但是 soft link 就是可以對目錄了,因為她就像 Windows 底下的捷徑,那在 Linux 底下,大家常常在玩 FTP,一定會碰到需要利用 Link 的方式,但是如果你利用 ln 的方式的話,連接ftp,會沒辦法回到上一層目錄,就是有 chroot 的問題,那底下是我發現可以解決的方法,其實這算是月經題了,只是我想記錄下來。 在 Linux 底下,就是利用 mount 的指令:

#
# 就是利用 mount --bind
#
mount --bind olddir newdir
在 FreeBSD 底下,利用 mount_nulls 指令
#
#  mount_nullfs olddir newdir
#
mount_nullfs olddir newdir
很簡單吧,大概是這樣,FTP 就不會出現不能回到上一層目錄的問題了