如何讓 port 3000 支援多個專案?


#1

您好:
先請教一下, rails s 是啟動 SERVER
但若 一台UB 上有2個 專案,這樣 會不會衝突?

另外
我原本於 影片2中,rails s 後,可以用 192.168.1.106:3000 來瀏覽 專案1

但接著 影片day2.5 ,我 目前只切換到 shop 這一個專案,rails s 後,他只能 用127.0.0.1:3000 來browser shop專案
"Firefox 無法與伺服器 192.168.1.106:3000 建立連線。"

請問這又是哪邊沒有設定嗎?
謝謝!


#2

請你學好 deploy … 因為這世界不是你所謂的方式來跑的

首先,開發到後期上線前一定要用 nginx / apache 之類的 httpd(d = deamon) 方式來做 deploy,deploy 的好處在於靜態檔案可以從 httpd 直接出,而非等到 Rails 才處理,而 deploy 的方式就是學問了,有一票東西在且解釋其優缺點和架構,所以這邊不再贅述,新手教學內應該是用 passenger 才是

okay,因為 deploy 是用 httpd,所以把問題轉到 httpd 上,httpd 有兩種方式來執行 Ruby / Rails,或是 Python / CGI / PHP …

一種是 mod ( module ),類似把一支程式附加到 httpd 內讓其執行,很像 lib 的概念,缺點是它可能不會是一支完整的程式,使用上有其限制性(類似無法支援 thread 還是啥鬼操作無法使用之類的),而有用過 php 的人應該都知道實際使用是 mod_php,所以 passenger 早期很多人也都叫他 mod_rails

另外一種是 proxy,類似你給我一個 port range,然後把程式都開好,類似 3000 ~ 3010 port 共 10 支 process,然後我把需求都餵過去

有上面兩種後就會出現接近最佳解的混合體,也就是目前常見的:讓 httpd 開一個 watchdog,然後讓 watchdog 來做 proxy + load balance 的動作,來增減下游 process 並把 request 餵過去

再來額外的話題,一個 port 的接收端只能接到一個 process 上,如同你所說的 3000 port 如何吃多個專案?,其實只要是 httpd 應該都支援另外一個點,就是 virtualhost

virtualhost 內可以設定 domain name(下面寫成 DN)為接收點,當作第一層過濾指定到正確的地方去,當然你可以把 DN 打成不存在的,類似寫在 client 的 /etc/hosts 內來做 static DN 來讓該不存在的網址能跑到正確的 IP 去,瀏覽器也會正確的把該 static DN 帶到 header,httpd 看到該 header 就會導到正確的下游 proxy / mod

你現在開的 3000 port 叫做 dev 模式,你不會感覺卡嗎?如果要服務給很多人該怎辦?因為一個 process 一次只能處理一個 request,而你做完 deploy 後,預設應該會開到四支以上,一次處理完大量的需求,否則你的多核 CPU 都空著浪費沒做事情不會很怪咪?

anyway 流程大概是

URL(瀏覽器把 DN 塞入 header 的 host 欄位) => httpd(拆解 header 判斷 DN) =>
DN 所屬的 virtualhost => watchdog(找一支空閒的 process) => ruby / rails

回去時會按照原路回去,上面不談論 port,因為不同 port 可以看成不同 process,或是一支 process 支援多個 port,而 virtualhost 也能指定 port 就是

以上,去玩 deploy,上面也應該給你足夠的關鍵字量了 … 你只看到世界的一部份哩


#3

您好:
謝謝
所以 3000 這一個只是每一個專案開發用的
真正上限 還要去DEPLOY,目前我應該還沒到那個階段…

想再請教一下

@items =@paginate =Item.paginate(:page => params[:page])
是指@paginate =Item.paginate(:page => params[:page])
再@items =@paginate

3個串成一起嗎?
謝謝!


#4

從後到前的連等於,基本上是


#5

雖然不是用port 3000跑兩個專案,不過你可以用

rails server -p 3001

讓port 3001跑另外一個專案,希望能幫到你


#6

謝謝您!
我當初也在想 是否以這種方式