Как я могу настроить thin из.yml для использования сокетов tcp?
У меня есть приложение 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.
1 ответ
Теоретически, вы можете просто использовать IP:ADDR вместо пути к сокету:
socket: 127.0.0.1:3000
буду работать. Но если вы используете несколько тонких процессов, у вас будут проблемы.
(Что весьма вероятно, потому что весь 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, это может сработать.)
Однако эта рубиновая вещь имеет приятную особенность, заключающуюся в прямом назначении между ее параметрами командной строки и параметрами файла конфигурации. И thin --help
Команда покажет их вам. Вы можете принудительно прослушивать TCP, используя address
а также port
опции:
#socket: /srv/cica/tmp/thin.sock
address: 127.0.0.1
port: 3000
Таким образом, вы получите уже правильный результат.
Значения по умолчанию 0.0.0.0
а также 3000
,
Как 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/