This PR pins gunicorn to the latest release 20.0.0.
Changelog
### 19.9.0
```
===================
- fix: address a regression that prevented syslog support from working
(:issue:`1668`, :pr:`1773`)
- fix: correctly set `REMOTE_ADDR` on versions of Python 3 affected by
`Python Issue 30205 <https://bugs.python.org/issue30205>`_
(:issue:`1755`, :pr:`1796`)
- fix: show zero response length correctly in access log (:pr:`1787`)
- fix: prevent raising :exc:`AttributeError` when ``--reload`` is not passed
in case of a :exc:`SyntaxError` raised from the WSGI application.
(:issue:`1805`, :pr:`1806`)
- The internal module ``gunicorn.workers.async`` was renamed to ``gunicorn.workers.base_async``
since ``async`` is now a reserved word in Python 3.7.
(:pr:`1527`)
```
### 19.8.1
```
===================
- fix: secure scheme headers when bound to a unix socket
(:issue:`1766`, :pr:`1767`)
```
### 19.8.0
```
===================
- Eventlet 0.21.0 support (:issue:`1584`)
- Tornado 5 support (:issue:`1728`, :pr:`1752`)
- support watching additional files with ``--reload-extra-file``
(:pr:`1527`)
- support configuring logging with a dictionary with ``--logging-config-dict``
(:issue:`1087`, :pr:`1110`, :pr:`1602`)
- add support for the ``--config`` flag in the ``GUNICORN_CMD_ARGS`` environment
variable (:issue:`1576`, :pr:`1581`)
- disable ``SO_REUSEPORT`` by default and add the ``--reuse-port`` setting
(:issue:`1553`, :issue:`1603`, :pr:`1669`)
- fix: installing `inotify` on MacOS no longer breaks the reloader
(:issue:`1540`, :pr:`1541`)
- fix: do not throw ``TypeError`` when ``SO_REUSEPORT`` is not available
(:issue:`1501`, :pr:`1491`)
- fix: properly decode HTTP paths containing certain non-ASCII characters
(:issue:`1577`, :pr:`1578`)
- fix: remove whitespace when logging header values under gevent (:pr:`1607`)
- fix: close unlinked temporary files (:issue:`1327`, :pr:`1428`)
- fix: parse ``--umask=0`` correctly (:issue:`1622`, :pr:`1632`)
- fix: allow loading applications using relative file paths
(:issue:`1349`, :pr:`1481`)
- fix: force blocking mode on the gevent sockets (:issue:`880`, :pr:`1616`)
- fix: preserve leading `/` in request path (:issue:`1512`, :pr:`1511`)
- fix: forbid contradictory secure scheme headers
- fix: handle malformed basic authentication headers in access log
(:issue:`1683`, :pr:`1684`)
- fix: defer handling of ``USR1`` signal to a new greenlet under gevent
(:issue:`1645`, :pr:`1651`)
- fix: the threaded worker would sometimes close the wrong keep-alive
connection under Python 2 (:issue:`1698`, :pr:`1699`)
- fix: re-open log files on ``USR1`` signal using ``handler._open`` to
support subclasses of ``FileHandler`` (:issue:`1739`, :pr:`1742`)
- deprecation: the ``gaiohttp`` worker is deprecated, see the
:ref:`worker-class` documentation for more information
(:issue:`1338`, :pr:`1418`, :pr:`1569`)
```
### 19.7.1
```
===================
- fix: continue if SO_REUSEPORT seems to be available but fails (:issue:`1480`)
- fix: support non-decimal values for the umask command line option (:issue:`1325`)
```
### 19.7.0
```
===================
- The previously deprecated ``gunicorn_django`` command has been removed.
Use the :ref:`gunicorn-cmd` command-line interface instead.
- The previously deprecated ``django_settings`` setting has been removed.
Use the :ref:`raw-env` setting instead.
- The default value of :ref:`ssl-version` has been changed from
``ssl.PROTOCOL_TLSv1`` to ``ssl.PROTOCOL_SSLv23``.
- fix: initialize the group access list when initgroups is set (:issue:`1297`)
- add environment variables to gunicorn access log format (:issue:`1291`)
- add --paste-global-conf option (:issue:`1304`)
- fix: print access logs to STDOUT (:issue:`1184`)
- remove upper limit on max header size config (:issue:`1313`)
- fix: print original exception on AppImportError (:issue:`1334`)
- use SO_REUSEPORT if available (:issue:`1344`)
- `fix leak <https://github.com/benoitc/gunicorn/commit/b4c41481e2d5ef127199a4601417a6819053c3fd>`_ of duplicate file descriptor for bound sockets.
- add --reload-engine option, support inotify and other backends (:issue:`1368`, :issue:`1459`)
- fix: reject request with invalid HTTP versions
- add ``child_exit`` callback (:issue:`1394`)
- add support for eventlets _AlreadyHandled object (:issue:`1406`)
- format boot tracebacks properly with reloader (:issue:`1408`)
- refactor socket activation and fd inheritance for better support of SystemD (:issue:`1310`)
- fix: o fds are given by default in gunicorn (:issue:`1423`)
- add ability to pass settings to GUNICORN_CMD_ARGS environment variable which helps in container world (:issue:`1385`)
- fix: catch access denied to pid file (:issue:`1091`)
- many additions and improvements to the documentation
Breaking Change
+++++++++++++++
- **Python 2.6.0** is the last supported version
================
Changelog - 2018
================
.. note::
Please see :doc:`news` for the latest changes
```
### 19.6.0
```
===================
Core & Logging
++++++++++++++
- improvement of the binary upgrade behaviour using USR2: remove file locking (:issue:`1270`)
- add the ``--capture-output`` setting to capture stdout/stderr tot the log
file (:issue:`1271`)
- Allow disabling ``sendfile()`` via the ``SENDFILE`` environment variable
(:issue:`1252`)
- fix reload under pycharm (:issue:`1129`)
Workers
+++++++
- fix: make sure to remove the signal from the worker pipe (:issue:`1269`)
- fix: **gthread** worker, handle removed socket in the select loop
(:issue:`1258`)
```
### 19.5.0
```
===================
Core
++++
- fix: Ensure response to HEAD request won't have message body
- fix: lock domain socket and remove on last arbiter exit (:issue:`1220`)
- improvement: use EnvironmentError instead of socket.error (:issue:`939`)
- add: new ``FORWARDED_ALLOW_IPS`` environment variable (:issue:`1205`)
- fix: infinite recursion when destroying sockets (:issue:`1219`)
- fix: close sockets on shutdown (:issue:`922`)
- fix: clean up sys.exc_info calls to drop circular refs (:issue:`1228`)
- fix: do post_worker_init after load_wsgi (:issue:`1248`)
Workers
+++++++
- fix access logging in gaiohttp worker (:issue:`1193`)
- eventlet: handle QUIT in a new coroutine (:issue:`1217`)
- gevent: remove obsolete exception clauses in run (:issue:`1218`)
- tornado: fix extra "Server" response header (:issue:`1246`)
- fix: unblock the wait loop under python 3.5 in sync worker (:issue:`1256`)
Logging
+++++++
- fix: log message for listener reloading (:issue:`1181`)
- Let logging module handle traceback printing (:issue:`1201`)
- improvement: Allow configuring logger_class with statsd_host (:issue:`1188`)
- fix: traceback formatting (:issue:`1235`)
- fix: print error logs on stderr and access logs on stdout (:issue:`1184`)
Documentation
+++++++++++++
- Simplify installation instructions in gunicorn.org (:issue:`1072`)
- Fix URL and default worker type in example_config (:issue:`1209`)
- update django doc url to 1.8 lts (:issue:`1213`)
- fix: miscellaneous wording corrections (:issue:`1216`)
- Add PSF License Agreement of selectors.py to NOTICE (:issue: `1226`)
- document LOGGING overriding (:issue:`1051`)
- put a note that error logs are only errors from Gunicorn (:issue:`1124`)
- add a note about the requirements of the threads workers under python 2.x (:issue:`1200`)
- add access_log_format to config example (:issue:`1251`)
Tests
+++++
- Use more pytest.raises() in test_http.py
```
### 19.4.5
```
===================
- fix: NameError fileno in gunicorn.http.wsgi (:issue:`1178`)
```
### 19.4.4
```
===================
- fix: check if a fileobject can be used with sendfile(2) (:issue:`1174`)
- doc: be more descriptive in errorlog option (:issue:`1173`)
================
Changelog - 2017
================
.. note::
Please see :doc:`news` for the latest changes
```
### 19.4.3
```
===================
- fix: don't check if a file is writable using os.stat with SELINUX (:issue:`1171`)
```
### 19.4.2
```
===================
Core
++++
- improvement: handle HaltServer in manage_workers (:issue:`1095`)
- fix: Do not rely on sendfile sending requested count (:issue:`1155`)
- fix: claridy --no-sendfile default (:issue:`1156`)
- fix: LoggingCatch sendfile failure from no file descriptor (:issue:`1160`)
Logging
+++++++
- fix: Always send access log to syslog if syslog is on
- fix: check auth before trying to own a file (:issue:`1157`)
Documentation
+++++++++++++
- fix: Fix Slowloris broken link. (:issue:`1142`)
- Tweak markup in faq.rst
Testing
+++++++
- fix: gaiohttp test (:issue:`1164`)
```
### 19.4.1
```
===================
- fix tornado worker (:issue:`1154`)
```
### 19.4.0
```
===================
Core
++++
- fix: make sure that a user is able to access to the logs after dropping a
privilege (:issue:`1116`)
- improvement: inherit the `Exception` class where it needs to be (:issue:`997`)
- fix: make sure headers are always encoded as latin1 RFC 2616 (:issue:`1102`)
- improvement: reduce arbiter noise (:issue:`1078`)
- fix: don't close the unix socket when the worker exit (:issue:`1088`)
- improvement: Make last logged worker count an explicit instance var (:issue:`1078`)
- improvement: prefix config file with its type (:issue:`836`)
- improvement: pidfile handing (:issue:`1042`)
- fix: catch OSError as well as ValueError on race condition (:issue:`1052`)
- improve support of ipv6 by backporting urlparse.urlsplit from Python 2.7 to
Python 2.6.
- fix: raise InvalidRequestLine when the line contains malicious data
(:issue:`1023`)
- fix: fix argument to disable sendfile
- fix: add gthread to the list of supported workers (:issue:`1011`)
- improvement: retry socket binding up to five times upon EADDRNOTAVAIL
(:issue:`1004`)
- **breaking change**: only honor headers that can be encoded in ascii to comply to
the RFC 7230 (See :issue:`1151`).
Logging
+++++++
- add new parameters to access log (:issue:`1132`)
- fix: make sure that files handles are correctly reopened on HUP
(:issue:`627`)
- include request URL in error message (:issue:`1071`)
- get username in access logs (:issue:`1069`)
- fix statsd logging support on Python 3 (:issue:`1010`)
Testing
+++++++
- use last version of mock.
- many fixes in Travis CI support
- miscellaneous improvements in tests
Thread worker
+++++++++++++
- fix: Fix self.nr usage in ThreadedWorker so that auto restart works as
expected (:issue:`1031`)
Gevent worker
+++++++++++++
- fix quit signal handling (:issue:`1128`)
- add support for Python 3 (:issue:`1066`)
- fix: make graceful shutdown thread-safe (:issue:`1032`)
Tornado worker
++++++++++++++
- fix ssl options (:issue:`1146`, :issue:`1135`)
- don't check timeout when stopping gracefully (:issue:`1106`)
AIOHttp worker
++++++++++++++
- add SSL support (:issue:`1105`)
Documentation
+++++++++++++
- fix link to proc name setting (:issue:`1144`)
- fix worker class documentation (:issue:`1141`, :issue:`1104`)
- clarify graceful timeout documentation (:issue:`1137`)
- don't duplicate NGINX config files examples (:issue:`1050`, :issue:`1048`)
- add `web.py` framework example (:issue:`1117`)
- update Debian/Ubuntu installations instructions (:issue:`1112`)
- clarify `pythonpath` setting description (:issue:`1080`)
- tweak some example for python3
- clarify `sendfile` documentation
- miscellaneous typos in source code comments (thanks!)
- clarify why REMOTE_ADD may not be the user's IP address (:issue:`1037`)
Misc
++++
- fix: reloader should survive SyntaxError (:issue:`994`)
- fix: expose the reloader class to the worker.
```
### 19.3.0
```
===================
Core
++++
- fix: :issue:`978` make sure a listener is inheritable
- add `check_config` class method to workers
- fix: :issue:`983` fix select timeout in sync worker with multiple
connections
- allows workers to access to the reloader. close :issue:`984`
- raise TypeError instead of AssertionError
Logging
+++++++
- make Logger.loglevel a class attribute
Documentation
+++++++++++++
- fix: :issue:`988` fix syntax errors in examples/gunicorn_rc
```
### 19.2.1
```
==================
Logging
+++++++
- expose loglevel in the Logger class
AsyncIO worker (gaiohttp)
+++++++++++++++++++++++++
- fix :issue:`977` fix initial crash
Documentation
+++++++++++++
- document security mailing-list in the contributing page.
```
### 19.2
```
=================
Core
++++
- optimize the sync workers when listening on a single interface
- add `--sendfile` settings to enable/disable sendfile. fix :issue:`856` .
- add the selectors module to the code base. :issue:`886`
- add `--max-requests-jitter` setting to set the maximum jitter to add to the
max-requests setting.
- fix :issue:`899` propagate proxy_protocol_info to keep-alive requests
- fix :issue:`863` worker timeout: dynamic timeout has been removed
- fix: Avoid world writable file
Logging
+++++++
- fix :issue:`941` set logconfig default to paster more trivially
- add statsd-prefix config setting: set the prefix to use when emitting statsd
metrics
- :issue:`832` log to console by default
Thread Worker
+++++++++++++
- fix :issue:`908` make sure the worker can continue to accept requests
Eventlet Worker
+++++++++++++++
- fix :issue:`867` Fix eventlet shutdown to actively shut down the workers.
Documentation
+++++++++++++
Many improvements and fixes have been done, see the detailed changelog for
more information.
================
Changelog - 2016
================
.. note::
Please see :doc:`news` for the latest changes
```
### 19.1.1
```
===================
Changes
-------
Core
++++
- fix :issue:`835`: display correct pid of already running instance
- fix :pr:`833`: fix `PyTest` class in setup.py.
Logging
+++++++
- fix :issue:`838`: statsd logger, send statsd timing metrics in milliseconds
- fix :issue:`839`: statsd logger, allows for empty log message while pushing
metrics and restore worker number in DEBUG logs
- fix :issue:`850`: add timezone to logging
- fix :issue:`853`: Respect logger_class setting unless statsd is on
AioHttp worker
++++++++++++++
- fix :issue:`830` make sure gaiohttp worker is shipped with gunicorn.
```
### 19.1
```
=================
Changes
-------
Core
++++
- fix :issue:`785`: handle binary type address given to a client socket address
- fix graceful shutdown. make sure QUIT and TERMS signals are switched everywhere.
- :issue:`799`: fix support loading config from module
- :issue:`805`: fix check for file-like objects
- fix :issue:`815`: args validation in WSGIApplication.init
- fix :issue:`787`: check if we load a pyc file or not.
Tornado worker
++++++++++++++
- fix :issue:`771`: support tornado 4.0
- fix :issue:`783`: x_headers error. The x-forwarded-headers option has been removed
in `c4873681299212d6082cd9902740eef18c2f14f1
<https://github.com/benoitc/gunicorn/commit/c4873681299212d6082cd9902740eef18c2f14f1>`_.
The discussion is available on :pr:`633`.
AioHttp worker
++++++++++++++
- fix: fetch all body in input. fix :issue:`803`
- fix: don't install the worker if python < 3.3
- fix :issue:`822`: Support UNIX sockets in gaiohttp worker
Async worker
++++++++++++
- fix :issue:`790`: StopIteration shouldn't be catched at this level.
Logging
+++++++
- add statsd logging handler fix :issue:`748`
Paster
++++++
- fix :issue:`809`: Set global logging configuration from a Paste config.
Extra
+++++
- fix RuntimeError in gunicorn.reloader (:issue:`807`)
Documentation
+++++++++++++
- update faq: put a note on how `watch logs in the console
<http://docs.gunicorn.org/en/latest/faq.htmlwhy-i-don-t-see-any-logs-in-the-console>`_
since many people asked for it.
```
### 19.0
```
version improve a lot the usage of Gunicorn with python 3 by adding `two
new workers <http://docs.gunicorn.org/en/latest/design.htmlasyncio-workers>`_
to it: `gthread` a fully threaded async worker using futures and `gaiohttp` a
worker using asyncio.
Breaking Changes
----------------
Switch QUIT and TERM signals
++++++++++++++++++++++++++++
With this change, when gunicorn receives a QUIT all the workers are
killed immediately and exit and TERM is used for the graceful shutdown.
Note: the old behaviour was based on the NGINX but the new one is more
correct according the following doc:
https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html
also it is complying with the way the signals are sent by heroku:
https://devcenter.heroku.com/articles/python-faqwhat-constraints-exist-when-developing-applications-on-heroku
Deprecations
++++++++++++
`run_gunicorn`, `gunicorn_django` and `gunicorn_paster` are now
completely deprecated and will be removed in the next release. Use the
`gunicorn` command instead.
Changes
-------
core
++++
- add aiohttp worker named `gaiohttp` using asyncio. Full async worker
on python 3.
- fix HTTP-violating excess whitespace in write_error output
- fix: try to log what happened in the worker after a timeout, add a
`worker_abort` hook on SIGABRT signal.
- fix: save listener socket name in workers so we can handle buffered
keep-alive requests after the listener has closed.
- add on_exit hook called just before exiting gunicorn.
- add support for python 3.4
- fix: do not swallow unexpected errors when reaping
- fix: remove incompatible SSL option with python 2.6
- add new async gthread worker and `--threads` options allows to set multiple
threads to listen on connection
- deprecate `gunicorn_django` and `gunicorn_paster`
- switch QUIT and TERM signal
- reap workers in SIGCHLD handler
- add universal wheel support
- use `email.utils.formatdate` in gunicorn.util.http_date
- deprecate the `--debug` option
- fix: log exceptions that occur after response start …
- allows loading of applications from `.pyc` files (693)
- fix: issue 691, raw_env config file parsing
- use a dynamic timeout to wait for the optimal time. (Reduce power
usage)
- fix python3 support when notifying the arbiter
- add: honor $WEB_CONCURRENCY environment variable. Useful for heroku
setups.
- add: include tz offset in access log
- add: include access logs in the syslog handler.
- add --reload option for code reloading
- add the capability to load `gunicorn.base.Application` without the loading of
the arguments of the command line. It allows you to :ref:`embed gunicorn in
your own application <custom>`.
- improve: set wsgi.multithread to True for async workers
- fix logging: make sure to redirect wsgi.errors when needed
- add: syslog logging can now be done to a unix socket
- fix logging: don't try to redirect stdout/stderr to the logfile.
- fix logging: don't propagate log
- improve logging: file option can be overriden by the gunicorn options
`--error-logfile` and `--access-logfile` if they are given.
- fix: don't override SERVER_* by the Host header
- fix: handle_error
- add more option to configure SSL
- fix: sendfile with SSL
- add: worker_int callback (to react on SIGTERM)
- fix: don't depend on entry point for internal classes, now absolute
modules path can be given.
- fix: Error messages are now encoded in latin1
- fix: request line length check
- improvement: proxy_allow_ips: Allow proxy protocol if "*" specified
- fix: run worker's `setup` method before setting num_workers
- fix: FileWrapper inherit from `object` now
- fix: Error messages are now encoded in latin1
- fix: don't spam the console on SIGWINCH.
- fix: logging -don't stringify T and D logging atoms (621)
- add support for the latest django version
- deprecate `run_gunicorn` django option
- fix: sys imported twice
gevent worker
+++++++++++++
- fix: make sure to stop all listeners
- fix: monkey patching is now done in the worker
- fix: "global name 'hub' is not defined"
- fix: reinit `hub` on old versions of gevent
- support gevent 1.0
- fix: add subprocess in monkey patching
- fix: add support for multiple listener
eventlet worker
+++++++++++++++
- fix: merge duplicate EventletWorker.init_process method (fixes 657)
- fix: missing errno import for eventlet sendfile patch
- fix: add support for multiple listener
tornado worker
++++++++++++++
- add graceful stop support
================
Changelog - 2015
================
.. note::
Please see :doc:`news` for the latest changes.
```
### 18.0
```
-----------------
- new: add ``-e/--env`` command line argument to pass an environment variables to
gunicorn
- new: add ``--chdir`` command line argument to specified directory
before apps loading. - new: add wsgi.file_wrapper support in async workers
- new: add ``--paste`` command line argument to set the paster config file
- deprecated: the command ``gunicorn_django`` is now deprecated. You should now
run your application with the WSGI interface installed with your project (see
https://docs.djangoproject.com/en/1.4/howto/deployment/wsgi/gunicorn/) for
more infos.
- deprecated: the command ``gunicorn_paste`` is deprecated. You now should use
the new ``--paste`` argument to set the configuration file of your paster
application.
- fix: Removes unmatched leading quote from the beginning of the default access
log format string
- fix: null timeout
- fix: gevent worker
- fix: don't reload the paster app when using pserve
- fix: after closing for error do not keep alive the connection
- fix: responses 1xx, 204 and 304 should not force the connection to be closed
```
### 17.5
```
------------------
- new: add signals documentation
- new: add post_worker_init hook for workers
- new: try to use gunicorn.conf.py in current folder as the default
config file.
- fix graceful timeout with the Eventlet worker
- fix: don't raise an error when closing the socket if already closed
- fix: fix --settings parameter for django application and try to find
the django settings when using the ``gunicorn`` command.
- fix: give the initial global_conf to paster application
- fix: fix 'Expect: 100-continue' support on Python 3
New versionning:
++++++++++++++++
With this release, the versionning of Gunicorn is changing. Gunicorn is
stable since a long time and there is no point to release a "1.0" now.
It should have been done since a long time. 0.17 really meant it was the
17th stable version. From the beginning we have only 2 kind of
releases:
major release: releases with major changes or huge features added
services releases: fixes and minor features added So from now we will
apply the following versionning ``<major>.<service>``. For example ``17.5`` is a
service release.
```
### 0.17.4
```
-------------------
- fix unix socket address parsing
```
### 0.17.3
```
-------------------
- add systemd sockets support
- add ``python -m gunicorn.app.wsgiapp`` support
- improve logger class inheritance
- exit when the config file isn't found
- add the -R option to enable stdio inheritance in daemon mode
- don't close file descriptors > 3 in daemon mode
- improve STDOUT/STDERR logging
- fix pythonpath option
- fix pidfile creation on Python 3
- fix gevent worker exit
- fix ipv6 detection when the platform isn't supporting it
```
### 0.17.2
```
-------------------
- optimize readline
- make imports errors more visible when loading an app or a logging
class
- fix tornado worker: don't pass ssl options if there are none
- fix PEP3333: accept only bytetrings in the response body
- fix support on CYGWIN platforms
```
### 0.17.1
```
-------------------
- add syslog facility name setting
- fix ``--version`` command line argument
- fix wsgi url_scheme for https
================
Changelog - 2014
================
.. note::
Please see :doc:`news` for the latest changes.
```
### 0.17.0
```
-------------------
- allows gunicorn to bind to multiple address
- add SSL support
- add syslog support
- add nworkers_changed hook
- add response arg for post_request hook
- parse command line with argparse (replace deprecated optparse)
- fix PWD detection in arbiter
- miscellaneous PEP8 fixes
```
### 0.16.1
```
-------------------
- Fix packaging
```
### 0.16.0
```
-------------------
- **Added support for Python 3.2 & 3.3**
- Expose --pythonpath command to all gunicorn commands
- Honor $PORT environment variable, useful for deployment on heroku
- Removed support for Python 2.5
- Make sure we reopen the logs on the console
- Fix django settings module detection from path
- Reverted timeout for client socket. Fix issue on blocking issues.
- Fixed gevent worker
```
### 0.15.0
```
-------------------
- new documentation site on http://docs.gunicorn.org
- new website on http://gunicorn.org
- add `haproxy PROXY protocol <http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt>`_ support
- add ForwardedAllowIPS option: allows to filter Front-end's IPs
allowed to handle X-Forwarded-* headers.
- add callable hooks for paster config
- add x-forwarded-proto as secure scheme default (Heroku is using this)
- allows gunicorn to load a pre-compiled application
- support file reopening & reexec for all loggers
- initialize the logging config file with defaults.
- set timeout for client socket (slow client DoS).
- NoMoreData, ChunkMissingTerminator, InvalidChunkSize are now
IOError exceptions
- fix graceful shutdown in gevent
- fix limit request line check
```
### 0.14.6
```
-------------------
- fix gevent & subproces
- fix request line length check
- fix keepalive = 0
- fix tornado worker
```
### 0.14.5
```
--------------------
- fix logging during daemonisation
```
### 0.14.4
```
-------------------
- new --graceful-timeout option
- fix multiple issues with request limit
- more fixes in django settings resolutions
- fix gevent.core import
- fix keepalive=0 in eventlet worker
- fix handle_error display with the unix worker
- fix tornado.wsgi.WSGIApplication calling error
- **breaking change**: take the control on graceful reload back.
graceful can't be overrided anymore using the on_reload function.
```
### 0.14.3
```
-------------------
- improvement: performance of http.body.Body.readline()
- improvement: log HTTP errors in access log like Apache
- improvement: display traceback when the worker fails to boot
- improvement: makes gunicorn work with gevent 1.0
- examples: websocket example now supports hybi13
- fix: reopen log files after initialization
- fix: websockets support
- fix: django1.4 support
- fix: only load the paster application 1 time
```
### 0.14.2
```
-------------------
- add validate_class validator: allows to use a class or a method to
initialize the app during in-code configuration
- add support for max_requests in tornado worker
- add support for disabling x_forwarded_for_header in tornado worker
- gevent_wsgi is now an alias of gevent_pywsgi
- Fix gevent_pywsgi worker
```
### 0.14.1
```
-------------------
- fixing source archive, reducing its size
```
### 0.14.0
```
-------------------
- check if Request line is too large: You can now pass the parameter
``--limit-request-line`` or set the ``limit_request_line`` in your
configuration file to set the max size of the request line in bytes.
- limit the number of headers fields and their size. Add
``--limit-request-field`` and ``limit-request-field-size`` settings
- add ``p`` variable to the log access format to log pidfile
- add ``{HeaderName}o`` variable to the logo access format to log the
response header HeaderName
- request header is now logged with the variable ``{HeaderName}i`` in the
access log file
- improve error logging
- support logging.configFile
- support django 1.4 in both gunicorn_django & run_gunicorn command
- improve reload in django run_gunicorn command (should just work now)
- allows people to set the ``X-Forwarded-For`` header key and disable it by
setting an empty string.
- fix support of Tornado
- many other fixes.
Changelog - 2013
================
```
### 0.13.4
```
-------------------
- fix util.closerange function used to prevent leaking fds on python 2.5
(typo)
```
### 0.13.3
```
-------------------
- refactor gevent worker
- prevent leaking fds on reexec
- fix inverted request_time computation
```
### 0.13.2
```
-------------------
- Add support for Tornado 2.0 in tornado worker
- Improve access logs: allows customisation of the log format & add
request time
- Logger module is now pluggable
- Improve graceful shutdown in Python versions >= 2.6
- Fix post_request root arity for compatibility
- Fix sendfile support
- Fix Django reloading
```
### 0.13.1
```
-------------------
- Fix unix socket. log argument was missing.
```
### 0.13.0
```
-------------------
- Improve logging: allows file-reopening and add access log file
compatible with the `apache combined log format <http://httpd.apache.org/docs/2.0/logs.htmlcombined>`_
- Add the possibility to set custom SSL headers. X-Forwarded-Protocol
and X-Forwarded-SSL are still the default
- New `on_reload` hook to customize how gunicorn spawn new workers on
SIGHUP
- Handle projects with relative path in django_gunicorn command
- Preserve path parameters in PATH_INFO
- post_request hook now accepts the environ as argument.
- When stopping the arbiter, close the listener asap.
- Fix Django command `run_gunicorn` in settings reloading
- Fix Tornado_ worker exiting
- Fix the use of sendfile in wsgi.file_wrapper
```
### 0.12.2
```
-------------------
- Add wsgi.file_wrapper optimised for FreeBSD, Linux & MacOSX (use
sendfile if available)
- Fix django run_gunicorn command. Make sure we reload the application
code.
- Fix django localisation
- Compatible with gevent 0.14dev
```
### 0.12.1
```
-------------------
- Add "on_starting" hook. This hook can be used to set anything before
the arbiter really start
- Support bdist_rpm in setup
- Improve content-length handling (pep 3333)
- Improve Django support
- Fix daemonizing (142)
- Fix ipv6 handling
.. _Tornado: http://www.tornadoweb.org/
Changelog - 2012
================
```
### 0.12.0
```
-------------------
- Add support for logging configuration using a ini file.
It uses the standard Python logging's module Configuration
file format and allows anyone to use his custom file handler
- Add IPV6 support
- Add multidomain application example
- Improve gunicorn_django command when importing settings module
using DJANGO_SETTINGS_MODULE environment variable
- Send appropriate error status on http parsing
- Fix pidfile, set permissions so other user can read
it and use it.
- Fix temporary file leaking
- Fix setpgrp issue, can now be launched via ubuntu upstart
- Set the number of workers to zero on WINCH
```
### 0.11.2
```
-------------------
* Add SERVER_SOFTWARE to the os.environ
* Add support for django settings environment variable
* Add support for logging configuration in Paster ini-files
* Improve arbiter notification in asynchronous workers
* Display the right error when a worker can't be used
* Fix Django support
* Fix HUP with Paster applications
* Fix readline in wsgi.input
```
### 0.11.1
```
-------------------
* Implement max-requests feature to prevent memory leaks.
* Added 'worker_exit' server hook.
* Reseed the random number generator after fork().
* Improve Eventlet worker.
* Fix Django command `run_gunicorn`.
* Fix the default proc name internal setting.
* Workaround to prevent Gevent worker to segfault on MacOSX.
```
### 0.11.0
```
-------------------
* Improve dramatically performances of Gevent and Eventlet workers
* Optimize HTTP parsing
* Drop Server and Date headers in start_response when provided.
* Fix latency issue in async workers
```
### 0.10.1
```
-------------------
* Improve gevent's workers. Add "egg:gunicorngevent_wsgi" worker using
`gevent.wsgi <http://www.gevent.org/gevent.wsgi.html>`_ and
"egg:gunicorngevent_pywsgi" worker using `gevent.pywsgi
<http://www.gevent.org/gevent.pywsgi.html>`_ .
**"egg:gunicorngevent"** using our own HTTP parser is still here and
is **recommended** for normal uses. Use the "gevent.wsgi" parser if you
need really fast connections and don't need streaming, keepalive or ssl.
* Add pre/post request hooks
* Exit more quietly
* Fix gevent dns issue
```
### 0.10.0
```
-------------------
* New HTTP parser.
* New HUP behaviour. Re-reads the configuration and then reloads all
worker processes without changing the master process id. Helpful for
code reloading and monitoring applications like supervisord and runit.
* Added a preload configuration parameter. By default, application code
is now loaded after a worker forks. This couple with the new HUP
handling can be used for dev servers to do hot code reloading. Using
the preload flag can help a bit in small memory VM's.
* Allow people to pass command line arguments to WSGI applications. See:
`examples/alt_spec.py
<http://github.com/benoitc/gunicorn/raw/master/examples/alt_spec.py>`_
* Added an example gevent reloader configuration:
`examples/example_gevent_reloader.py
<http://github.com/benoitc/gunicorn/blob/master/examples/example_gevent_reloader.py>`_.
* New gevent worker "egg:gunicorngevent2", working with gevent.wsgi.
* Internal refactoring and various bug fixes.
* New documentation website.
```
### 0.9.1
```
------------------
* Support https via X-Forwarded-Protocol or X-Forwarded-Ssl headers
* Fix configuration
* Remove -d options which was used instead of -D for daemon.
* Fix umask in unix socket
```
### 0.9.0
```
------------------
* Added *when_ready* hook. Called just after the server is started
* Added *preload* setting. Load application code before the worker processes
are forked.
* Refactored Config
* Fix pidfile
* Fix QUIT/HUP in async workers
* Fix reexec
* Documentation improvements
```
### 0.8.1
```
------------------
* Fix builtins import in config
* Fix installation with pip
* Fix Tornado WSGI support
* Delay application loading until after processing all configuration
```
### 0.8.0
```
------------------
* Refactored Worker management for better async support. Now use the -k option
to set the type of request processing to use
* Added support for Tornado_
```
### 0.7.2
```
------------------
* Added --spew option to help debugging (installs a system trace hook)
* Some fixes in async arbiters
* Fix a bug in start_response on error
```
### 0.7.1
```
------------------
* Fix bug when responses have no body.
```
### 0.7.0
```
------------------
* Added support for Eventlet_ and Gevent_ based workers.
* Added Websockets_ support
* Fix Chunked Encoding
* Fix SIGWINCH on OpenBSD_
* Fix `PEP 333`_ compliance for the write callable.
```
### 0.6.5
```
------------------
* Fix pidfile handling
* Fix Exception Error
```
### 0.6.4
```
------------------
* Use cStringIO for performance when possible.
* Fix worker freeze when a remote connection closes unexpectedly.
```
### 0.6.3
```
------------------
* Make HTTP parsing faster.
* Various bug fixes
```
### 0.6.2
```
------------------
* Added support for chunked response.
* Added proc_name option to the config file.
* Improved the HTTP parser. It now uses buffers instead of strings to store
temporary data.
* Improved performance when sending responses.
* Workers are now murdered by age (the oldest is killed first).
```
### 0.6.1
```
------------------
* Added gunicorn config file support for Django admin command
* Fix gunicorn config file. -c was broken.
* Removed TTIN/TTOU from workers which blocked other signals.
```
### 0.6.0
```
------------------
* Added setproctitle support
* Change privilege switch behavior. We now work like NGINX, master keeps the
permissions, new uid/gid permissions are only set for workers.
```
### 0.5.1
```
------------------
* Fix umask
* Added Debian packaging
```
### 0.5.0
```
------------------
* Added `configuration file <configuration.html>`_ handler.
* Added support for pre/post fork hooks
* Added support for before_exec hook
* Added support for unix sockets
* Added launch of workers processes under different user/group
* Added umask option
* Added SCRIPT_NAME support
* Better support of some exotic settings for Django projects
* Better support of Paste-compatible applications
* Some refactoring to make the code easier to hack
* Allow multiple keys in request and response headers
.. _Tornado: http://www.tornadoweb.org/
.. _`PEP 333`: https://www.python.org/dev/peps/pep-0333/
.. _Eventlet: http://eventlet.net/
.. _Gevent: http://www.gevent.org/
.. _OpenBSD: https://www.openbsd.org/
.. _Websockets: https://html.spec.whatwg.org/multipage/web-sockets.html
Changelog - 2011
================
```
Links
- PyPI: https://pypi.org/project/gunicorn
- Changelog: https://pyup.io/changelogs/gunicorn/
- Homepage: http://gunicorn.org
This PR pins gunicorn to the latest release 20.0.0.
Changelog
### 19.9.0 ``` =================== - fix: address a regression that prevented syslog support from working (:issue:`1668`, :pr:`1773`) - fix: correctly set `REMOTE_ADDR` on versions of Python 3 affected by `Python Issue 30205 <https://bugs.python.org/issue30205>`_ (:issue:`1755`, :pr:`1796`) - fix: show zero response length correctly in access log (:pr:`1787`) - fix: prevent raising :exc:`AttributeError` when ``--reload`` is not passed in case of a :exc:`SyntaxError` raised from the WSGI application. (:issue:`1805`, :pr:`1806`) - The internal module ``gunicorn.workers.async`` was renamed to ``gunicorn.workers.base_async`` since ``async`` is now a reserved word in Python 3.7. (:pr:`1527`) ``` ### 19.8.1 ``` =================== - fix: secure scheme headers when bound to a unix socket (:issue:`1766`, :pr:`1767`) ``` ### 19.8.0 ``` =================== - Eventlet 0.21.0 support (:issue:`1584`) - Tornado 5 support (:issue:`1728`, :pr:`1752`) - support watching additional files with ``--reload-extra-file`` (:pr:`1527`) - support configuring logging with a dictionary with ``--logging-config-dict`` (:issue:`1087`, :pr:`1110`, :pr:`1602`) - add support for the ``--config`` flag in the ``GUNICORN_CMD_ARGS`` environment variable (:issue:`1576`, :pr:`1581`) - disable ``SO_REUSEPORT`` by default and add the ``--reuse-port`` setting (:issue:`1553`, :issue:`1603`, :pr:`1669`) - fix: installing `inotify` on MacOS no longer breaks the reloader (:issue:`1540`, :pr:`1541`) - fix: do not throw ``TypeError`` when ``SO_REUSEPORT`` is not available (:issue:`1501`, :pr:`1491`) - fix: properly decode HTTP paths containing certain non-ASCII characters (:issue:`1577`, :pr:`1578`) - fix: remove whitespace when logging header values under gevent (:pr:`1607`) - fix: close unlinked temporary files (:issue:`1327`, :pr:`1428`) - fix: parse ``--umask=0`` correctly (:issue:`1622`, :pr:`1632`) - fix: allow loading applications using relative file paths (:issue:`1349`, :pr:`1481`) - fix: force blocking mode on the gevent sockets (:issue:`880`, :pr:`1616`) - fix: preserve leading `/` in request path (:issue:`1512`, :pr:`1511`) - fix: forbid contradictory secure scheme headers - fix: handle malformed basic authentication headers in access log (:issue:`1683`, :pr:`1684`) - fix: defer handling of ``USR1`` signal to a new greenlet under gevent (:issue:`1645`, :pr:`1651`) - fix: the threaded worker would sometimes close the wrong keep-alive connection under Python 2 (:issue:`1698`, :pr:`1699`) - fix: re-open log files on ``USR1`` signal using ``handler._open`` to support subclasses of ``FileHandler`` (:issue:`1739`, :pr:`1742`) - deprecation: the ``gaiohttp`` worker is deprecated, see the :ref:`worker-class` documentation for more information (:issue:`1338`, :pr:`1418`, :pr:`1569`) ``` ### 19.7.1 ``` =================== - fix: continue if SO_REUSEPORT seems to be available but fails (:issue:`1480`) - fix: support non-decimal values for the umask command line option (:issue:`1325`) ``` ### 19.7.0 ``` =================== - The previously deprecated ``gunicorn_django`` command has been removed. Use the :ref:`gunicorn-cmd` command-line interface instead. - The previously deprecated ``django_settings`` setting has been removed. Use the :ref:`raw-env` setting instead. - The default value of :ref:`ssl-version` has been changed from ``ssl.PROTOCOL_TLSv1`` to ``ssl.PROTOCOL_SSLv23``. - fix: initialize the group access list when initgroups is set (:issue:`1297`) - add environment variables to gunicorn access log format (:issue:`1291`) - add --paste-global-conf option (:issue:`1304`) - fix: print access logs to STDOUT (:issue:`1184`) - remove upper limit on max header size config (:issue:`1313`) - fix: print original exception on AppImportError (:issue:`1334`) - use SO_REUSEPORT if available (:issue:`1344`) - `fix leak <https://github.com/benoitc/gunicorn/commit/b4c41481e2d5ef127199a4601417a6819053c3fd>`_ of duplicate file descriptor for bound sockets. - add --reload-engine option, support inotify and other backends (:issue:`1368`, :issue:`1459`) - fix: reject request with invalid HTTP versions - add ``child_exit`` callback (:issue:`1394`) - add support for eventlets _AlreadyHandled object (:issue:`1406`) - format boot tracebacks properly with reloader (:issue:`1408`) - refactor socket activation and fd inheritance for better support of SystemD (:issue:`1310`) - fix: o fds are given by default in gunicorn (:issue:`1423`) - add ability to pass settings to GUNICORN_CMD_ARGS environment variable which helps in container world (:issue:`1385`) - fix: catch access denied to pid file (:issue:`1091`) - many additions and improvements to the documentation Breaking Change +++++++++++++++ - **Python 2.6.0** is the last supported version ================ Changelog - 2018 ================ .. note:: Please see :doc:`news` for the latest changes ``` ### 19.6.0 ``` =================== Core & Logging ++++++++++++++ - improvement of the binary upgrade behaviour using USR2: remove file locking (:issue:`1270`) - add the ``--capture-output`` setting to capture stdout/stderr tot the log file (:issue:`1271`) - Allow disabling ``sendfile()`` via the ``SENDFILE`` environment variable (:issue:`1252`) - fix reload under pycharm (:issue:`1129`) Workers +++++++ - fix: make sure to remove the signal from the worker pipe (:issue:`1269`) - fix: **gthread** worker, handle removed socket in the select loop (:issue:`1258`) ``` ### 19.5.0 ``` =================== Core ++++ - fix: Ensure response to HEAD request won't have message body - fix: lock domain socket and remove on last arbiter exit (:issue:`1220`) - improvement: use EnvironmentError instead of socket.error (:issue:`939`) - add: new ``FORWARDED_ALLOW_IPS`` environment variable (:issue:`1205`) - fix: infinite recursion when destroying sockets (:issue:`1219`) - fix: close sockets on shutdown (:issue:`922`) - fix: clean up sys.exc_info calls to drop circular refs (:issue:`1228`) - fix: do post_worker_init after load_wsgi (:issue:`1248`) Workers +++++++ - fix access logging in gaiohttp worker (:issue:`1193`) - eventlet: handle QUIT in a new coroutine (:issue:`1217`) - gevent: remove obsolete exception clauses in run (:issue:`1218`) - tornado: fix extra "Server" response header (:issue:`1246`) - fix: unblock the wait loop under python 3.5 in sync worker (:issue:`1256`) Logging +++++++ - fix: log message for listener reloading (:issue:`1181`) - Let logging module handle traceback printing (:issue:`1201`) - improvement: Allow configuring logger_class with statsd_host (:issue:`1188`) - fix: traceback formatting (:issue:`1235`) - fix: print error logs on stderr and access logs on stdout (:issue:`1184`) Documentation +++++++++++++ - Simplify installation instructions in gunicorn.org (:issue:`1072`) - Fix URL and default worker type in example_config (:issue:`1209`) - update django doc url to 1.8 lts (:issue:`1213`) - fix: miscellaneous wording corrections (:issue:`1216`) - Add PSF License Agreement of selectors.py to NOTICE (:issue: `1226`) - document LOGGING overriding (:issue:`1051`) - put a note that error logs are only errors from Gunicorn (:issue:`1124`) - add a note about the requirements of the threads workers under python 2.x (:issue:`1200`) - add access_log_format to config example (:issue:`1251`) Tests +++++ - Use more pytest.raises() in test_http.py ``` ### 19.4.5 ``` =================== - fix: NameError fileno in gunicorn.http.wsgi (:issue:`1178`) ``` ### 19.4.4 ``` =================== - fix: check if a fileobject can be used with sendfile(2) (:issue:`1174`) - doc: be more descriptive in errorlog option (:issue:`1173`) ================ Changelog - 2017 ================ .. note:: Please see :doc:`news` for the latest changes ``` ### 19.4.3 ``` =================== - fix: don't check if a file is writable using os.stat with SELINUX (:issue:`1171`) ``` ### 19.4.2 ``` =================== Core ++++ - improvement: handle HaltServer in manage_workers (:issue:`1095`) - fix: Do not rely on sendfile sending requested count (:issue:`1155`) - fix: claridy --no-sendfile default (:issue:`1156`) - fix: LoggingCatch sendfile failure from no file descriptor (:issue:`1160`) Logging +++++++ - fix: Always send access log to syslog if syslog is on - fix: check auth before trying to own a file (:issue:`1157`) Documentation +++++++++++++ - fix: Fix Slowloris broken link. (:issue:`1142`) - Tweak markup in faq.rst Testing +++++++ - fix: gaiohttp test (:issue:`1164`) ``` ### 19.4.1 ``` =================== - fix tornado worker (:issue:`1154`) ``` ### 19.4.0 ``` =================== Core ++++ - fix: make sure that a user is able to access to the logs after dropping a privilege (:issue:`1116`) - improvement: inherit the `Exception` class where it needs to be (:issue:`997`) - fix: make sure headers are always encoded as latin1 RFC 2616 (:issue:`1102`) - improvement: reduce arbiter noise (:issue:`1078`) - fix: don't close the unix socket when the worker exit (:issue:`1088`) - improvement: Make last logged worker count an explicit instance var (:issue:`1078`) - improvement: prefix config file with its type (:issue:`836`) - improvement: pidfile handing (:issue:`1042`) - fix: catch OSError as well as ValueError on race condition (:issue:`1052`) - improve support of ipv6 by backporting urlparse.urlsplit from Python 2.7 to Python 2.6. - fix: raise InvalidRequestLine when the line contains malicious data (:issue:`1023`) - fix: fix argument to disable sendfile - fix: add gthread to the list of supported workers (:issue:`1011`) - improvement: retry socket binding up to five times upon EADDRNOTAVAIL (:issue:`1004`) - **breaking change**: only honor headers that can be encoded in ascii to comply to the RFC 7230 (See :issue:`1151`). Logging +++++++ - add new parameters to access log (:issue:`1132`) - fix: make sure that files handles are correctly reopened on HUP (:issue:`627`) - include request URL in error message (:issue:`1071`) - get username in access logs (:issue:`1069`) - fix statsd logging support on Python 3 (:issue:`1010`) Testing +++++++ - use last version of mock. - many fixes in Travis CI support - miscellaneous improvements in tests Thread worker +++++++++++++ - fix: Fix self.nr usage in ThreadedWorker so that auto restart works as expected (:issue:`1031`) Gevent worker +++++++++++++ - fix quit signal handling (:issue:`1128`) - add support for Python 3 (:issue:`1066`) - fix: make graceful shutdown thread-safe (:issue:`1032`) Tornado worker ++++++++++++++ - fix ssl options (:issue:`1146`, :issue:`1135`) - don't check timeout when stopping gracefully (:issue:`1106`) AIOHttp worker ++++++++++++++ - add SSL support (:issue:`1105`) Documentation +++++++++++++ - fix link to proc name setting (:issue:`1144`) - fix worker class documentation (:issue:`1141`, :issue:`1104`) - clarify graceful timeout documentation (:issue:`1137`) - don't duplicate NGINX config files examples (:issue:`1050`, :issue:`1048`) - add `web.py` framework example (:issue:`1117`) - update Debian/Ubuntu installations instructions (:issue:`1112`) - clarify `pythonpath` setting description (:issue:`1080`) - tweak some example for python3 - clarify `sendfile` documentation - miscellaneous typos in source code comments (thanks!) - clarify why REMOTE_ADD may not be the user's IP address (:issue:`1037`) Misc ++++ - fix: reloader should survive SyntaxError (:issue:`994`) - fix: expose the reloader class to the worker. ``` ### 19.3.0 ``` =================== Core ++++ - fix: :issue:`978` make sure a listener is inheritable - add `check_config` class method to workers - fix: :issue:`983` fix select timeout in sync worker with multiple connections - allows workers to access to the reloader. close :issue:`984` - raise TypeError instead of AssertionError Logging +++++++ - make Logger.loglevel a class attribute Documentation +++++++++++++ - fix: :issue:`988` fix syntax errors in examples/gunicorn_rc ``` ### 19.2.1 ``` ================== Logging +++++++ - expose loglevel in the Logger class AsyncIO worker (gaiohttp) +++++++++++++++++++++++++ - fix :issue:`977` fix initial crash Documentation +++++++++++++ - document security mailing-list in the contributing page. ``` ### 19.2 ``` ================= Core ++++ - optimize the sync workers when listening on a single interface - add `--sendfile` settings to enable/disable sendfile. fix :issue:`856` . - add the selectors module to the code base. :issue:`886` - add `--max-requests-jitter` setting to set the maximum jitter to add to the max-requests setting. - fix :issue:`899` propagate proxy_protocol_info to keep-alive requests - fix :issue:`863` worker timeout: dynamic timeout has been removed - fix: Avoid world writable file Logging +++++++ - fix :issue:`941` set logconfig default to paster more trivially - add statsd-prefix config setting: set the prefix to use when emitting statsd metrics - :issue:`832` log to console by default Thread Worker +++++++++++++ - fix :issue:`908` make sure the worker can continue to accept requests Eventlet Worker +++++++++++++++ - fix :issue:`867` Fix eventlet shutdown to actively shut down the workers. Documentation +++++++++++++ Many improvements and fixes have been done, see the detailed changelog for more information. ================ Changelog - 2016 ================ .. note:: Please see :doc:`news` for the latest changes ``` ### 19.1.1 ``` =================== Changes ------- Core ++++ - fix :issue:`835`: display correct pid of already running instance - fix :pr:`833`: fix `PyTest` class in setup.py. Logging +++++++ - fix :issue:`838`: statsd logger, send statsd timing metrics in milliseconds - fix :issue:`839`: statsd logger, allows for empty log message while pushing metrics and restore worker number in DEBUG logs - fix :issue:`850`: add timezone to logging - fix :issue:`853`: Respect logger_class setting unless statsd is on AioHttp worker ++++++++++++++ - fix :issue:`830` make sure gaiohttp worker is shipped with gunicorn. ``` ### 19.1 ``` ================= Changes ------- Core ++++ - fix :issue:`785`: handle binary type address given to a client socket address - fix graceful shutdown. make sure QUIT and TERMS signals are switched everywhere. - :issue:`799`: fix support loading config from module - :issue:`805`: fix check for file-like objects - fix :issue:`815`: args validation in WSGIApplication.init - fix :issue:`787`: check if we load a pyc file or not. Tornado worker ++++++++++++++ - fix :issue:`771`: support tornado 4.0 - fix :issue:`783`: x_headers error. The x-forwarded-headers option has been removed in `c4873681299212d6082cd9902740eef18c2f14f1 <https://github.com/benoitc/gunicorn/commit/c4873681299212d6082cd9902740eef18c2f14f1>`_. The discussion is available on :pr:`633`. AioHttp worker ++++++++++++++ - fix: fetch all body in input. fix :issue:`803` - fix: don't install the worker if python < 3.3 - fix :issue:`822`: Support UNIX sockets in gaiohttp worker Async worker ++++++++++++ - fix :issue:`790`: StopIteration shouldn't be catched at this level. Logging +++++++ - add statsd logging handler fix :issue:`748` Paster ++++++ - fix :issue:`809`: Set global logging configuration from a Paste config. Extra +++++ - fix RuntimeError in gunicorn.reloader (:issue:`807`) Documentation +++++++++++++ - update faq: put a note on how `watch logs in the console <http://docs.gunicorn.org/en/latest/faq.htmlwhy-i-don-t-see-any-logs-in-the-console>`_ since many people asked for it. ``` ### 19.0 ``` version improve a lot the usage of Gunicorn with python 3 by adding `two new workers <http://docs.gunicorn.org/en/latest/design.htmlasyncio-workers>`_ to it: `gthread` a fully threaded async worker using futures and `gaiohttp` a worker using asyncio. Breaking Changes ---------------- Switch QUIT and TERM signals ++++++++++++++++++++++++++++ With this change, when gunicorn receives a QUIT all the workers are killed immediately and exit and TERM is used for the graceful shutdown. Note: the old behaviour was based on the NGINX but the new one is more correct according the following doc: https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html also it is complying with the way the signals are sent by heroku: https://devcenter.heroku.com/articles/python-faqwhat-constraints-exist-when-developing-applications-on-heroku Deprecations ++++++++++++ `run_gunicorn`, `gunicorn_django` and `gunicorn_paster` are now completely deprecated and will be removed in the next release. Use the `gunicorn` command instead. Changes ------- core ++++ - add aiohttp worker named `gaiohttp` using asyncio. Full async worker on python 3. - fix HTTP-violating excess whitespace in write_error output - fix: try to log what happened in the worker after a timeout, add a `worker_abort` hook on SIGABRT signal. - fix: save listener socket name in workers so we can handle buffered keep-alive requests after the listener has closed. - add on_exit hook called just before exiting gunicorn. - add support for python 3.4 - fix: do not swallow unexpected errors when reaping - fix: remove incompatible SSL option with python 2.6 - add new async gthread worker and `--threads` options allows to set multiple threads to listen on connection - deprecate `gunicorn_django` and `gunicorn_paster` - switch QUIT and TERM signal - reap workers in SIGCHLD handler - add universal wheel support - use `email.utils.formatdate` in gunicorn.util.http_date - deprecate the `--debug` option - fix: log exceptions that occur after response start … - allows loading of applications from `.pyc` files (693) - fix: issue 691, raw_env config file parsing - use a dynamic timeout to wait for the optimal time. (Reduce power usage) - fix python3 support when notifying the arbiter - add: honor $WEB_CONCURRENCY environment variable. Useful for heroku setups. - add: include tz offset in access log - add: include access logs in the syslog handler. - add --reload option for code reloading - add the capability to load `gunicorn.base.Application` without the loading of the arguments of the command line. It allows you to :ref:`embed gunicorn in your own application <custom>`. - improve: set wsgi.multithread to True for async workers - fix logging: make sure to redirect wsgi.errors when needed - add: syslog logging can now be done to a unix socket - fix logging: don't try to redirect stdout/stderr to the logfile. - fix logging: don't propagate log - improve logging: file option can be overriden by the gunicorn options `--error-logfile` and `--access-logfile` if they are given. - fix: don't override SERVER_* by the Host header - fix: handle_error - add more option to configure SSL - fix: sendfile with SSL - add: worker_int callback (to react on SIGTERM) - fix: don't depend on entry point for internal classes, now absolute modules path can be given. - fix: Error messages are now encoded in latin1 - fix: request line length check - improvement: proxy_allow_ips: Allow proxy protocol if "*" specified - fix: run worker's `setup` method before setting num_workers - fix: FileWrapper inherit from `object` now - fix: Error messages are now encoded in latin1 - fix: don't spam the console on SIGWINCH. - fix: logging -don't stringify T and D logging atoms (621) - add support for the latest django version - deprecate `run_gunicorn` django option - fix: sys imported twice gevent worker +++++++++++++ - fix: make sure to stop all listeners - fix: monkey patching is now done in the worker - fix: "global name 'hub' is not defined" - fix: reinit `hub` on old versions of gevent - support gevent 1.0 - fix: add subprocess in monkey patching - fix: add support for multiple listener eventlet worker +++++++++++++++ - fix: merge duplicate EventletWorker.init_process method (fixes 657) - fix: missing errno import for eventlet sendfile patch - fix: add support for multiple listener tornado worker ++++++++++++++ - add graceful stop support ================ Changelog - 2015 ================ .. note:: Please see :doc:`news` for the latest changes. ``` ### 18.0 ``` ----------------- - new: add ``-e/--env`` command line argument to pass an environment variables to gunicorn - new: add ``--chdir`` command line argument to specified directory before apps loading. - new: add wsgi.file_wrapper support in async workers - new: add ``--paste`` command line argument to set the paster config file - deprecated: the command ``gunicorn_django`` is now deprecated. You should now run your application with the WSGI interface installed with your project (see https://docs.djangoproject.com/en/1.4/howto/deployment/wsgi/gunicorn/) for more infos. - deprecated: the command ``gunicorn_paste`` is deprecated. You now should use the new ``--paste`` argument to set the configuration file of your paster application. - fix: Removes unmatched leading quote from the beginning of the default access log format string - fix: null timeout - fix: gevent worker - fix: don't reload the paster app when using pserve - fix: after closing for error do not keep alive the connection - fix: responses 1xx, 204 and 304 should not force the connection to be closed ``` ### 17.5 ``` ------------------ - new: add signals documentation - new: add post_worker_init hook for workers - new: try to use gunicorn.conf.py in current folder as the default config file. - fix graceful timeout with the Eventlet worker - fix: don't raise an error when closing the socket if already closed - fix: fix --settings parameter for django application and try to find the django settings when using the ``gunicorn`` command. - fix: give the initial global_conf to paster application - fix: fix 'Expect: 100-continue' support on Python 3 New versionning: ++++++++++++++++ With this release, the versionning of Gunicorn is changing. Gunicorn is stable since a long time and there is no point to release a "1.0" now. It should have been done since a long time. 0.17 really meant it was the 17th stable version. From the beginning we have only 2 kind of releases: major release: releases with major changes or huge features added services releases: fixes and minor features added So from now we will apply the following versionning ``<major>.<service>``. For example ``17.5`` is a service release. ``` ### 0.17.4 ``` ------------------- - fix unix socket address parsing ``` ### 0.17.3 ``` ------------------- - add systemd sockets support - add ``python -m gunicorn.app.wsgiapp`` support - improve logger class inheritance - exit when the config file isn't found - add the -R option to enable stdio inheritance in daemon mode - don't close file descriptors > 3 in daemon mode - improve STDOUT/STDERR logging - fix pythonpath option - fix pidfile creation on Python 3 - fix gevent worker exit - fix ipv6 detection when the platform isn't supporting it ``` ### 0.17.2 ``` ------------------- - optimize readline - make imports errors more visible when loading an app or a logging class - fix tornado worker: don't pass ssl options if there are none - fix PEP3333: accept only bytetrings in the response body - fix support on CYGWIN platforms ``` ### 0.17.1 ``` ------------------- - add syslog facility name setting - fix ``--version`` command line argument - fix wsgi url_scheme for https ================ Changelog - 2014 ================ .. note:: Please see :doc:`news` for the latest changes. ``` ### 0.17.0 ``` ------------------- - allows gunicorn to bind to multiple address - add SSL support - add syslog support - add nworkers_changed hook - add response arg for post_request hook - parse command line with argparse (replace deprecated optparse) - fix PWD detection in arbiter - miscellaneous PEP8 fixes ``` ### 0.16.1 ``` ------------------- - Fix packaging ``` ### 0.16.0 ``` ------------------- - **Added support for Python 3.2 & 3.3** - Expose --pythonpath command to all gunicorn commands - Honor $PORT environment variable, useful for deployment on heroku - Removed support for Python 2.5 - Make sure we reopen the logs on the console - Fix django settings module detection from path - Reverted timeout for client socket. Fix issue on blocking issues. - Fixed gevent worker ``` ### 0.15.0 ``` ------------------- - new documentation site on http://docs.gunicorn.org - new website on http://gunicorn.org - add `haproxy PROXY protocol <http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt>`_ support - add ForwardedAllowIPS option: allows to filter Front-end's IPs allowed to handle X-Forwarded-* headers. - add callable hooks for paster config - add x-forwarded-proto as secure scheme default (Heroku is using this) - allows gunicorn to load a pre-compiled application - support file reopening & reexec for all loggers - initialize the logging config file with defaults. - set timeout for client socket (slow client DoS). - NoMoreData, ChunkMissingTerminator, InvalidChunkSize are now IOError exceptions - fix graceful shutdown in gevent - fix limit request line check ``` ### 0.14.6 ``` ------------------- - fix gevent & subproces - fix request line length check - fix keepalive = 0 - fix tornado worker ``` ### 0.14.5 ``` -------------------- - fix logging during daemonisation ``` ### 0.14.4 ``` ------------------- - new --graceful-timeout option - fix multiple issues with request limit - more fixes in django settings resolutions - fix gevent.core import - fix keepalive=0 in eventlet worker - fix handle_error display with the unix worker - fix tornado.wsgi.WSGIApplication calling error - **breaking change**: take the control on graceful reload back. graceful can't be overrided anymore using the on_reload function. ``` ### 0.14.3 ``` ------------------- - improvement: performance of http.body.Body.readline() - improvement: log HTTP errors in access log like Apache - improvement: display traceback when the worker fails to boot - improvement: makes gunicorn work with gevent 1.0 - examples: websocket example now supports hybi13 - fix: reopen log files after initialization - fix: websockets support - fix: django1.4 support - fix: only load the paster application 1 time ``` ### 0.14.2 ``` ------------------- - add validate_class validator: allows to use a class or a method to initialize the app during in-code configuration - add support for max_requests in tornado worker - add support for disabling x_forwarded_for_header in tornado worker - gevent_wsgi is now an alias of gevent_pywsgi - Fix gevent_pywsgi worker ``` ### 0.14.1 ``` ------------------- - fixing source archive, reducing its size ``` ### 0.14.0 ``` ------------------- - check if Request line is too large: You can now pass the parameter ``--limit-request-line`` or set the ``limit_request_line`` in your configuration file to set the max size of the request line in bytes. - limit the number of headers fields and their size. Add ``--limit-request-field`` and ``limit-request-field-size`` settings - add ``p`` variable to the log access format to log pidfile - add ``{HeaderName}o`` variable to the logo access format to log the response header HeaderName - request header is now logged with the variable ``{HeaderName}i`` in the access log file - improve error logging - support logging.configFile - support django 1.4 in both gunicorn_django & run_gunicorn command - improve reload in django run_gunicorn command (should just work now) - allows people to set the ``X-Forwarded-For`` header key and disable it by setting an empty string. - fix support of Tornado - many other fixes. Changelog - 2013 ================ ``` ### 0.13.4 ``` ------------------- - fix util.closerange function used to prevent leaking fds on python 2.5 (typo) ``` ### 0.13.3 ``` ------------------- - refactor gevent worker - prevent leaking fds on reexec - fix inverted request_time computation ``` ### 0.13.2 ``` ------------------- - Add support for Tornado 2.0 in tornado worker - Improve access logs: allows customisation of the log format & add request time - Logger module is now pluggable - Improve graceful shutdown in Python versions >= 2.6 - Fix post_request root arity for compatibility - Fix sendfile support - Fix Django reloading ``` ### 0.13.1 ``` ------------------- - Fix unix socket. log argument was missing. ``` ### 0.13.0 ``` ------------------- - Improve logging: allows file-reopening and add access log file compatible with the `apache combined log format <http://httpd.apache.org/docs/2.0/logs.htmlcombined>`_ - Add the possibility to set custom SSL headers. X-Forwarded-Protocol and X-Forwarded-SSL are still the default - New `on_reload` hook to customize how gunicorn spawn new workers on SIGHUP - Handle projects with relative path in django_gunicorn command - Preserve path parameters in PATH_INFO - post_request hook now accepts the environ as argument. - When stopping the arbiter, close the listener asap. - Fix Django command `run_gunicorn` in settings reloading - Fix Tornado_ worker exiting - Fix the use of sendfile in wsgi.file_wrapper ``` ### 0.12.2 ``` ------------------- - Add wsgi.file_wrapper optimised for FreeBSD, Linux & MacOSX (use sendfile if available) - Fix django run_gunicorn command. Make sure we reload the application code. - Fix django localisation - Compatible with gevent 0.14dev ``` ### 0.12.1 ``` ------------------- - Add "on_starting" hook. This hook can be used to set anything before the arbiter really start - Support bdist_rpm in setup - Improve content-length handling (pep 3333) - Improve Django support - Fix daemonizing (142) - Fix ipv6 handling .. _Tornado: http://www.tornadoweb.org/ Changelog - 2012 ================ ``` ### 0.12.0 ``` ------------------- - Add support for logging configuration using a ini file. It uses the standard Python logging's module Configuration file format and allows anyone to use his custom file handler - Add IPV6 support - Add multidomain application example - Improve gunicorn_django command when importing settings module using DJANGO_SETTINGS_MODULE environment variable - Send appropriate error status on http parsing - Fix pidfile, set permissions so other user can read it and use it. - Fix temporary file leaking - Fix setpgrp issue, can now be launched via ubuntu upstart - Set the number of workers to zero on WINCH ``` ### 0.11.2 ``` ------------------- * Add SERVER_SOFTWARE to the os.environ * Add support for django settings environment variable * Add support for logging configuration in Paster ini-files * Improve arbiter notification in asynchronous workers * Display the right error when a worker can't be used * Fix Django support * Fix HUP with Paster applications * Fix readline in wsgi.input ``` ### 0.11.1 ``` ------------------- * Implement max-requests feature to prevent memory leaks. * Added 'worker_exit' server hook. * Reseed the random number generator after fork(). * Improve Eventlet worker. * Fix Django command `run_gunicorn`. * Fix the default proc name internal setting. * Workaround to prevent Gevent worker to segfault on MacOSX. ``` ### 0.11.0 ``` ------------------- * Improve dramatically performances of Gevent and Eventlet workers * Optimize HTTP parsing * Drop Server and Date headers in start_response when provided. * Fix latency issue in async workers ``` ### 0.10.1 ``` ------------------- * Improve gevent's workers. Add "egg:gunicorngevent_wsgi" worker using `gevent.wsgi <http://www.gevent.org/gevent.wsgi.html>`_ and "egg:gunicorngevent_pywsgi" worker using `gevent.pywsgi <http://www.gevent.org/gevent.pywsgi.html>`_ . **"egg:gunicorngevent"** using our own HTTP parser is still here and is **recommended** for normal uses. Use the "gevent.wsgi" parser if you need really fast connections and don't need streaming, keepalive or ssl. * Add pre/post request hooks * Exit more quietly * Fix gevent dns issue ``` ### 0.10.0 ``` ------------------- * New HTTP parser. * New HUP behaviour. Re-reads the configuration and then reloads all worker processes without changing the master process id. Helpful for code reloading and monitoring applications like supervisord and runit. * Added a preload configuration parameter. By default, application code is now loaded after a worker forks. This couple with the new HUP handling can be used for dev servers to do hot code reloading. Using the preload flag can help a bit in small memory VM's. * Allow people to pass command line arguments to WSGI applications. See: `examples/alt_spec.py <http://github.com/benoitc/gunicorn/raw/master/examples/alt_spec.py>`_ * Added an example gevent reloader configuration: `examples/example_gevent_reloader.py <http://github.com/benoitc/gunicorn/blob/master/examples/example_gevent_reloader.py>`_. * New gevent worker "egg:gunicorngevent2", working with gevent.wsgi. * Internal refactoring and various bug fixes. * New documentation website. ``` ### 0.9.1 ``` ------------------ * Support https via X-Forwarded-Protocol or X-Forwarded-Ssl headers * Fix configuration * Remove -d options which was used instead of -D for daemon. * Fix umask in unix socket ``` ### 0.9.0 ``` ------------------ * Added *when_ready* hook. Called just after the server is started * Added *preload* setting. Load application code before the worker processes are forked. * Refactored Config * Fix pidfile * Fix QUIT/HUP in async workers * Fix reexec * Documentation improvements ``` ### 0.8.1 ``` ------------------ * Fix builtins import in config * Fix installation with pip * Fix Tornado WSGI support * Delay application loading until after processing all configuration ``` ### 0.8.0 ``` ------------------ * Refactored Worker management for better async support. Now use the -k option to set the type of request processing to use * Added support for Tornado_ ``` ### 0.7.2 ``` ------------------ * Added --spew option to help debugging (installs a system trace hook) * Some fixes in async arbiters * Fix a bug in start_response on error ``` ### 0.7.1 ``` ------------------ * Fix bug when responses have no body. ``` ### 0.7.0 ``` ------------------ * Added support for Eventlet_ and Gevent_ based workers. * Added Websockets_ support * Fix Chunked Encoding * Fix SIGWINCH on OpenBSD_ * Fix `PEP 333`_ compliance for the write callable. ``` ### 0.6.5 ``` ------------------ * Fix pidfile handling * Fix Exception Error ``` ### 0.6.4 ``` ------------------ * Use cStringIO for performance when possible. * Fix worker freeze when a remote connection closes unexpectedly. ``` ### 0.6.3 ``` ------------------ * Make HTTP parsing faster. * Various bug fixes ``` ### 0.6.2 ``` ------------------ * Added support for chunked response. * Added proc_name option to the config file. * Improved the HTTP parser. It now uses buffers instead of strings to store temporary data. * Improved performance when sending responses. * Workers are now murdered by age (the oldest is killed first). ``` ### 0.6.1 ``` ------------------ * Added gunicorn config file support for Django admin command * Fix gunicorn config file. -c was broken. * Removed TTIN/TTOU from workers which blocked other signals. ``` ### 0.6.0 ``` ------------------ * Added setproctitle support * Change privilege switch behavior. We now work like NGINX, master keeps the permissions, new uid/gid permissions are only set for workers. ``` ### 0.5.1 ``` ------------------ * Fix umask * Added Debian packaging ``` ### 0.5.0 ``` ------------------ * Added `configuration file <configuration.html>`_ handler. * Added support for pre/post fork hooks * Added support for before_exec hook * Added support for unix sockets * Added launch of workers processes under different user/group * Added umask option * Added SCRIPT_NAME support * Better support of some exotic settings for Django projects * Better support of Paste-compatible applications * Some refactoring to make the code easier to hack * Allow multiple keys in request and response headers .. _Tornado: http://www.tornadoweb.org/ .. _`PEP 333`: https://www.python.org/dev/peps/pep-0333/ .. _Eventlet: http://eventlet.net/ .. _Gevent: http://www.gevent.org/ .. _OpenBSD: https://www.openbsd.org/ .. _Websockets: https://html.spec.whatwg.org/multipage/web-sockets.html Changelog - 2011 ================ ```Links
- PyPI: https://pypi.org/project/gunicorn - Changelog: https://pyup.io/changelogs/gunicorn/ - Homepage: http://gunicorn.org