Python 应用程序的 uwsgi.ini 配置

Python 应用程序的 uwsgi.ini 配置

所以我正在尝试 uWSGI,并且非常喜欢它。

我对其 .ini 文件的使用有一个疑问。

是否可以动态计算其 .ini 配置参数的值?

例如,对于我的“uwsgi.ini”文件中的“chdir”值,我有

[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 解释器?

答案1

在仔细查阅了 uwsgi 文档之后,我自己找到了答案。

参考,https://uwsgi-docs.readthedocs.io/en/latest/ConfigLogic.html,我们可以在 python virtualenv 中利用环境变量指定配置逻辑并动态计算路径。

因此,假设我当前处于myproject虚拟环境中,我的 .ini 配置将自动计算我的路径chdirvirtualenv.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 文件中动态计算的。

答案2

我不确定使用不同的配置文件运行开发版和生产版是否是一种好的做法 - 这通常是一种解决“奇怪”问题的方法,这些问题不会出现在开发版中(由于不同的文件权限或其他原因)。更好的方法是做类似的事情make install并始终使用类似于生产的配置。或者,您可能只是将您的源链接到主目录中的项目目录以就地编辑它们。但同样,您的配置是独一无二的。

答案3

基于加尔文给出的答案,使用魔术人们可以在动态配置方面拥有更多的灵活性。

例如,它@(exec://...)可以用于评估 bash 命令。在我的例子中,它允许我定义: realpath = @(exec://bash -c 'dirname `readlink -f %p`') 我正在寻找哪个,因为我已从另一个目录符号链接了此配置。

相关内容