How uWSGI parses config files
Until uWSGI 1.1 the parsing order has not been ‘stable’ or ‘reliable’.
Starting from uWSGI 1.1 (thanks to its new options subsystem) we have a general rule: top-bottom and expand asap.
Top-bottom means options are internally ordered as they are parsed, while “expand asap” means to inject the options of a requested config file, interrupting the currently parsed one:
Note that the inherit
option behaves differently from the other include options: It is expanded after variable expansion, so any environment variables, external files and placeholders are not expanded. Magic variables (e.g. %n
) are expanded normally.
file1.ini (the one requested from the command line)
- [uwsgi]
- socket = :3031
- ini = file2.ini
- socket = :3032
- chdir = /var/www
file2.ini
- [uwsgi]
- master = true
- memory-report = true
- processes = 4
internally will be assembled in:
- [uwsgi]
- socket = :3031
- ini = file2.ini
- master = true
- memory-report = true
- processes = 4
- socket = :3032
- chdir = /var/www
A more complex example:
file1.ini (the one requested from the command line)
- [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>
will result in:
- [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
Expanding variables/placeholders
After the internal config tree is assembled, variables and placeholder substitution will be applied.
The first step is substituting all of the $(VALUE) occurrences with the value of the environment variable VALUE.
- [uwsgi]
- foobar = $(PATH)
foobar value will be the content of shell’s PATH variable
The second step will expand text files embraced in @(FILENAME)
- [uwsgi]
- nodename = @(/etc/hostname)
nodename value will be the content of /etc/hostname
The last step is placeholder substitution. A placeholder is a reference to another option:
- [uwsgi]
- socket = :3031
- foobar = %(socket)
the content of foobar will be mapped to the content of socket.
A note on magic variables
Config files, support another form of variables, called ‘magic’ variables. As they refer to the config file itself, they will be parsed asap:
- [uwsgi]
- my_config_file = %p
The content of my_config_file will be set to %p value (the current file’s absolute path) as soon as it is parsed. That means %p (or whatever magic vars you need) will be always be consistent in the currently parsing config file.