Конфигурация 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?

3 ответа

Решение

Я сам нашел ответ, немного покопавшись в документах 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

Конечно, оператор print является необязательным, но это дает двоичному файлу 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`') Который я искал, так как я сделал ссылку на эту конфигурацию из другого каталога.

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

Другие вопросы по тегам