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