如何在运行Thin作为服务时使用EventMachine.connect_unix_domain
(使用下面的init脚本(摘录)和配置)。下面的代码是问题(我得到eventmachine not initialized: evma_connect_to_unix_server
错误)。第二个代码示例有效,但不允许我守护瘦(我不认为)。 Thin是否还没有正在运行的EventMachine实例?
更新:奇怪的是:停止服务器(使用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 :(得分:0)
Thin建立在EventMachine之上。我认为你应该使用EventMachine来提供你的应用程序。尝试进一步调试Thin不会守护进程。 (你用的是哪个版本?)。此外,您可以在另一个端口(如4000)上运行Thin,然后将其作为上游服务器传递到您的代理转发服务器,如果这是您想要实现的目的。
答案 1 :(得分:0)
我最终做的是删除EventMachine.run do ... end
并简单地将套接字连接封装在EM.next_tick{ $sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler) }
中。
可能发誓我曾尝试过一次......但它现在有效。
编辑:next_tick
的提示来自here。