2015-11-21 2 views
4

Я пытаюсь настроить Gunicorn на использование сокета Unix, но я не могу найти никакой документации о том, как эти сокеты создаются или как их устранять.Gunicorn - Откуда берутся разъемы Unix?

Я настраиваю приложение Django, и я могу успешно запустить на http, указав порт. Однако, когда я пытаюсь использовать Unix сокет:

gunicorn myapp.wsgi:application --bind=unix:/appuser/myapp/gunicorn.sock 

Он возвращается с:

[2015-11-21 09:34:21 +0000] [24380] [INFO] Starting gunicorn 19.3.0 
[2015-11-21 09:34:21 +0000] [24380] [ERROR] Retrying in 1 second. 
[2015-11-21 09:34:22 +0000] [24380] [ERROR] Retrying in 1 second. 
[2015-11-21 09:34:23 +0000] [24380] [ERROR] Retrying in 1 second. 
[2015-11-21 09:34:24 +0000] [24380] [ERROR] Retrying in 1 second. 
[2015-11-21 09:34:25 +0000] [24380] [ERROR] Retrying in 1 second. 
[2015-11-21 09:34:26 +0000] [24380] [ERROR] Can't connect to /appuser/myapp/gunicorn.sock 

gunicorn.sock находится именно там, где она должна быть, но файл пуст. Я не могу найти ни одного журнала. Я использую Nginx на сервере AWS и настроил все соответствующие конфигурации в соответствии с the docs. Я могу опубликовать свою конфигурацию, если она имеет какое-либо отношение к этому.

Как устранить эту проблему?

ответ

4

Вы используете сокеты файловой системы UNIX. Это не обычные файлы, поэтому они могут выглядеть пустыми при проверке с помощью cat.

Особенностью файловых систем UNIX является то, что они не должны существуют до того, как приложение попытается связать путь. Перед связыванием не должно быть ни каталога, ни файла, ни сокета на этом пути. Вы должны удалить сокет; при связывании сокет будет создан автоматически. Затем, когда приложение завершается, удаляется приложением (или сторожевым таймером), прежде чем кто-либо еще (включая приложение повторного запуска) может снова привязываться к этому пути.

Пример:

>>> import socket 
>>> s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0) 
>>> s.bind("foo.sock") 
# now foo.sock exists 
>>> s.close() 
# foo.sock still exists 
>>> s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0) 
>>> s.bind("foo.sock") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 98] Address already in use 
# boom, the socket must be unlinked manually 
>>> import os 
>>> os.unlink("foo.sock") 
>>> s.bind("foo.sock") 
>>> s.close() 

Чтобы избежать этих проблем, я хотел бы использовать Nginx с HTTP на основе обратного прокси-сервера к приложению и привязать приложение к 127.0.0.1:someport.

+0

Спасибо за отличное объяснение! Я удалил существующий файл sock, но проблема не устранена. Я могу связать его так, как вы предлагаете, но затем мне нужно добавить порт в конец моего URL-адреса, чтобы увидеть мой сайт. Должен ли я попытаться исправить это и вообще не использовать гнездо Unix? –

+0

@AdamStarrh Если вы настроили NGINX, как в связанной документации, я бы предположил, что он «просто работает», кроме проблемы сокета. Какой номер порта вам нужно добавить? И я предполагаю, что вы подключаетесь через NGINX к вашему приложению, это правильно? (т. е. вы указываете свой веб-браузер или что-то еще на сервер NGINX, который затем перенаправляет запрос в ваше приложение) –

+0

Да, Nginx - это мой обратный прокси. Он настроен так же, как и документация. Мне нужно добавить порт 8000 в url для отображения сайта. Я работаю над тем, как преобразовать настройки обратно в TCP, чтобы убедиться, что это решает проблему. –