2012-01-11 90 views
8

我讀過的每哈斯克爾部署線程我能在這裏找到和一些更廣泛的網絡上,但我還是不明白一兩件事。如果我已經爲我的服務器編譯了一個應用程序,並且可以ssh並運行它,那麼我該如何去運行它?假設我使用的是HTTP接口(不是FastCGI)。如何運行部署Haskell的Web應用程序

例如,使用node.js,我們使用集羣來讓應用程序在幾個處理器內核上啓動,然後爲centOS創建一個init.d腳本來運行,守護進程,獲得一個pid文件等。

如何爲Haskell應用程序執行此操作?

+1

您是否使用特定框架? (Happstack/Yesod/etc?) – alternative 2012-01-12 02:42:33

+0

是的。 :)我對Happstack和Snap都很感興趣。我一直在玩Hack2,但它使用Snap的服務器。 – 2012-01-12 15:23:50

回答

6

既然你不提你使用的框架,我只是要回答一般這個問題。

哈斯克爾,你沒有Web應用程序的啓動多個實例(集羣中的),因爲如果應用程序支持的併發,通常使用多個線程內部。你想要做的是確保應用程序編譯爲-threaded-rtsopts標誌。然後,當您運行應用程序時,您將通過標記+RTS -N<number of simultaneous threads>。例如,如果您在帶有英特爾®超線程技術的8覈計算機上的端口1234上使用Snap Web應用程序,則可以使用my-server -p 1234 +RTS -N16來啓動它以並行化多達16個操作系統線程。

爲了守護進程的Web應用程序,您可以使用相同的過程與node.js中您創建了一個init腳本,以各種UNIX運行模式啓動可執行文件,並且Bob是您的叔叔。

與任何其他Web應用程序,你可能想使用將流量重定向到Web應用程序(這就是爲什麼你會不想使用端口80用於Web應用程序)的前端服務器。有關如何執行此操作的詳細信息,請訪問the Web/Deploy page on HaskellWiki

+0

你的回答完全是我試圖弄清楚的問題!但是如果你不想使用前端服務器(我不知道爲什麼需要它),你如何在服務器上運行snap應用程序?就像Ubuntu服務那樣,運行「your_app_name -p 80 + RS -N16」?我希望你回答,我一直在試圖弄清楚這件事一段時間......謝謝! – drozzy 2012-07-01 00:05:53

2

三大Haskell網絡框架(Snap,Yesod和Happstack)都可以使用內置的Web服務器。生產部署的傳統方法可能是使用您的操作系統的機制來運行流程在init腳本或類似的守護進程中。我已經使用了一個輕量級的解決方案是一個腳本類似如下:

while true; do 
    echo Restarting at `date` | tee -a stdout.log stderr.log > /dev/null 
    ./my_app 80 >> stdout.log 2>> stderr.log 
done 

我在後臺運行此腳本。這很簡單,所以shell腳本進程本身從不崩潰。如果服務器因任何原因崩潰,該腳本會自動確保它立即重新啓動。如果您想推出新版本,只需將其複製到my_app可執行文件並將SIGHUP發送到my_app進程即可。

硬化系統管理員那裏可能會對這樣的事情感到不寒而慄。我不會說這是做這件事的最好方式,但我已經用這種方法運行了幾年的產品應用程序,並且它運行良好。正如其他人所提到的,您也可以使用前端代理服務器進行設置,以便您的應用程序不必以root身份運行。

+0

這種方法使很多系統管理員想要對其守護進程執行操作很困難,比如檢查進程狀態(這不能用'ps aux | grep ...''或'pgrep'當你有多個守護進程具有相同/相似的名字時),做實際的配置重載,沒有特殊信號等。 – dflemstr 2012-01-12 14:14:24

+0

當然。這是一個較輕的解決方案,對於我職業系統管理員可能採取的方法似乎有點沉重的情況下,我的工作很好。 – mightybyte 2012-01-19 14:58:43