Назад | Перейти на главную страницу

Конфигурация uwsgi.ini для приложений Python

Так что я экспериментирую с uWSGI, и он мне очень нравится.

Однако у меня есть вопрос относительно использования его файла .ini.

Можно ли динамически вычислять значения для его параметра конфигурации .ini?

Например, для значения "chdir" в моем файле "uwsgi.ini" у меня есть

[uwsgi]
socket=127.0.0.1:3034
chdir=/Users/calvin/work/myproject
virtualenv=/Users/calvin/.virtualenvs/myproject
module=django.core.handlers.wsgi:WSGIHandler()
env= DJANGO_SETTINGS_MODULE=myproject.settings
master=True
pidfile=/tmp/myproject-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/myproject.log

Довольно сложно писать 3 отдельных файла .ini для моей «локальной машины», моего сервера «разработки / подготовки» и моего «производственного сервера». Не говоря уже о том, что локальная машина коллеги chdir значение будет совершенно другим.

Я пробовал использовать import os и os.join.path вычислить chdir значение динамически, но это не работает, чего и следовало ожидать, поскольку uwsgi не имеет интерпретатора python?

Я сам нашел ответ, немного покопавшись в документации uwsgi.

Ссылка, https://uwsgi-docs.readthedocs.io/en/latest/ConfigLogic.html, мы можем указать логику конфигурации и динамически вычислять пути, используя переменные среды в python virtualenv.

Предполагая, что я сейчас нахожусь в своем myproject virtualenv, моя конфигурация .ini автоматически вычислит мои пути для chdir и virtualenv Варианты конфигурации .ini наподобие этого:

[uwsgi]

if-env = PROJECT_HOME
print = Your path is %(_)/myproject
chdir = %(_)/myproject
endif =

if-env = VIRTUAL_ENV
print = Your virtualenv is %(_)
virtualenv = %(_)
endif = 

socket=127.0.0.1:3034
module=django.core.handlers.wsgi:WSGIHandler()
env= DJANGO_SETTINGS_MODULE=bbox.settings
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/yourproject.log

Оператор печати, конечно, не обязателен, но это дает двоичному файлу uwsgi значения для chdir и virtualenv что он ожидает.

Что-то вроде этого:

calvin$ uwsgi --ini myproject/uwsgi.ini 
[uWSGI] getting INI configuration from myproject/uwsgi.ini
Your path is /Users/calvin/work/myproject
Your virtualenv is /Users/calvin/.virtualenvs/myproject
*** Starting uWSGI 1.2.4 (64bit) on [Thu Jul 26 17:00:04 2012] ***
compiled with version: 4.2.1 Compatible Apple Clang 3.1 (tags/Apple/clang-318.0.61) on 25 July 2012 20:06:56
detected number of CPU cores: 8

Операторы печати, конечно же, не нужны в вашем окончательном файле .ini. Я просто помещаю их туда, чтобы распечатать необходимую информацию, подтверждающую, что мои пути динамически вычисляются в файле .ini.

Основываясь на ответе Кальвина, с использованием магия можно иметь больше гибкости в отношении динамических конфигураций.

В @(exec://...) может быть полезно, например, для оценки команд bash. В моем случае это позволило мне определить: realpath = @(exec://bash -c 'dirname `readlink -f %p`') Который я искал, так как сделал символическую ссылку на эту конфигурацию из другого каталога.

Я не уверен, что это хорошая практика - запускать версии для разработки и производства с разными файлами конфигурации - обычно это способ «странных» проблем, которые не появляются в версии для разработчиков (из-за разных прав доступа к файлам или чего-то еще). Гораздо лучше делать что-л. make install и всегда работать с производственной конфигурацией. Или вы можете просто связать свои источники с каталогом проекта в вашем домашнем каталоге, чтобы редактировать их на месте. Но опять же, ваша конфигурация уникальна.