2011-07-08 64 views
0

如何在Thin作爲服務運行時使用EventMachine.connect_unix_domain(使用下面的init腳本(摘錄)和配置)。直接在下面的代碼是問題(我得到一個eventmachine not initialized: evma_connect_to_unix_server錯誤)。第二個代碼示例有效,但不允許我將精簡(我不認爲)。 Thin是否已經沒有EventMachine的正在運行的實例?EventMachine UNIX套接字連接:如何使用Thin作爲服務運行?

更新:奇怪的是:停止服務器(與service thin stop),似乎進入config.ru文件並運行應用程序(所以它的工作,直到stop命令超時和殺死進程)。瘦身時會發生什麼,可能會導致這種行爲?

有問題的代碼

class Server < Sinatra::Base 
# Webserver code removed 
end 

module Handler 
    def receive_data data 
    $received_data_changed = 1 
    $received_data = data 
    end 
end 

$sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler) 

工作守則

EventMachine.run do 
    class Server < Sinatra::Base 
    # Webserver code removed 
    end 

    module Handler 
    def receive_data data 
     $received_data_changed = 1 
     $received_data = data 
    end 
    end 
    $sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler) 
    Server.run!(:port => 4567) 
end 

初始化腳本摘錄

DAEMON=/usr/local/bin/thin 
SCRIPT_NAME=/etc/init.d/thin 
CONFIG_PATH=/etc/thin 

# Exit if the package is not installed 
[ -x "$DAEMON" ] || exit 0 

case "$1" in 
    start) 
    $DAEMON start --all $CONFIG_PATH 
    ;; 

精簡配置

--- 
chdir: /var/www 
environment: development 
timeout: 30 
log: log/thin.log 
pid: tmp/pids/thin.pid 
max_conns: 1024 
max_persistent_conns: 512 
require: [] 

wait: 30 
servers: 1 
socket: /tmp/thin.server.sock 
daemonize: true 

回答

0

我最終做的是刪除EventMachine.run do ... end,並簡單地將套接字連接包含在EM.next_tick{ $sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler) }中。

可以發誓我曾試過這一次...但現在它的作品。

編輯:next_tick的想法來自here

0

Thin建立在EventMachine之上。我認爲你應該使用EventMachine來爲你的應用程序提供服務。嘗試進一步調試Thin不會守護進程。 (你使用什麼版本?)。您也可以在另一個端口(如4000)上運行Thin,然後將其作爲上游服務器傳遞到您的代理轉發服務器,如果這是您想要實現的。

+0

看到我上面的修改。 'EventMachine.run do'肯定會阻止運行該應用程序的調用。我的主要問題是我想在UNIX套接字上運行Thin,而不是端口,我似乎無法使用App.run! –

相關問題