所以我正在试验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解释器?
发布于 2012-07-26 09:06:27
我在浏览了一下uwsgi的文档后自己找到了答案。
引用,https://uwsgi-docs.readthedocs.io/en/latest/ConfigLogic.html,我们可以通过使用环境变量来指定配置逻辑和动态计算路径,而在python中。
因此,假设我目前处于myproject
虚拟环境中,我的.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文件中动态计算的。
发布于 2015-09-02 21:42:26
我不确定用不同的配置文件运行开发和生产版本是一种很好的做法--这通常是一种解决“奇怪”问题的方法,因为开发版本中没有出现这些问题(因为不同的文件权限或其他原因)。更好的方法是像make install
这样做,并且总是使用类似于生产的配置。或者,你可以把你的源代码链接到你的主页中的项目目录中去编辑它们。但是,您的配置也是独一无二的。
发布于 2017-04-24 16:41:37
在卡尔文给出的答案的基础上,使用“@”魔法可以在动态配置方面具有更大的灵活性。
例如,@(exec://...)
可以用于计算bash命令。在我的例子中,它允许我定义:realpath = @(exec://bash -c 'dirname `readlink -f %p`')
,这是我一直在寻找的,因为我已经从另一个目录中符号链接了这个配置。
https://serverfault.com/questions/411361
复制相似问题