Как я могу настроить 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/
Другие вопросы по тегам