uWSGI是如何解析配置文件的

直到uWSGI 1.1,解析顺序都是不“稳定”或者“可靠的”。

从uWSGI 1.1开始 (多亏了它新的选项子系统),我们有了一个一般的规则:从上到下,尽快扩展。

从上到下意味着选项根据它们解析的顺序内部派系,而“尽快扩展”表示注入一个请求的配置文件的选项,中断当前解析的配置文件:

注意, inherit 选项与其他包含选项不同:它是在变量扩展 之后 进行扩展的,因此,任何环境变量,外部文件和占位符并 被扩展。魔术变量 (例如 %n) 会被正常进行扩展。

file1.ini (从命令行请求的那个文件)

[uwsgi]
socket = :3031
ini = file2.ini
socket = :3032
chdir = /var/www

file2.ini

[uwsgi]
master = true
memory-report = true
processes = 4

内部将会被组装成:

[uwsgi]
socket = :3031
ini = file2.ini
master = true
memory-report = true
processes = 4
socket = :3032
chdir = /var/www

一个更复杂的例子:

file1.ini (从命令行请求的那个文件)

[uwsgi]
socket = :3031
ini = file2.ini
socket = :3032
chdir = /var/www

file2.ini

[uwsgi]
master = true
xml = file3.xml
memory-report = true
processes = 4

file3.xml

<uwsgi>
  <plugins>router_uwsgi</plugins>
  <route>^/foo uwsgi:127.0.0.1:4040,0,0</route>
</uwsgi>

结果将会是:

[uwsgi]
socket = :3031
ini = file2.ini
master = true
xml = file3.xml
plugins = router_uwsgi
route = ^/foo uwsgi:127.0.0.1:4040,0,0
memory-report = true
processes = 4
socket = :3032
chdir = /var/www

扩展变量/占位符

在组装了内部配置树之后,将会应用变量和占位符替换。

第一步是用环境变量的值VALUE来替换所有出现的 $(VALUE) 。

[uwsgi]
foobar = $(PATH)

foobar值将会是shell的PATH变量的内容

第二步将会扩展在 @(FILENAME) 中括起来的文本文件。

[uwsgi]
nodename = @(/etc/hostname)

nodename值将会是/etc/hostname的内容

最后一步是占位符替换。一个占位符是另一个选项的引用:

[uwsgi]
socket = :3031
foobar = %(socket)

foobar的内容将会被映射为socket的内容。

魔术变量说明

配置文件,支持另一种形式的变量,被称为“魔术”变量。当它们指向配置文件本身的时候,它们将会被尽快解析:

[uwsgi]
my_config_file = %p

my_config_file的内容一旦被解析,它将会被设置为%p的值 (当前文件的绝对路径)。这意味着%p (或者任何你需要的魔术变量)在当前解析的配置文件中将永远是一致的。