Starting from 1.1 certain logic constructs are available.
The following statements are currently supported:
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
-- undocumented
Each of these statements exports a context value you can access with the
special placeholder %(_)
. For example, the "for" statement sets %(_)
to
the current iterated value.
Warning
Recursive logic is not supported and will cause uWSGI to promptly exit.
For iterates over space-separated strings. The following three code blocks are equivalent.
[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
Note that the for-loop is applied to each line inside the block separately, not to the block as a whole. For example, this:
[uwsgi]
for = a b c
socket = /var/run/%(_).socket
http-socket = /var/run/%(_)-http.socket
endfor =
is expanded to:
[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
Check if an environment variable is defined, putting its value in the context placeholder.
[uwsgi]
if-env = PATH
print = Your path is %(_)
check-static = /var/www
endif =
socket = :3031
Check for the existence of a file or directory. The context placeholder is set to the filename found.
[uwsgi]
http = :9090
; redirect all requests if a file exists
if-exists = /tmp/maintenance.txt
route = .* redirect:/offline
endif =
Note
The above example uses :doc:`InternalRouting`.
Check if the given path exists and is a regular file. The context placeholder is set to the filename found.
<uwsgi>
<plugins>python</plugins>
<http-socket>:8080</http-socket>
<if-file>settings.py</if-file>
<module>django.core.handlers.wsgi:WSGIHandler()</module>
<endif/>
</uwsgi>
Check if the given path exists and is a directory. The context placeholder is set to the filename found.
uwsgi:
socket: 4040
processes: 2
if-dir: config.ru
rack: %(_)
endif:
Check if the given option is set, or has a given value. The context placeholder is set to the value of the option reference.
To check if an option was set, pass just the option name to if-opt
.
uwsgi:
cheaper: 3
if-opt: cheaper
print: Running in cheaper mode, with initially %(_) processes
endif:
To check if an option was set to a specific value, pass
option-name=value
to if-opt
.
uwsgi:
# Set busyness parameters if it was chosen
if-opt: cheaper-algo=busyness
cheaper-busyness-max: 25
cheaper-busyness-min: 10
endif:
Due to the way uWSGI parses its configs, you can only refer to options that uWSGI has previously seen. In particular, this means:
Only options that are set above the
if-opt
option are taken into account. This includes any options set by previousinclude
(or type specific includes likeini
) options, but does not include options set by previousinherit
options).if-opt
is processed after expanding magic variables, but before expanding placeholders and other variables. So if you useif-opt
to compare the value of an option, check against the value as stated in the config file, with only the magic variables filled in.If you use the context placeholder
%(_)
inside theif-opt
block, you should be ok: any placeholders will later be expanded.If an option is specified multiple times, only the value of the first one will be seen by
if-opt
.Only explicitly set values will be seen, not implicit defaults.
.. seealso:: :doc:`ParsingOrder`