Мучаясь с настройкой связки uWSGI + nginx, я столкнулся с тем, что я не имею понятия о каком файле сокета говорится в документации uWSGI.

Немного погуглив, я наткнулся на статью по установке сервера MySQL, в которой указывается как именно создаётся этот загадочный [filename].sock.

Оказалось, что это ничто иное, как  именованный канал.

Вкратце, именованный канал позволяет взаимодействовать между двумя программами (процессами). Даже в том случае, если эти программы изначально не предназначены для взаимодействия с чем-либо. Создаётся канал, которому задаётся некое имя. Затем, с помощью указания имени этого канала, можно отправлять какие-либо данные в процесс, который скрыт за этим именем.

Подробнее о них можно почитать, например, здесь.

Так вот, создаётся он очень просто. Достаточно лишь воспользоваться командой mknod, либо mkfifo.

В Wiki есть отличный и показательный пример:

mkfifo pipe
gzip -9 -c < pipe > out

В данном случае, создастся канал с именем pipe и всё, что в него отправится, будет проходить через gzip и сжиматься им.

В случае с uWSGI, насколько я понял, он используется так:

uWSGI открывает данный именованный канал, который сохранен в виде файла и начинает «слушать» его. nginx же, в свою очередь, открывает этот же канал (напомню, что всё указывается в конфигах) и отправляет туда указанные проксированные данные.

То есть достаточно создать канал:

mkfifo wsgi.sock

Затем прописать его в конфиге uWSGI:

...

socket          = /полный/путь/wsgi.sock
...

И использовать его в конфиге хоста nginx:

...

server unix:///полный/путь/wsgi.sock;
...

P.S.: Данная заметка предназначена для таких же новичков в Linux, как и я. Так что, профессионалы, сильно не ругайте меня за неправильное использование терминов или недопонимание работы этих каналов Smile