配置逻辑

自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迭代由空格隔开的字符串。以下三个代码块是等价的。

  1. [uwsgi]
  2. master = true
  3. ; iterate over a list of ports
  4. for = 3031 3032 3033 3034 3035
  5. socket = 127.0.0.1:%(_)
  6. endfor =
  7. module = helloworld
  1. <uwsgi>
  2. <master/>
  3. <for>3031 3032 3033 3034 3035</for>
  4. <socket>127.0.0.1:%(_)</socket>
  5. <endfor/>
  6. <module>helloworld</module>
  7. </uwsgi>
  1. uwsgi --for="3031 3032 3033 3034 3035" --socket="127.0.0.1:%(_)" --endfor --module helloworld

注意,for循环是分别被应用到块中的每一行的,而不是应用到块整体上。例如,这个:

  1. [uwsgi]
  2. for = a b c
  3. socket = /var/run/%(_).socket
  4. http-socket = /var/run/%(_)-http.socket
  5. endfor =

展开为:

  1. [uwsgi]
  2. socket = /var/run/a.socket
  3. socket = /var/run/b.socket
  4. socket = /var/run/c.socket
  5. http-socket = /var/run/a-http.socket
  6. http-socket = /var/run/b-http.socket
  7. http-socket = /var/run/c-http.socket

if-env

检查是否定义了一个环境变量,将其值放在上下文占位符中。

  1. [uwsgi]
  2. if-env = PATH
  3. print = Your path is %(_)
  4. check-static = /var/www
  5. endif =
  6. socket = :3031

if-exists

检查一个文件或目录是否存在。设置上下文占位符为找到的文件名。

  1. [uwsgi]
  2. http = :9090
  3. ; redirect all requests if a file exists
  4. if-exists = /tmp/maintenance.txt
  5. route = .* redirect:/offline
  6. endif =

注解

上述例子使用 uWSGI内部路由.

if-file

检查给定的路径是否存在,是否为一个常规的文件。设置上下文占位符为找到的文件名。

  1. <uwsgi>
  2. <plugins>python</plugins>
  3. <http-socket>:8080</http-socket>
  4. <if-file>settings.py</if-file>
  5. <module>django.core.handlers.wsgi:WSGIHandler()</module>
  6. <endif/>
  7. </uwsgi>

if-dir

检查给定的路径是否存在,是否为一个目录。设置上下文占位符为找到的文件名。

  1. uwsgi:
  2. socket: 4040
  3. processes: 2
  4. if-dir: config.ru
  5. rack: %(_)
  6. endif:

if-opt

检查是否设置了给定选项,或者给定选项是否具有一个给定的值。设置上下文占位符为选项引用的值。

检查是否设置了一个选项,仅需将选项名传递给 if-opt

  1. uwsgi:
  2. cheaper: 3
  3. if-opt: cheaper
  4. print: Running in cheaper mode, with initially %(_) processes
  5. endif:

要检查给定选项是否具有一个给定的值,则将option-name=value 传递给 if-opt

  1. uwsgi:
  2. # Set busyness parameters if it was chosen
  3. if-opt: cheaper-algo=busyness
  4. cheaper-busyness-max: 25
  5. cheaper-busyness-min: 10
  6. endif:

由于uWSGI解析其配置文件的方式,你只能使用uWSGI之前解析到的选项。特别是,这意味着:

  • 只考虑在 if-opt 选项之上设置的选项。这包含了任何由前面 include (或者特定类型的包含,例如 ini) 选项设置的任何选项,但不要包含由前面 inherit 选项设置的选项)。

  • if-opt 是在展开魔术变量之后,展开占位符和其他变量之前进行处理的。因此,如果你使用 if-opt 来比较一个选项的值,那么只使用魔术变量来核对该值和配置文件中一致。

如果你在 if-opt 块内使用上下文占位符 %(_) ,那么应该没问题:任何占位符稍后将会被展开。

  • 如果多次指定一个选项,那么 if-opt 只能看到第一个的值。

  • 只会看到显式设置的值,而不会看到隐式默认值。

参见

uWSGI是如何解析配置文件的