配置逻辑¶
自1.1起,可以使用某些逻辑构建。
目前支持以下语句:
for
..endfor
if-dir
/if-not-dir
if-env
/if-not-env
if-exists
/if-not-exists
if-file
/if-not-file
if-opt
/if-not-opt
if-reload
/if-not-reload
—— 未公开
以上每个语句都导出了一个上下文值,你可以通过特殊的占位符 %(_)
来访问它们。例如,”for”语句设置 %(_)
为当前的迭代值。
警告
不支持递归逻辑,它会导致uWSGI即刻退出。
for¶
for迭代由空格隔开的字符串。以下三个代码块是等价的。
[uwsgi]
master = true
; iterate over a list of ports
for = 3031 3032 3033 3034 3035
socket = 127.0.0.1:%(_)
endfor =
module = helloworld
<uwsgi>
<master/>
<for>3031 3032 3033 3034 3035</for>
<socket>127.0.0.1:%(_)</socket>
<endfor/>
<module>helloworld</module>
</uwsgi>
uwsgi --for="3031 3032 3033 3034 3035" --socket="127.0.0.1:%(_)" --endfor --module helloworld
注意,for循环是分别被应用到块中的每一行的,而不是应用到块整体上。例如,这个:
[uwsgi]
for = a b c
socket = /var/run/%(_).socket
http-socket = /var/run/%(_)-http.socket
endfor =
展开为:
[uwsgi]
socket = /var/run/a.socket
socket = /var/run/b.socket
socket = /var/run/c.socket
http-socket = /var/run/a-http.socket
http-socket = /var/run/b-http.socket
http-socket = /var/run/c-http.socket
if-env¶
检查是否定义了一个环境变量,将其值放在上下文占位符中。
[uwsgi]
if-env = PATH
print = Your path is %(_)
check-static = /var/www
endif =
socket = :3031
if-exists¶
检查一个文件或目录是否存在。设置上下文占位符为找到的文件名。
[uwsgi]
http = :9090
; redirect all requests if a file exists
if-exists = /tmp/maintenance.txt
route = .* redirect:/offline
endif =
注解
上述例子使用 uWSGI内部路由.
if-file¶
检查给定的路径是否存在,是否为一个常规的文件。设置上下文占位符为找到的文件名。
<uwsgi>
<plugins>python</plugins>
<http-socket>:8080</http-socket>
<if-file>settings.py</if-file>
<module>django.core.handlers.wsgi:WSGIHandler()</module>
<endif/>
</uwsgi>
if-dir¶
检查给定的路径是否存在,是否为一个目录。设置上下文占位符为找到的文件名。
uwsgi:
socket: 4040
processes: 2
if-dir: config.ru
rack: %(_)
endif:
if-opt¶
检查是否设置了给定选项,或者给定选项是否具有一个给定的值。设置上下文占位符为选项引用的值。
检查是否设置了一个选项,仅需将选项名传递给 if-opt
。
uwsgi:
cheaper: 3
if-opt: cheaper
print: Running in cheaper mode, with initially %(_) processes
endif:
要检查给定选项是否具有一个给定的值,则将
option-name=value
传递给 if-opt
。
uwsgi:
# Set busyness parameters if it was chosen
if-opt: cheaper-algo=busyness
cheaper-busyness-max: 25
cheaper-busyness-min: 10
endif:
由于uWSGI解析其配置文件的方式,你只能使用uWSGI之前解析到的选项。特别是,这意味着:
只考虑在
if-opt
选项之上设置的选项。这包含了任何由前面include
(或者特定类型的包含,例如ini
) 选项设置的任何选项,但不要包含由前面inherit
选项设置的选项)。if-opt
是在展开魔术变量之后,展开占位符和其他变量之前进行处理的。因此,如果你使用if-opt
来比较一个选项的值,那么只使用魔术变量来核对该值和配置文件中一致。如果你在
if-opt
块内使用上下文占位符%(_)
,那么应该没问题:任何占位符稍后将会被展开。如果多次指定一个选项,那么
if-opt
只能看到第一个的值。只会看到显式设置的值,而不会看到隐式默认值。