2017-07-19 66 views
0

我在这里有一个RoR应用程序,我正在使用瘦应用程序。如何从.yml配置使用tcp套接字的瘦?

其配置在.yml文件,所以:

--- 
pid: /srv/cica/tmp/pids/thin.pid 
group: cica 
wait: 30 
timeout: 30 
log: /srv/cica/log/thin.log 
max_conns: 1024 
require: [] 

environment: production 
max_persistent_conns: 512 
servers: 4 
daemonize: true 
user: cica 
socket: /srv/cica/tmp/thin.sock 
chdir: /srv/cica 

我怎样使用TCP套接字,而不是Unix套接字的听?

我发现的文档从来没有提到甚至可能性,尽管间接引用说这是可能的。

问题的原因是,前端Web(apache2)对于将http请求代理到unix路径的能力不强。这对nginx不会有任何问题。

回答

0

从理论上讲,你可以简单地使用IP:ADDR而不是套接字路径:

socket: 127.0.0.1:3000 

会工作。但是,如果您使用多个精简进程,则会遇到问题。考虑到IO等待时间,甚至可能会有更高的进程数量,因为CPU核心的数量也是可能的。)(这很可能是因为整个ruby是单线程的。

不知何故,瘦配置解释器的套接字地址解码器足够智能地使用普通IP地址,但它增加了IP而不是增加了其他套接字的端口。因此,你将有多个实例薄监听

# thin will listen on these addresses 
127.0.0.1:3000 
127.0.0.2:3000 
127.0.0.3:3000 
127.0.0.4:3000 

,而他们将在

# it would be okay, but not this happens 
127.0.0.1:3000 
127.0.0.1:3001 
127.0.0.1:3002 
127.0.0.1:3003 

在听这超现实的行为很可能不是你想要的。 (尽管如果你在所有的IP上都有活动接口,它可以工作。)

但是,这个ruby的东西有一个很好的特性,就是在它的命令行选项和配置文件选项之间有一个直接的分配。并且一个thin --help命令将显示给你。您可以强制执行TCP使用addressport选择听:

#socket: /srv/cica/tmp/thin.sock 
address: 127.0.0.1 
port: 3000 

所以,你会找到一些正确的结果。

默认值是0.0.0.03000

由于apache想要代理只有一个单一的TCP端口与其最常见的设置(ProxyPass,ProxyPassReverse指令),也需要一些小小的欺骗,负载平衡代理群集。相关的配置代码片段:

<Proxy balancer://cicas> 
    BalancerMember http://localhost:3000 disablereuse=On route=cica1 
    BalancerMember http://localhost:3001 disablereuse=On route=cica2 
    BalancerMember http://localhost:3002 disablereuse=On route=cica3 
    BalancerMember http://localhost:3003 disablereuse=On route=cica4 
    ProxySet lbmethod=byrequests 
</Proxy> 

ProxyPass/balancer://cicas/