Конфигурация 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
и всегда работать с производственной конфигурацией. Или вы можете просто связать свои источники с каталогом проекта в вашем домашнем каталоге, чтобы редактировать их на месте. Но опять же, ваша конфигурация уникальна.