Bugfixes:
fixed mod_proxy_uwsgi for non-blocking mode
fixed master-fifo + cheaper
fixed leak on error in bind_to_unix
atexit hooks works in cheaped workers too
atexit hooks works in gevent mode too during shutdown
fixed carbon command line option value after reload
do not honour Emperor throttling on the first run
fixed Mono plugin
fixed peer name in corerouters
fixed stop signal for daemons
varios ssl/tls fixes in https/spdy router
fixed python3 –py-auto-reload-ignore
fixed modifiers in corerouters
support for yajl from homebrew (OSX)
psgi: Ensure that we call any DESTROY hooks on psgix.harakiri.commit
systemdlogger: fix compilation with -Werror=format-security
fixed unmasked websockets
perl fixed latent refcounting bug
New Features:
Improved PyPy support for Linux
Fastrouter post-buffering
Perl uwsgi::opt
–pull-header
active-workers signal target
httpdumb routing action
Note: this is the first version with disabled-by-default SSL3, if you need it, you can re-enable with --ssl-enable3 option
Bugfixes
fixed PHP SCRIPT_NAME usage when --php-app is in place
allow "appendn" hook without second argument
fix heap corruption in the Carbon plugin (credits: Nigel Heron)
fix getifaddrs() memory management
fixed tcsetattr() usage
fixed kevent usage of return value (credits: Adriano Di Luzio)
ensure PSGI response headers are in the right format
fixed reloading of attached daemons
fixed SSL/TLS shutdown
fixed mountpoint logic for paths not ending with / (credits: Adriano Di Luzio)
fixed Python3 support in spooler decorators (credits: Adriano Di Luzio)
New Features
RTSP and chunked input backports from 2.1 for the HTTP router
The --http-manage-rtsp and ``--http-chunked-input` have been backported from 2.1 allowing the HTTP router to detect RTSP and chunked requests automatically. This is useful for the upcoming https://github.com/unbit/uwsgi-realtime plugin.
--hook-post-fork
This custom hook allows you to call actions after each fork().
fallback to trollius for asyncio plugin
If you build the asyncio plugin for python2, a fallback to the trollius module will be tried.
This feature has gotten basically zero test coverage, so every report (bug or success alike) is welcome.
added sweep_on_full, clear_on_full and no_expire to --cache2
Three new options for --cache2 have been added for improving the caching expire strategies:
sweep_on_full will call a sweep (delete all of the expired items) as soon as the cache became full
clear_on_full will completely clear the cache as soon as it is full
no_expire forces the cache to not generate a cache sweeper thread, delegating items removal to the two previous options
backported wait-for-fs/mountpoints from 2.1
--wait-for-fs <path> suspend the uWSGI startup until a file/directory is available
--wait-for-file <path> suspend the uWSGI startup until a file is available
--wait-for-dir <path> suspend the uWSGI startup until a directory is available
--wait-for-mountpoint <path> suspend the uWSGI startup until a mountpoint is available
improved the offload api (backport from 2.1)
uWSGI 2.0.8 is compatible with the upcoming https://github.com/unbit/uwsgi-realtime plugin that allows the use of realtime features (like websockets or audio/video streaming) using the uWSGI offload engine + Redis publish/subscribe.
Allows building plugins from remote sources as embedded
The UWSGI_EMBED_PLUGINS environment variable has been extended to support remote plugins. As an example you can build a monolithic uwsgi binary with the Avahi and realtime plugins as:
UWSGI_EMBED_PLUGINS="avahi=https://github.com/20tab/uwsgi-avahi,realtime=https://github.com/unbit/uwsgi-realtime" make
Automatically manage HTTP_X_FORWARDED_PROTO
Albeit a new standard is available in the HTTP world for forwarded sessions (http://tools.ietf.org/html/rfc7239) this release adds support for the X-Forwarded-Proto header, automatically setting the request scheme accordingly.
uWSGI 2.0.7
===========
Changelog [20140905]
Bugfixes
********
- fixed counters in statsd plugin (Joshua C. Forest)
- fixed caching in php plugin (Andrew Bevitt)
- fixed management of system users starting with a number
- fixed request body readline using memmove instead of memcpy (Andrew Wason)
- ignore "user" namespace in setns (still a source of problems)
- fixed Python3 rpc bytes/string mess (result: we support both)
- do not destroy the Emperor on failed mount hooks
- fixed symbol lookup error in the Mono plugin on OS X (Ventero)
- fixed fastcgi and scgi protocols error when out of buffer happens
- fixed solaris/smartos I/O management
- fixed 2 memory leaks in the rpc subsystem (Riccardo Magliocchetti)
- fixed rados plugin PUT method (Martin Mlynář)
- fixed multiple python mountpoints with multiple threads in cow mode
- stats UNIX socket is now deleted by vacuum
- fixed off-by-one corruption in cache LRU mode
- force single-cpu build in cygwin (Guido Notari)
New Features and improvements
*****************************
allow calling the spooler from every cpython context
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
At Europython 2014, Ultrabug (a uWSGI contributor and packager) asked for the possibility to spool tasks directly from a greenlet.
Done.
store_delete cache2 option
^^^^^^^^^^^^^^^^^^^^^^^^^^
Author: goir
The store_delete flag of the --cache2 option, allows you to force the cache engine to automatically remove an invalid
backing store file.
file logger rotation
^^^^^^^^^^^^^^^^^^^^
Author: Riccardo Magliocchetti
The `file` logger has been extended to allow the use of rotation (the same system used by the non-pluggable --logto):
0324e5965c
vassals plugin hooks
^^^^^^^^^^^^^^^^^^^^
The plugin have has been extended with two new hooks: vassal and vassal_before_exec.
Both allows to customize a vassal soon after its process has been generated.
The first third-party plugin using it is the 'apparmor' one:
https://github.com/unbit/uwsgi-apparmor
allowing you to apply an apparmor profile to a vassal
Broodlord improvements
^^^^^^^^^^^^^^^^^^^^^^
The broodlord subsystem has been improved with a new option: --vassal-sos that automatically ask for reinforcement when all of the workers of an instance are busy.
In addition to this a sysadmin can now manually ask for reinforcement sending the 'B' commando to the master fifo of an instance.
Changelog [20140701]
Bugfixes
fixed a memory leak with subscription system
fixed shortcut for ssl-socket
fixed apache2 mod_proxy_uwsgi (it is now considered stable with all mpm engines)
fixed SCRIPT_NAME and PATH_TRANSLATED generation in php plugin
remove the old FIFO socket from the event queue when recreating it
New features
The new Rados plugins
The rados plugin has been improved and stabilized, and now it is considered usable in production.
Async modes and multithreading correctly works, and support for uploading objects (via PUT) and creating new pools (MKCOL) has been added.
Expect webdav support in uWSGI 2.1
Docs have been updated: http://uwsgi-docs.readthedocs.org/en/latest/Rados.html
-if-hostname
This is a configuration logic for including options only when the specified hostname matches:
[uwsgi]
if-hostname = node1.local
socket = /tmp/socket1.socket
endif =
if-hostname = node2.local
socket = /var/run/foo.socket
endif =
Apache2 mod_proxy_uwsgi stabilization
After literally years of bug reports, and corrupted data, the mod_proxy_uwsgi is now stable, and on modern apache2 releases it supports unix sockets too.
Updated docs: http://uwsgi-docs.readthedocs.org/en/latest/Apache.html#mod-proxy-uwsgi
uwsgi[rsize] routing var
this routing var (meaningful only in the 'final' chain) exposes the response size of the request
the callint scheme
This scheme allows you to generate blob from functions exposed by your uWSGI instance:
[uwsgi]
uid = @(callint://get_my_uid)
gid = @(callint://get_my_gid)
-fastrouter-fallback-on-no-key
The corerouters fallback procedure requires a valid key (domain name) has been requested. This option forces the various routers to trigger the fallback procedure even if a key has not been found.
php 5.5 opcode caching via -php-sapi-name
For mysterious reasons the opcode caching of php5.5 is not enabled in the embed sapi. This option (set it to 'apache' if you want) allows you to fake the opcode caching engine forcing it to enable itself.
Improved chain-reloading
Thanks to Marko Tiikkaja the chain reloading procedure correctly works in cheaper modes and it is more verbose.
added 'chdir' keyval to -attach-daemon2
You can now set where attached daemons need to chdir()
Bugfixes
fixed support for repeated headers in lua plugin
fixed support for embedding config in OpenBSD and NetBSD
various fixes in the curl-based plugins
fixed milliseconds-based waits
fixed sharedarea poller
fixed stats server json escaper
fixed fastcgi parser and implemented eof management
improved fast on-demand mode
exclude avg_rt computation for static files
fixed variables support in uwsgi internal router
fixed websockets + keepalive ordering
disable SIGPIPE management in corutines-based loop-engines
fixed 64bit sharedarea management in 32bit systems
honour chmod/chown-socket in fd0 mode
hack for avoiding Safari iOS to make mess with keepalive
fixed log setup when both --logto and --log2
fixed mule_get_msg EAGAIN
signal_pidfile returns the right error code
fixed asyncio on OSX
New features
graceful reload of mule processes
SIGHUP is now sent to mules instead of directly killing them. You are free to trap/catch the signal in the code. If a mule does not die in the allowed "mercy time" (--mule-reload-mercy, default 60 seconds), SIGKILL will be sent.
return routing action
The new action will allow users to write simplified "break" clause.
For example, "return:403" is equivalent to "break:403 Forbidden", with response body "Forbidden".
The response body is quite useful for telling end users what goes wrong.
--emperor-no-blacklist
this new option, completely disables the blacklisting Emperor subsystem
Icecast2 protocol helpers
One of the upcoming unbit.com projects is a uWSGI based audio/video streaming server.
The plugin (should be released during europython 2014) already supports the Icecast2 protocol.
A bunch of patches have been added to the http router to support the icecast2 protocol.
For example the --http-manage-source option allows the HTTP router to honour SOURCE method requests, automatically placing them in raw mode.
--metrics-no-cores, --stats-no-cores, --stats-no-metrics
When you have hundreds (or thousands) of async cores, exposing metrics of them could be really slow.
Three new options have been added allowing you to disable the generation of core-related metrics and (eventually) their usage in the stats server.
sharedarea improvements
The sharedarea api continues to improve. Latest patches include support for mmapping device directly from the command line.
A funny way for testing it, is mapping the raspberrypi BCM2835 memory, the following example allows you to read the rpi system timer
uwsgi --sharedarea file=/dev/mem,offset=0x20003000,size=4096 ...
now you can read the 64bit value from the first (zero-based) sharedarea:
# read 64bit from 0x20003004
timer = uwsgi.sharedarea_read64(0, 0x04)
obviously, pay attention when accessing rpi memory, an error could crash the whole system !!!
UWSGI_GO_CHEAP_CODE
This exit code (15) can be raised by a worker to tell the master to not respawn it
PROXY1 support for the http router
The option --http-enable-proxy-protocol allows the HTTP router to understand PROXY1 protocol requests (like the ones made by haproxy or amazon elb)
reset_after_push for metrics
This metric attribute ensure that the matric value is reset to 0 (or its hardcoded initial_value) evry time the metric is pushed to some external system (like carbon, or statsd)
setremoteaddr
This routing action allows you to completely override the REMOTE_ADDR detected by protocol handlers:
[uwsgi]
; treat all requests as local
route-run = setremoteaddr:127.0.0.1
the resolve option
There are uWSGI options (or plugins) that do not automatically resolves dns name to ip addresses. This option allows you to map a placeholder to the dns resolution of a string:
[uwsgi]
; place the dns resolution of 'example.com' in the 'myserver' placeholder
resolve = myserver=example.com
subscribe2 = server=%(myserver),key=foobar
uWSGI 2.0.4
Bugfixes
fixed "cmime" routing var (Steve Stagg)
allow duplicate headers in http parsers
faster on_demand Emperor management
fixed UWSGI_ADDITIONAL_SOURCES build option
merge duplicated headers when SPDY is enabled
fixed segfault for unnamed loggers
-need-app works in lazy-apps mode
fixed fatal hooks management
New features
The experimental asyncio loop engine (CPython >= 3.4)
asyncio (also known as 'tulip') is the new infrastructure for writing non-blocking/async/callback-based code with Python 3.
This plugin (experimental) allows you to use asyncio as the uWSGI loop engine
Docs: http://uwsgi-docs.readthedocs.org/en/latest/asyncio.html
httprouter advanced timeout management
The http router got 2 new specific timeout:
-http-headers-timeout <n> ; defines the timeout while waiting for http headers
-http-connect-timeout <n> ; defines the timeout when connecting to backend instances
they should help the sysadmin in improving security and availability
allow disabling cache warnings in -cache2
the 'ignore_full' keyval option has beed added to cache2. This will disable warnings when a cache is full
purge LRU cache feature by Yu Zhao (getcwd)
This new mode allows you to configure a cache to automatically expires least recently used (LRU) items when it is full.
Just add purge_lru=1 to your cache2 directive
support embedded config on FreeBSD
You can now embed config on FreeBSD systems:
http://uwsgi-docs.readthedocs.org/en/latest/Embed.html#step-2-embedding-the-config-file
rpc hook
Two new hooks have been added:
'rpc' -> call the specified rpc function (fails on error)
'rpcretry' -> call the specified rpc function (retry on error)
setmodifier1 and setmodifier2 routing actions
having to load the 'uwsgi' routing plugin just for setting modifiers was really annoying. This two routing actions (embedded in the core) allows you to dinamically set modifiers.
no_headers option for static router
keyval based static routing action can now avoid to rewrite response headers (useful for X-Sendfile), just add no_headers=1 to your keyval options.
uWSGI 2.0.3
Bugfixes
fixed spooler 'at' key usage
fixed a memory and fd leak with on-demand Emperor sokets
on __APPLE__ use LOG_NOTICE for syslog plugin
fixed mongrel2 support
hack for avoiding libmongoclient to crash on broken cursor
log alarm is now a uwsgi_log_verbose() wrapper
fixed tuntap router memory corruption
Set ECDHE curve independently from DHE parameters (Hynek Schlawack)
do not wait for a whole Emperor cycle before checking for each waitpid
fix a regression with caller() not indicating the starting *.psgi program (Ævar Arnfjörð Bjarmason)
New features
Emperor SIGWINCH and SIGURG
The Emperor now responds to two new signals:
SIGWINCH: force an emperor rescan of vassals
SIGURG: cleanup the Emperor states (for now it only clears its blacklist)
Building plugins on-the-fly from git repositories
You can now build plugins stored on git servers:
uwsgi --build-plugin https://github.com/unbit/uwsgi-bonjour
or
UWSGI_EMBED_PLUGINS="bonjour=https://github.com/unbit/uwsgi-bonjour" pip install uwsgi
uwsgi.add_var(key, value)
You can now set request variables direcly from your app, for better integration with the internal routing subsystem
my $app = sub {
uwsgi::add_var("newvar","newvalue");
return [200, ['Content-Type' => 'text/html'], ["Hello"]];
}
uwsgi --http-socket :9090 --psgi hello.pl --response-route-run "log:\${newvar}"
add_var has been implemented in the CPython and Perl plugins
'disableheaders' routing action
This new action disables the sending of response headers, independently by the current request state
Smarter Emperor on bad conditions
Now the Emperor completely destroys internal vassal-related structures when it is impossible to correctly kill a broken vassal (both for inconsistent Emperor state or for internal system problems)
Bugfixes
* fixed python3 support on older compilers/libc
* allow starting in spooler-only mode
* fixed cache bitmap support and added test suite (credits: Danila Shtan)
* fixed ftime log var
* added async remote signal management
* fixed end-for and end-if
* fixed loop in internal-routing response chain
* fixed pypy execute_source usage
* logpipe: Don\u2019t setsid() twice (credits: INADA Naoki)
New features and improvements
CGI plugin
The plugin has been improved to support streaming.
In addition to this the long-awaited async support is finally ready. Now you can
have CGI concurrency without spawning a gazillion of expensive threads/processes
Check: Running CGI scripts on uWSGI
PSGI loading improvements
The PSGI loader now tries to use Plack::Util::load_psgi() function instead of
simple eval. This addresses various inconsistences in the environment (like the
double parsing/compilation/execution of psgi scripts).
If the Plack module is not available, a simple do-based code is used (very
similar to load_psgi)
(http://uwsgi-docs.readthedocs.org/en/latest/Changelog-2.0.1.html?highlight=changelog)
Bugfixes and improvements
* due to a wrong prototype declaration, building uWSGI without SSL resulted in
a compilation bug. The issue has been fixed.
* a race condition preventing usage of a massive number of threads in the PyPy
plugin has been fixed
* check for heartbeat status only if heartbeat subsystem has been enabled
* improved heartbeat code to support various corner cases
* improved psgi.input to support offset in read()
* fixed (and simplified) perl stacktrace usage
* fixed sni secured subscription
* CGI plugin does not require anymore that Status header is the first one
(Andjelko Horvat)
* fixed CPython mule_msg_get timeout parsing
* allows embedding of config files via absolute paths
* fixed symcall rpc
* fixed a memory leak in CPython spooler api (xiaost)
* The -no-orphans hardening has been brought back (currently Linux-only)
* improved dotsplit router mode to reduce DOS risk
* sub-Emperor are now loyal by default
* fixed non-shared ruby 1.8.7 support
* fixed harakiri CPython tracebacker
* request vars are now correctly exposed by the stats server
* support log-master for logfile-chown
* improved legion reload
* fixed tuntap netmask
* fixed busyness plugin without metrics subsystem
New features
* uWSGI 2.0 is a LTS branch, so do not expect too much new features. 2.0.1 is
the first maintainance release, so you still get a bunch of them (mainly
features not complete in 2.0)
* Perl native Spooler support
* -alarm-backlog
* -close-on-exec2
* simple notifications subsystem
* pid namespace for daemons (Linux only)
* Resubscriptions
* filesystem monitor api
* support for yajl 1.0
* for-readline
* %i and %j magic vars
* -inject-before and -inject-after
* -http-server-name-as-http-host
* better Emperor's Ragnarok (shutdown procedure)
* PyPy paste support
Changes:
uWSGI 2.0
Changelog [20131230] Important changes
Dynamic options have been definitely removed as well as the
broken_plugins directory Bugfixes and improvements
improved log rotation do not rely on unix signals to print
request status during harakiri added magic vars for uid and
gid various Lua fixes a tons of coverity-governed bugfixes made
by Riccardo Magliocchetti
New features --attach-daemon2
this is a keyval based option for configuring external daemons.
Updated docs are: :doc:`AttachingDaemons` Linux setns() support
One of the biggest improvements in uWSGI 1.9-2.0 has been the total
support for Linux namespaces.
This last patch adds support for the setns() syscall.
This syscall allows a process to "attach" to a running namespace.
uWSGI instances can exposes their namespaces file descriptors
(basically they are the files in /proc/self/ns) via a unix socket.
External instances connects to that unix socket and automatically
enters the mapped namespace.
to spawn an instance in "namespace server mode", you use the
--setns-socket <addr> option
uwsgi --setns-socket /var/run/ns.socket --unshare net,ipc,uts ...
to attach you simply use --setns <addr>
uwsgi --setns /var/run/ns.socket ...
Updated docs: :doc:`Namespaces` "private" hooks
When uWSGI runs your hooks, it verbosely print the whole hook action
line. This could be a security problem in some scenario (for example
when you run initial phases as root user but allows unprivileged
access to logs).
Prefixing your action with a '!' will suppress full logging:
[uwsgi] hook-asap = !exec:my_secret_command
Support for yajl library (JSON parser)
Til now uWSGI only supported jansson as the json parser required
for managing .js config files.
You can now use the yajl library (available in centos) as alternative
JSON parser (will be automatically detected) Perl spooler support
The perl/PSGI plugin can now be used as a spooler server:
uwsgi::spooler(sub {
my $args = shift; print Dumper($args); return -2; });
The client part is still missing as we need to fix some internal
api problem.
Expect it in 2.0.1 ;) Gateways can drop privileges
Gateways (like http router, sslrouter, rawrouter, forkptyrouter
...) can now drop privileges independently by the master.
Currently only the http/https/spdy router exposes the new option
(--http-uid/--http-gid) Subscriptions-governed SNI contexts
The subscription subsystem now supports 3 additional keys (you can
set them with the --subscribe2 option):
sni_key
sni_cert
sni_ca
all of the takes a path to the relevant ssl files.
-wip for the newest supported version. Partial ChangeLog:
* 1.4.1
- fixed typos in corerouter plugins
- fixed offloading when the number of threads is higher than 1
- fixed static_maps for non-existent paths
- fixed uwsgi_connect() on modern Linux systems to reset the socket to blocking mode
* 1.4
- gevent improvements
- improved http/https router and fastrouter
- Go official support
- a new set of infos are exported to the stats system
- improved systemd support
- log filtering and routing
- improved tracebacker
- offload transfer for static files, and network transfers
- matheval support
- plugins can be written in Obj-C
- smart attach daemon
- added support for PEP 405 virtualenvs
- rawrouter with xclient support
- internal routing plugin for cache
* 1.3
- python tracebacker
- user-governed harakiri
- simplified external plugin development
- Linux namespace mountpoint improvements
- secured subscription system
- merged routers codebase (fastrouter, http, rawrouter)
- https support in the http router
- config report at the end of uWSGI build process
- improved subscription system (multicast and unix socket)
- custom options
- graceful reloads on shared sockets
- configurable log-master buffer size
- extreme-optimizations for the stats subsystem
- redislog and mongodblog plugins
- added python logger
- mongodb and postgres imperial monitors
- implemented psgix.logger and psgix.cleanup
- full rack spec compliance
- preliminary ipv6 support
- gevent graceful reloads
- support for multiple loggers and logformat
- lazy-apps to load apps after fork() but without changing reloading subsystem
- emperor heartbeat subsystem
- cheaper busyness plugin
- pluggable clock sources
- added router_rewrite and router_http plugins
- external spoolers
- support for section:// and fd:// loaders
- alarm subsystem (with curl and xmpp plugins)
Remove devel/py-ctypes (only needed by and supporting python24).
Remove PYTHON_VERSIONS_ACCEPTED and PYTHON_VERSIONS_INCOMPATIBLE
lines that just mirror defaults now.
Miscellaneous cleanup while editing all these files.
- fixed python --optimize
- moved old -j option to -J
- fixed threading in python-dbg
- fixed --manage-script-name
- make easy_install happy
uwsgi-0.9.8.5:
- fixed compatibility with multi app 0.9.6 syntax
* new option --touch-reload <file> to reload the stack on <file> modification
* --static-map <mountpoint=documentroot> allows to serve static files
* fixed --post-limit management
* disallow empty socket names
* implemented exception_info WSGI support
* new options --reload-on-as <n> and --reload-on-rss <n> allows
to recycle workers when their memory usage is higher than <n> MB
* fixed syslog support (use --log-syslog[=facility] to enable it)
* improved plugin loading system
* added support for RabbitMQ as event dispatcher for the Emperor
* fixed FreeBSD memory report
* PSGI plugin can be compiled without ithreads
* various Emperor fixes
* fixed a regression with setgroups()
* support for shared sockets (used in jails within network namespaces)
- fix a race condition in the worker spawning code
- minor fixes for the spooler code
- backport of UWSGI_SCHEME for better HTTPS support
- improvements for graceful reloading code
uWSGI is a fast (pure C), self-healing, developer-friendly WSGI server,
aimed for professional python webapps deployment and development.
Backend support exists for Apache, nginx, cherokee and lighttpd.
Some of the features include:
- low memory footprint
- preforking and multithreaded operation
- logging, diagnostic and profiling support
- support for sendfile()
- self-healing
- graceful restart and hot-plug upgrading