如何从 .yml 配置 thin 以使用 tcp 套接字?

How can I configure thin from .yml to use tcp sockets?

我这里有一个 RoR 应用程序,我正在使用瘦应用程序服务器。

它的配置在一个 .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 套接字进行监听?

我找到的文档以某种方式从未提及这种可能性,尽管间接引用表明这是可能的。

问题的原因是前端网络 (apache2) 不能很好地将 http 请求代理到 unix 路径。用nginx应该不会有问题。

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

socket: 127.0.0.1:3000

会起作用。但是,如果你使用多个瘦进程,你就会遇到问题。

(这很有可能,因为整个 ruby 是一个单线程的东西。考虑到 IO 等待时间,甚至可能有一个明显更高的进程数,因为你的 CPU核心)。

不知何故,瘦配置解释器的套接字地址解码器足够聪明,可以使用普通 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 命令会向您显示它们。您可以使用 addressport 选项强制进行 TCP 侦听:

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

所以你已经得到了正确的结果。

默认值为0.0.0.03000

由于 apache 只想通过其最常见的设置(ProxyPassProxyPassReverse 指令)代理到单个 tcp 端口,因此您还需要一些小技巧,一个负载平衡代理集群。相关配置片段:

<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/