You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1951 lines
						
					
					
						
							52 KiB
						
					
					
				
			
		
		
	
	
							1951 lines
						
					
					
						
							52 KiB
						
					
					
				# -*- coding: utf-8 -
 | 
						|
#
 | 
						|
# This file is part of gunicorn released under the MIT license.
 | 
						|
# See the NOTICE for more information.
 | 
						|
 | 
						|
# Please remember to run "make -C docs html" after update "desc" attributes.
 | 
						|
 | 
						|
import copy
 | 
						|
import grp
 | 
						|
import inspect
 | 
						|
try:
 | 
						|
    import argparse
 | 
						|
except ImportError:  # python 2.6
 | 
						|
    from . import argparse_compat as argparse
 | 
						|
import os
 | 
						|
import pwd
 | 
						|
import re
 | 
						|
import ssl
 | 
						|
import sys
 | 
						|
import textwrap
 | 
						|
import shlex
 | 
						|
 | 
						|
from gunicorn import __version__
 | 
						|
from gunicorn import _compat
 | 
						|
from gunicorn.errors import ConfigError
 | 
						|
from gunicorn.reloader import reloader_engines
 | 
						|
from gunicorn import six
 | 
						|
from gunicorn import util
 | 
						|
 | 
						|
KNOWN_SETTINGS = []
 | 
						|
PLATFORM = sys.platform
 | 
						|
 | 
						|
 | 
						|
def make_settings(ignore=None):
 | 
						|
    settings = {}
 | 
						|
    ignore = ignore or ()
 | 
						|
    for s in KNOWN_SETTINGS:
 | 
						|
        setting = s()
 | 
						|
        if setting.name in ignore:
 | 
						|
            continue
 | 
						|
        settings[setting.name] = setting.copy()
 | 
						|
    return settings
 | 
						|
 | 
						|
 | 
						|
def auto_int(_, x):
 | 
						|
    # for compatible with octal numbers in python3
 | 
						|
    if re.match(r'0(\d)', x, re.IGNORECASE):
 | 
						|
        x = x.replace('0', '0o', 1)
 | 
						|
    return int(x, 0)
 | 
						|
 | 
						|
 | 
						|
class Config(object):
 | 
						|
 | 
						|
    def __init__(self, usage=None, prog=None):
 | 
						|
        self.settings = make_settings()
 | 
						|
        self.usage = usage
 | 
						|
        self.prog = prog or os.path.basename(sys.argv[0])
 | 
						|
        self.env_orig = os.environ.copy()
 | 
						|
 | 
						|
    def __getattr__(self, name):
 | 
						|
        if name not in self.settings:
 | 
						|
            raise AttributeError("No configuration setting for: %s" % name)
 | 
						|
        return self.settings[name].get()
 | 
						|
 | 
						|
    def __setattr__(self, name, value):
 | 
						|
        if name != "settings" and name in self.settings:
 | 
						|
            raise AttributeError("Invalid access!")
 | 
						|
        super(Config, self).__setattr__(name, value)
 | 
						|
 | 
						|
    def set(self, name, value):
 | 
						|
        if name not in self.settings:
 | 
						|
            raise AttributeError("No configuration setting for: %s" % name)
 | 
						|
        self.settings[name].set(value)
 | 
						|
 | 
						|
    def get_cmd_args_from_env(self):
 | 
						|
        if 'GUNICORN_CMD_ARGS' in self.env_orig:
 | 
						|
            return shlex.split(self.env_orig['GUNICORN_CMD_ARGS'])
 | 
						|
        return []
 | 
						|
 | 
						|
    def parser(self):
 | 
						|
        kwargs = {
 | 
						|
            "usage": self.usage,
 | 
						|
            "prog": self.prog
 | 
						|
        }
 | 
						|
        parser = argparse.ArgumentParser(**kwargs)
 | 
						|
        parser.add_argument("-v", "--version",
 | 
						|
                action="version", default=argparse.SUPPRESS,
 | 
						|
                version="%(prog)s (version " + __version__ + ")\n",
 | 
						|
                help="show program's version number and exit")
 | 
						|
        parser.add_argument("args", nargs="*", help=argparse.SUPPRESS)
 | 
						|
 | 
						|
        keys = sorted(self.settings, key=self.settings.__getitem__)
 | 
						|
        for k in keys:
 | 
						|
            self.settings[k].add_option(parser)
 | 
						|
 | 
						|
        return parser
 | 
						|
 | 
						|
    @property
 | 
						|
    def worker_class_str(self):
 | 
						|
        uri = self.settings['worker_class'].get()
 | 
						|
 | 
						|
        ## are we using a threaded worker?
 | 
						|
        is_sync = uri.endswith('SyncWorker') or uri == 'sync'
 | 
						|
        if is_sync and self.threads > 1:
 | 
						|
            return "threads"
 | 
						|
        return uri
 | 
						|
 | 
						|
    @property
 | 
						|
    def worker_class(self):
 | 
						|
        uri = self.settings['worker_class'].get()
 | 
						|
 | 
						|
        ## are we using a threaded worker?
 | 
						|
        is_sync = uri.endswith('SyncWorker') or uri == 'sync'
 | 
						|
        if is_sync and self.threads > 1:
 | 
						|
            uri = "gunicorn.workers.gthread.ThreadWorker"
 | 
						|
 | 
						|
        worker_class = util.load_class(uri)
 | 
						|
        if hasattr(worker_class, "setup"):
 | 
						|
            worker_class.setup()
 | 
						|
        return worker_class
 | 
						|
 | 
						|
    @property
 | 
						|
    def address(self):
 | 
						|
        s = self.settings['bind'].get()
 | 
						|
        return [util.parse_address(_compat.bytes_to_str(bind)) for bind in s]
 | 
						|
 | 
						|
    @property
 | 
						|
    def uid(self):
 | 
						|
        return self.settings['user'].get()
 | 
						|
 | 
						|
    @property
 | 
						|
    def gid(self):
 | 
						|
        return self.settings['group'].get()
 | 
						|
 | 
						|
    @property
 | 
						|
    def proc_name(self):
 | 
						|
        pn = self.settings['proc_name'].get()
 | 
						|
        if pn is not None:
 | 
						|
            return pn
 | 
						|
        else:
 | 
						|
            return self.settings['default_proc_name'].get()
 | 
						|
 | 
						|
    @property
 | 
						|
    def logger_class(self):
 | 
						|
        uri = self.settings['logger_class'].get()
 | 
						|
        if uri == "simple":
 | 
						|
            # support the default
 | 
						|
            uri = LoggerClass.default
 | 
						|
 | 
						|
        # if default logger is in use, and statsd is on, automagically switch
 | 
						|
        # to the statsd logger
 | 
						|
        if uri == LoggerClass.default:
 | 
						|
            if 'statsd_host' in self.settings and self.settings['statsd_host'].value is not None:
 | 
						|
                uri = "gunicorn.instrument.statsd.Statsd"
 | 
						|
 | 
						|
        logger_class = util.load_class(
 | 
						|
            uri,
 | 
						|
            default="gunicorn.glogging.Logger",
 | 
						|
            section="gunicorn.loggers")
 | 
						|
 | 
						|
        if hasattr(logger_class, "install"):
 | 
						|
            logger_class.install()
 | 
						|
        return logger_class
 | 
						|
 | 
						|
    @property
 | 
						|
    def is_ssl(self):
 | 
						|
        return self.certfile or self.keyfile
 | 
						|
 | 
						|
    @property
 | 
						|
    def ssl_options(self):
 | 
						|
        opts = {}
 | 
						|
        for name, value in self.settings.items():
 | 
						|
            if value.section == 'SSL':
 | 
						|
                opts[name] = value.get()
 | 
						|
        return opts
 | 
						|
 | 
						|
    @property
 | 
						|
    def env(self):
 | 
						|
        raw_env = self.settings['raw_env'].get()
 | 
						|
        env = {}
 | 
						|
 | 
						|
        if not raw_env:
 | 
						|
            return env
 | 
						|
 | 
						|
        for e in raw_env:
 | 
						|
            s = _compat.bytes_to_str(e)
 | 
						|
            try:
 | 
						|
                k, v = s.split('=', 1)
 | 
						|
            except ValueError:
 | 
						|
                raise RuntimeError("environment setting %r invalid" % s)
 | 
						|
 | 
						|
            env[k] = v
 | 
						|
 | 
						|
        return env
 | 
						|
 | 
						|
    @property
 | 
						|
    def sendfile(self):
 | 
						|
        if self.settings['sendfile'].get() is not None:
 | 
						|
            return False
 | 
						|
 | 
						|
        if 'SENDFILE' in os.environ:
 | 
						|
            sendfile = os.environ['SENDFILE'].lower()
 | 
						|
            return sendfile in ['y', '1', 'yes', 'true']
 | 
						|
 | 
						|
        return True
 | 
						|
 | 
						|
    @property
 | 
						|
    def reuse_port(self):
 | 
						|
        return self.settings['reuse_port'].get()
 | 
						|
 | 
						|
    @property
 | 
						|
    def paste_global_conf(self):
 | 
						|
        raw_global_conf = self.settings['raw_paste_global_conf'].get()
 | 
						|
        if raw_global_conf is None:
 | 
						|
            return None
 | 
						|
 | 
						|
        global_conf = {}
 | 
						|
        for e in raw_global_conf:
 | 
						|
            s = _compat.bytes_to_str(e)
 | 
						|
            try:
 | 
						|
                k, v = re.split(r'(?<!\\)=', s, 1)
 | 
						|
            except ValueError:
 | 
						|
                raise RuntimeError("environment setting %r invalid" % s)
 | 
						|
            k = k.replace('\\=', '=')
 | 
						|
            v = v.replace('\\=', '=')
 | 
						|
            global_conf[k] = v
 | 
						|
 | 
						|
        return global_conf
 | 
						|
 | 
						|
 | 
						|
class SettingMeta(type):
 | 
						|
    def __new__(cls, name, bases, attrs):
 | 
						|
        super_new = super(SettingMeta, cls).__new__
 | 
						|
        parents = [b for b in bases if isinstance(b, SettingMeta)]
 | 
						|
        if not parents:
 | 
						|
            return super_new(cls, name, bases, attrs)
 | 
						|
 | 
						|
        attrs["order"] = len(KNOWN_SETTINGS)
 | 
						|
        attrs["validator"] = staticmethod(attrs["validator"])
 | 
						|
 | 
						|
        new_class = super_new(cls, name, bases, attrs)
 | 
						|
        new_class.fmt_desc(attrs.get("desc", ""))
 | 
						|
        KNOWN_SETTINGS.append(new_class)
 | 
						|
        return new_class
 | 
						|
 | 
						|
    def fmt_desc(cls, desc):
 | 
						|
        desc = textwrap.dedent(desc).strip()
 | 
						|
        setattr(cls, "desc", desc)
 | 
						|
        setattr(cls, "short", desc.splitlines()[0])
 | 
						|
 | 
						|
 | 
						|
class Setting(object):
 | 
						|
    name = None
 | 
						|
    value = None
 | 
						|
    section = None
 | 
						|
    cli = None
 | 
						|
    validator = None
 | 
						|
    type = None
 | 
						|
    meta = None
 | 
						|
    action = None
 | 
						|
    default = None
 | 
						|
    short = None
 | 
						|
    desc = None
 | 
						|
    nargs = None
 | 
						|
    const = None
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        if self.default is not None:
 | 
						|
            self.set(self.default)
 | 
						|
 | 
						|
    def add_option(self, parser):
 | 
						|
        if not self.cli:
 | 
						|
            return
 | 
						|
        args = tuple(self.cli)
 | 
						|
 | 
						|
        help_txt = "%s [%s]" % (self.short, self.default)
 | 
						|
        help_txt = help_txt.replace("%", "%%")
 | 
						|
 | 
						|
        kwargs = {
 | 
						|
            "dest": self.name,
 | 
						|
            "action": self.action or "store",
 | 
						|
            "type": self.type or str,
 | 
						|
            "default": None,
 | 
						|
            "help": help_txt
 | 
						|
        }
 | 
						|
 | 
						|
        if self.meta is not None:
 | 
						|
            kwargs['metavar'] = self.meta
 | 
						|
 | 
						|
        if kwargs["action"] != "store":
 | 
						|
            kwargs.pop("type")
 | 
						|
 | 
						|
        if self.nargs is not None:
 | 
						|
            kwargs["nargs"] = self.nargs
 | 
						|
 | 
						|
        if self.const is not None:
 | 
						|
            kwargs["const"] = self.const
 | 
						|
 | 
						|
        parser.add_argument(*args, **kwargs)
 | 
						|
 | 
						|
    def copy(self):
 | 
						|
        return copy.copy(self)
 | 
						|
 | 
						|
    def get(self):
 | 
						|
        return self.value
 | 
						|
 | 
						|
    def set(self, val):
 | 
						|
        if not six.callable(self.validator):
 | 
						|
            raise TypeError('Invalid validator: %s' % self.name)
 | 
						|
        self.value = self.validator(val)
 | 
						|
 | 
						|
    def __lt__(self, other):
 | 
						|
        return (self.section == other.section and
 | 
						|
                self.order < other.order)
 | 
						|
    __cmp__ = __lt__
 | 
						|
 | 
						|
Setting = SettingMeta('Setting', (Setting,), {})
 | 
						|
 | 
						|
 | 
						|
def validate_bool(val):
 | 
						|
    if val is None:
 | 
						|
        return
 | 
						|
 | 
						|
    if isinstance(val, bool):
 | 
						|
        return val
 | 
						|
    if not isinstance(val, six.string_types):
 | 
						|
        raise TypeError("Invalid type for casting: %s" % val)
 | 
						|
    if val.lower().strip() == "true":
 | 
						|
        return True
 | 
						|
    elif val.lower().strip() == "false":
 | 
						|
        return False
 | 
						|
    else:
 | 
						|
        raise ValueError("Invalid boolean: %s" % val)
 | 
						|
 | 
						|
 | 
						|
def validate_dict(val):
 | 
						|
    if not isinstance(val, dict):
 | 
						|
        raise TypeError("Value is not a dictionary: %s " % val)
 | 
						|
    return val
 | 
						|
 | 
						|
 | 
						|
def validate_pos_int(val):
 | 
						|
    if not isinstance(val, six.integer_types):
 | 
						|
        val = int(val, 0)
 | 
						|
    else:
 | 
						|
        # Booleans are ints!
 | 
						|
        val = int(val)
 | 
						|
    if val < 0:
 | 
						|
        raise ValueError("Value must be positive: %s" % val)
 | 
						|
    return val
 | 
						|
 | 
						|
 | 
						|
def validate_string(val):
 | 
						|
    if val is None:
 | 
						|
        return None
 | 
						|
    if not isinstance(val, six.string_types):
 | 
						|
        raise TypeError("Not a string: %s" % val)
 | 
						|
    return val.strip()
 | 
						|
 | 
						|
 | 
						|
def validate_file_exists(val):
 | 
						|
    if val is None:
 | 
						|
        return None
 | 
						|
    if not os.path.exists(val):
 | 
						|
        raise ValueError("File %s does not exists." % val)
 | 
						|
    return val
 | 
						|
 | 
						|
 | 
						|
def validate_list_string(val):
 | 
						|
    if not val:
 | 
						|
        return []
 | 
						|
 | 
						|
    # legacy syntax
 | 
						|
    if isinstance(val, six.string_types):
 | 
						|
        val = [val]
 | 
						|
 | 
						|
    return [validate_string(v) for v in val]
 | 
						|
 | 
						|
 | 
						|
def validate_list_of_existing_files(val):
 | 
						|
    return [validate_file_exists(v) for v in validate_list_string(val)]
 | 
						|
 | 
						|
 | 
						|
def validate_string_to_list(val):
 | 
						|
    val = validate_string(val)
 | 
						|
 | 
						|
    if not val:
 | 
						|
        return []
 | 
						|
 | 
						|
    return [v.strip() for v in val.split(",") if v]
 | 
						|
 | 
						|
 | 
						|
def validate_class(val):
 | 
						|
    if inspect.isfunction(val) or inspect.ismethod(val):
 | 
						|
        val = val()
 | 
						|
    if inspect.isclass(val):
 | 
						|
        return val
 | 
						|
    return validate_string(val)
 | 
						|
 | 
						|
 | 
						|
def validate_callable(arity):
 | 
						|
    def _validate_callable(val):
 | 
						|
        if isinstance(val, six.string_types):
 | 
						|
            try:
 | 
						|
                mod_name, obj_name = val.rsplit(".", 1)
 | 
						|
            except ValueError:
 | 
						|
                raise TypeError("Value '%s' is not import string. "
 | 
						|
                                "Format: module[.submodules...].object" % val)
 | 
						|
            try:
 | 
						|
                mod = __import__(mod_name, fromlist=[obj_name])
 | 
						|
                val = getattr(mod, obj_name)
 | 
						|
            except ImportError as e:
 | 
						|
                raise TypeError(str(e))
 | 
						|
            except AttributeError:
 | 
						|
                raise TypeError("Can not load '%s' from '%s'"
 | 
						|
                    "" % (obj_name, mod_name))
 | 
						|
        if not six.callable(val):
 | 
						|
            raise TypeError("Value is not six.callable: %s" % val)
 | 
						|
        if arity != -1 and arity != _compat.get_arity(val):
 | 
						|
            raise TypeError("Value must have an arity of: %s" % arity)
 | 
						|
        return val
 | 
						|
    return _validate_callable
 | 
						|
 | 
						|
 | 
						|
def validate_user(val):
 | 
						|
    if val is None:
 | 
						|
        return os.geteuid()
 | 
						|
    if isinstance(val, int):
 | 
						|
        return val
 | 
						|
    elif val.isdigit():
 | 
						|
        return int(val)
 | 
						|
    else:
 | 
						|
        try:
 | 
						|
            return pwd.getpwnam(val).pw_uid
 | 
						|
        except KeyError:
 | 
						|
            raise ConfigError("No such user: '%s'" % val)
 | 
						|
 | 
						|
 | 
						|
def validate_group(val):
 | 
						|
    if val is None:
 | 
						|
        return os.getegid()
 | 
						|
 | 
						|
    if isinstance(val, int):
 | 
						|
        return val
 | 
						|
    elif val.isdigit():
 | 
						|
        return int(val)
 | 
						|
    else:
 | 
						|
        try:
 | 
						|
            return grp.getgrnam(val).gr_gid
 | 
						|
        except KeyError:
 | 
						|
            raise ConfigError("No such group: '%s'" % val)
 | 
						|
 | 
						|
 | 
						|
def validate_post_request(val):
 | 
						|
    val = validate_callable(-1)(val)
 | 
						|
 | 
						|
    largs = _compat.get_arity(val)
 | 
						|
    if largs == 4:
 | 
						|
        return val
 | 
						|
    elif largs == 3:
 | 
						|
        return lambda worker, req, env, _r: val(worker, req, env)
 | 
						|
    elif largs == 2:
 | 
						|
        return lambda worker, req, _e, _r: val(worker, req)
 | 
						|
    else:
 | 
						|
        raise TypeError("Value must have an arity of: 4")
 | 
						|
 | 
						|
 | 
						|
def validate_chdir(val):
 | 
						|
    # valid if the value is a string
 | 
						|
    val = validate_string(val)
 | 
						|
 | 
						|
    # transform relative paths
 | 
						|
    path = os.path.abspath(os.path.normpath(os.path.join(util.getcwd(), val)))
 | 
						|
 | 
						|
    # test if the path exists
 | 
						|
    if not os.path.exists(path):
 | 
						|
        raise ConfigError("can't chdir to %r" % val)
 | 
						|
 | 
						|
    return path
 | 
						|
 | 
						|
 | 
						|
def validate_hostport(val):
 | 
						|
    val = validate_string(val)
 | 
						|
    if val is None:
 | 
						|
        return None
 | 
						|
    elements = val.split(":")
 | 
						|
    if len(elements) == 2:
 | 
						|
        return (elements[0], int(elements[1]))
 | 
						|
    else:
 | 
						|
        raise TypeError("Value must consist of: hostname:port")
 | 
						|
 | 
						|
 | 
						|
def validate_reload_engine(val):
 | 
						|
    if val not in reloader_engines:
 | 
						|
        raise ConfigError("Invalid reload_engine: %r" % val)
 | 
						|
 | 
						|
    return val
 | 
						|
 | 
						|
 | 
						|
def get_default_config_file():
 | 
						|
    config_path = os.path.join(os.path.abspath(os.getcwd()),
 | 
						|
            'gunicorn.conf.py')
 | 
						|
    if os.path.exists(config_path):
 | 
						|
        return config_path
 | 
						|
    return None
 | 
						|
 | 
						|
 | 
						|
class ConfigFile(Setting):
 | 
						|
    name = "config"
 | 
						|
    section = "Config File"
 | 
						|
    cli = ["-c", "--config"]
 | 
						|
    meta = "CONFIG"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
        The Gunicorn config file.
 | 
						|
 | 
						|
        A string of the form ``PATH``, ``file:PATH``, or ``python:MODULE_NAME``.
 | 
						|
 | 
						|
        Only has an effect when specified on the command line or as part of an
 | 
						|
        application specific configuration.
 | 
						|
 | 
						|
        .. versionchanged:: 19.4
 | 
						|
           Loading the config from a Python module requires the ``python:``
 | 
						|
           prefix.
 | 
						|
        """
 | 
						|
 | 
						|
class Bind(Setting):
 | 
						|
    name = "bind"
 | 
						|
    action = "append"
 | 
						|
    section = "Server Socket"
 | 
						|
    cli = ["-b", "--bind"]
 | 
						|
    meta = "ADDRESS"
 | 
						|
    validator = validate_list_string
 | 
						|
 | 
						|
    if 'PORT' in os.environ:
 | 
						|
        default = ['0.0.0.0:{0}'.format(os.environ.get('PORT'))]
 | 
						|
    else:
 | 
						|
        default = ['127.0.0.1:8000']
 | 
						|
 | 
						|
    desc = """\
 | 
						|
        The socket to bind.
 | 
						|
 | 
						|
        A string of the form: ``HOST``, ``HOST:PORT``, ``unix:PATH``. An IP is
 | 
						|
        a valid ``HOST``.
 | 
						|
 | 
						|
        Multiple addresses can be bound. ex.::
 | 
						|
 | 
						|
            $ gunicorn -b 127.0.0.1:8000 -b [::1]:8000 test:app
 | 
						|
 | 
						|
        will bind the `test:app` application on localhost both on ipv6
 | 
						|
        and ipv4 interfaces.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Backlog(Setting):
 | 
						|
    name = "backlog"
 | 
						|
    section = "Server Socket"
 | 
						|
    cli = ["--backlog"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 2048
 | 
						|
    desc = """\
 | 
						|
        The maximum number of pending connections.
 | 
						|
 | 
						|
        This refers to the number of clients that can be waiting to be served.
 | 
						|
        Exceeding this number results in the client getting an error when
 | 
						|
        attempting to connect. It should only affect servers under significant
 | 
						|
        load.
 | 
						|
 | 
						|
        Must be a positive integer. Generally set in the 64-2048 range.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Workers(Setting):
 | 
						|
    name = "workers"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["-w", "--workers"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = int(os.environ.get("WEB_CONCURRENCY", 1))
 | 
						|
    desc = """\
 | 
						|
        The number of worker processes for handling requests.
 | 
						|
 | 
						|
        A positive integer generally in the ``2-4 x $(NUM_CORES)`` range.
 | 
						|
        You'll want to vary this a bit to find the best for your particular
 | 
						|
        application's work load.
 | 
						|
 | 
						|
        By default, the value of the ``WEB_CONCURRENCY`` environment variable.
 | 
						|
        If it is not defined, the default is ``1``.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class WorkerClass(Setting):
 | 
						|
    name = "worker_class"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["-k", "--worker-class"]
 | 
						|
    meta = "STRING"
 | 
						|
    validator = validate_class
 | 
						|
    default = "sync"
 | 
						|
    desc = """\
 | 
						|
        The type of workers to use.
 | 
						|
 | 
						|
        The default class (``sync``) should handle most "normal" types of
 | 
						|
        workloads. You'll want to read :doc:`design` for information on when
 | 
						|
        you might want to choose one of the other worker classes. Required
 | 
						|
        libraries may be installed using setuptools' ``extra_require`` feature.
 | 
						|
 | 
						|
        A string referring to one of the following bundled classes:
 | 
						|
 | 
						|
        * ``sync``
 | 
						|
        * ``eventlet`` - Requires eventlet >= 0.9.7 (or install it via 
 | 
						|
          ``pip install gunicorn[eventlet]``)
 | 
						|
        * ``gevent``   - Requires gevent >= 0.13 (or install it via 
 | 
						|
          ``pip install gunicorn[gevent]``)
 | 
						|
        * ``tornado``  - Requires tornado >= 0.2 (or install it via 
 | 
						|
          ``pip install gunicorn[tornado]``)
 | 
						|
        * ``gthread``  - Python 2 requires the futures package to be installed
 | 
						|
          (or install it via ``pip install gunicorn[gthread]``)
 | 
						|
        * ``gaiohttp`` - Deprecated.
 | 
						|
 | 
						|
        Optionally, you can provide your own worker by giving Gunicorn a
 | 
						|
        Python path to a subclass of ``gunicorn.workers.base.Worker``.
 | 
						|
        This alternative syntax will load the gevent class:
 | 
						|
        ``gunicorn.workers.ggevent.GeventWorker``.
 | 
						|
 | 
						|
        .. deprecated:: 19.8
 | 
						|
           The ``gaiohttp`` worker is deprecated. Please use
 | 
						|
           ``aiohttp.worker.GunicornWebWorker`` instead. See
 | 
						|
           :ref:`asyncio-workers` for more information on how to use it.
 | 
						|
        """
 | 
						|
 | 
						|
class WorkerThreads(Setting):
 | 
						|
    name = "threads"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["--threads"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 1
 | 
						|
    desc = """\
 | 
						|
        The number of worker threads for handling requests.
 | 
						|
 | 
						|
        Run each worker with the specified number of threads.
 | 
						|
 | 
						|
        A positive integer generally in the ``2-4 x $(NUM_CORES)`` range.
 | 
						|
        You'll want to vary this a bit to find the best for your particular
 | 
						|
        application's work load.
 | 
						|
 | 
						|
        If it is not defined, the default is ``1``.
 | 
						|
 | 
						|
        This setting only affects the Gthread worker type.
 | 
						|
        
 | 
						|
        .. note::
 | 
						|
           If you try to use the ``sync`` worker type and set the ``threads``
 | 
						|
           setting to more than 1, the ``gthread`` worker type will be used
 | 
						|
           instead.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class WorkerConnections(Setting):
 | 
						|
    name = "worker_connections"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["--worker-connections"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 1000
 | 
						|
    desc = """\
 | 
						|
        The maximum number of simultaneous clients.
 | 
						|
 | 
						|
        This setting only affects the Eventlet and Gevent worker types.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class MaxRequests(Setting):
 | 
						|
    name = "max_requests"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["--max-requests"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 0
 | 
						|
    desc = """\
 | 
						|
        The maximum number of requests a worker will process before restarting.
 | 
						|
 | 
						|
        Any value greater than zero will limit the number of requests a work
 | 
						|
        will process before automatically restarting. This is a simple method
 | 
						|
        to help limit the damage of memory leaks.
 | 
						|
 | 
						|
        If this is set to zero (the default) then the automatic worker
 | 
						|
        restarts are disabled.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class MaxRequestsJitter(Setting):
 | 
						|
    name = "max_requests_jitter"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["--max-requests-jitter"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 0
 | 
						|
    desc = """\
 | 
						|
        The maximum jitter to add to the *max_requests* setting.
 | 
						|
 | 
						|
        The jitter causes the restart per worker to be randomized by
 | 
						|
        ``randint(0, max_requests_jitter)``. This is intended to stagger worker
 | 
						|
        restarts to avoid all workers restarting at the same time.
 | 
						|
 | 
						|
        .. versionadded:: 19.2
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Timeout(Setting):
 | 
						|
    name = "timeout"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["-t", "--timeout"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 30
 | 
						|
    desc = """\
 | 
						|
        Workers silent for more than this many seconds are killed and restarted.
 | 
						|
 | 
						|
        Generally set to thirty seconds. Only set this noticeably higher if
 | 
						|
        you're sure of the repercussions for sync workers. For the non sync
 | 
						|
        workers it just means that the worker process is still communicating and
 | 
						|
        is not tied to the length of time required to handle a single request.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class GracefulTimeout(Setting):
 | 
						|
    name = "graceful_timeout"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["--graceful-timeout"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 30
 | 
						|
    desc = """\
 | 
						|
        Timeout for graceful workers restart.
 | 
						|
 | 
						|
        After receiving a restart signal, workers have this much time to finish
 | 
						|
        serving requests. Workers still alive after the timeout (starting from
 | 
						|
        the receipt of the restart signal) are force killed.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Keepalive(Setting):
 | 
						|
    name = "keepalive"
 | 
						|
    section = "Worker Processes"
 | 
						|
    cli = ["--keep-alive"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 2
 | 
						|
    desc = """\
 | 
						|
        The number of seconds to wait for requests on a Keep-Alive connection.
 | 
						|
 | 
						|
        Generally set in the 1-5 seconds range for servers with direct connection
 | 
						|
        to the client (e.g. when you don't have separate load balancer). When
 | 
						|
        Gunicorn is deployed behind a load balancer, it often makes sense to
 | 
						|
        set this to a higher value.
 | 
						|
 | 
						|
        .. note::
 | 
						|
           ``sync`` worker does not support persistent connections and will
 | 
						|
           ignore this option.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class LimitRequestLine(Setting):
 | 
						|
    name = "limit_request_line"
 | 
						|
    section = "Security"
 | 
						|
    cli = ["--limit-request-line"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 4094
 | 
						|
    desc = """\
 | 
						|
        The maximum size of HTTP request line in bytes.
 | 
						|
 | 
						|
        This parameter is used to limit the allowed size of a client's
 | 
						|
        HTTP request-line. Since the request-line consists of the HTTP
 | 
						|
        method, URI, and protocol version, this directive places a
 | 
						|
        restriction on the length of a request-URI allowed for a request
 | 
						|
        on the server. A server needs this value to be large enough to
 | 
						|
        hold any of its resource names, including any information that
 | 
						|
        might be passed in the query part of a GET request. Value is a number
 | 
						|
        from 0 (unlimited) to 8190.
 | 
						|
 | 
						|
        This parameter can be used to prevent any DDOS attack.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class LimitRequestFields(Setting):
 | 
						|
    name = "limit_request_fields"
 | 
						|
    section = "Security"
 | 
						|
    cli = ["--limit-request-fields"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 100
 | 
						|
    desc = """\
 | 
						|
        Limit the number of HTTP headers fields in a request.
 | 
						|
 | 
						|
        This parameter is used to limit the number of headers in a request to
 | 
						|
        prevent DDOS attack. Used with the *limit_request_field_size* it allows
 | 
						|
        more safety. By default this value is 100 and can't be larger than
 | 
						|
        32768.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class LimitRequestFieldSize(Setting):
 | 
						|
    name = "limit_request_field_size"
 | 
						|
    section = "Security"
 | 
						|
    cli = ["--limit-request-field_size"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = int
 | 
						|
    default = 8190
 | 
						|
    desc = """\
 | 
						|
        Limit the allowed size of an HTTP request header field.
 | 
						|
 | 
						|
        Value is a positive number or 0. Setting it to 0 will allow unlimited
 | 
						|
        header field sizes.
 | 
						|
 | 
						|
        .. warning::
 | 
						|
           Setting this parameter to a very high or unlimited value can open
 | 
						|
           up for DDOS attacks.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Reload(Setting):
 | 
						|
    name = "reload"
 | 
						|
    section = 'Debugging'
 | 
						|
    cli = ['--reload']
 | 
						|
    validator = validate_bool
 | 
						|
    action = 'store_true'
 | 
						|
    default = False
 | 
						|
 | 
						|
    desc = '''\
 | 
						|
        Restart workers when code changes.
 | 
						|
 | 
						|
        This setting is intended for development. It will cause workers to be
 | 
						|
        restarted whenever application code changes.
 | 
						|
 | 
						|
        The reloader is incompatible with application preloading. When using a
 | 
						|
        paste configuration be sure that the server block does not import any
 | 
						|
        application code or the reload will not work as designed.
 | 
						|
 | 
						|
        The default behavior is to attempt inotify with a fallback to file
 | 
						|
        system polling. Generally, inotify should be preferred if available
 | 
						|
        because it consumes less system resources.
 | 
						|
 | 
						|
        .. note::
 | 
						|
           In order to use the inotify reloader, you must have the ``inotify``
 | 
						|
           package installed.
 | 
						|
        '''
 | 
						|
 | 
						|
 | 
						|
class ReloadEngine(Setting):
 | 
						|
    name = "reload_engine"
 | 
						|
    section = "Debugging"
 | 
						|
    cli = ["--reload-engine"]
 | 
						|
    meta = "STRING"
 | 
						|
    validator = validate_reload_engine
 | 
						|
    default = "auto"
 | 
						|
    desc = """\
 | 
						|
        The implementation that should be used to power :ref:`reload`.
 | 
						|
 | 
						|
        Valid engines are:
 | 
						|
 | 
						|
        * 'auto'
 | 
						|
        * 'poll'
 | 
						|
        * 'inotify' (requires inotify)
 | 
						|
 | 
						|
        .. versionadded:: 19.7
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class ReloadExtraFiles(Setting):
 | 
						|
    name = "reload_extra_files"
 | 
						|
    action = "append"
 | 
						|
    section = "Debugging"
 | 
						|
    cli = ["--reload-extra-file"]
 | 
						|
    meta = "FILES"
 | 
						|
    validator = validate_list_of_existing_files
 | 
						|
    default = []
 | 
						|
    desc = """\
 | 
						|
        Extends :ref:`reload` option to also watch and reload on additional files
 | 
						|
        (e.g., templates, configurations, specifications, etc.).
 | 
						|
 | 
						|
        .. versionadded:: 19.8
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Spew(Setting):
 | 
						|
    name = "spew"
 | 
						|
    section = "Debugging"
 | 
						|
    cli = ["--spew"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = "store_true"
 | 
						|
    default = False
 | 
						|
    desc = """\
 | 
						|
        Install a trace function that spews every line executed by the server.
 | 
						|
 | 
						|
        This is the nuclear option.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class ConfigCheck(Setting):
 | 
						|
    name = "check_config"
 | 
						|
    section = "Debugging"
 | 
						|
    cli = ["--check-config"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = "store_true"
 | 
						|
    default = False
 | 
						|
    desc = """\
 | 
						|
        Check the configuration.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class PreloadApp(Setting):
 | 
						|
    name = "preload_app"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--preload"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = "store_true"
 | 
						|
    default = False
 | 
						|
    desc = """\
 | 
						|
        Load application code before the worker processes are forked.
 | 
						|
 | 
						|
        By preloading an application you can save some RAM resources as well as
 | 
						|
        speed up server boot times. Although, if you defer application loading
 | 
						|
        to each worker process, you can reload your application code easily by
 | 
						|
        restarting workers.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Sendfile(Setting):
 | 
						|
    name = "sendfile"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--no-sendfile"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = "store_const"
 | 
						|
    const = False
 | 
						|
 | 
						|
    desc = """\
 | 
						|
        Disables the use of ``sendfile()``.
 | 
						|
 | 
						|
        If not set, the value of the ``SENDFILE`` environment variable is used
 | 
						|
        to enable or disable its usage.
 | 
						|
 | 
						|
        .. versionadded:: 19.2
 | 
						|
        .. versionchanged:: 19.4
 | 
						|
           Swapped ``--sendfile`` with ``--no-sendfile`` to actually allow
 | 
						|
           disabling.
 | 
						|
        .. versionchanged:: 19.6
 | 
						|
           added support for the ``SENDFILE`` environment variable
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class ReusePort(Setting):
 | 
						|
    name = "reuse_port"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--reuse-port"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = "store_true"
 | 
						|
    default = False
 | 
						|
 | 
						|
    desc = """\
 | 
						|
        Set the ``SO_REUSEPORT`` flag on the listening socket.
 | 
						|
 | 
						|
        .. versionadded:: 19.8
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Chdir(Setting):
 | 
						|
    name = "chdir"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--chdir"]
 | 
						|
    validator = validate_chdir
 | 
						|
    default = util.getcwd()
 | 
						|
    desc = """\
 | 
						|
        Chdir to specified directory before apps loading.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Daemon(Setting):
 | 
						|
    name = "daemon"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["-D", "--daemon"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = "store_true"
 | 
						|
    default = False
 | 
						|
    desc = """\
 | 
						|
        Daemonize the Gunicorn process.
 | 
						|
 | 
						|
        Detaches the server from the controlling terminal and enters the
 | 
						|
        background.
 | 
						|
        """
 | 
						|
 | 
						|
class Env(Setting):
 | 
						|
    name = "raw_env"
 | 
						|
    action = "append"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["-e", "--env"]
 | 
						|
    meta = "ENV"
 | 
						|
    validator = validate_list_string
 | 
						|
    default = []
 | 
						|
 | 
						|
    desc = """\
 | 
						|
        Set environment variable (key=value).
 | 
						|
 | 
						|
        Pass variables to the execution environment. Ex.::
 | 
						|
 | 
						|
            $ gunicorn -b 127.0.0.1:8000 --env FOO=1 test:app
 | 
						|
 | 
						|
        and test for the foo variable environment in your application.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Pidfile(Setting):
 | 
						|
    name = "pidfile"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["-p", "--pid"]
 | 
						|
    meta = "FILE"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
        A filename to use for the PID file.
 | 
						|
 | 
						|
        If not set, no PID file will be written.
 | 
						|
        """
 | 
						|
 | 
						|
class WorkerTmpDir(Setting):
 | 
						|
    name = "worker_tmp_dir"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--worker-tmp-dir"]
 | 
						|
    meta = "DIR"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
        A directory to use for the worker heartbeat temporary file.
 | 
						|
 | 
						|
        If not set, the default temporary directory will be used.
 | 
						|
 | 
						|
        .. note::
 | 
						|
           The current heartbeat system involves calling ``os.fchmod`` on
 | 
						|
           temporary file handlers and may block a worker for arbitrary time
 | 
						|
           if the directory is on a disk-backed filesystem.
 | 
						|
 | 
						|
           See :ref:`blocking-os-fchmod` for more detailed information
 | 
						|
           and a solution for avoiding this problem.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class User(Setting):
 | 
						|
    name = "user"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["-u", "--user"]
 | 
						|
    meta = "USER"
 | 
						|
    validator = validate_user
 | 
						|
    default = os.geteuid()
 | 
						|
    desc = """\
 | 
						|
        Switch worker processes to run as this user.
 | 
						|
 | 
						|
        A valid user id (as an integer) or the name of a user that can be
 | 
						|
        retrieved with a call to ``pwd.getpwnam(value)`` or ``None`` to not
 | 
						|
        change the worker process user.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Group(Setting):
 | 
						|
    name = "group"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["-g", "--group"]
 | 
						|
    meta = "GROUP"
 | 
						|
    validator = validate_group
 | 
						|
    default = os.getegid()
 | 
						|
    desc = """\
 | 
						|
        Switch worker process to run as this group.
 | 
						|
 | 
						|
        A valid group id (as an integer) or the name of a user that can be
 | 
						|
        retrieved with a call to ``pwd.getgrnam(value)`` or ``None`` to not
 | 
						|
        change the worker processes group.
 | 
						|
        """
 | 
						|
 | 
						|
class Umask(Setting):
 | 
						|
    name = "umask"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["-m", "--umask"]
 | 
						|
    meta = "INT"
 | 
						|
    validator = validate_pos_int
 | 
						|
    type = auto_int
 | 
						|
    default = 0
 | 
						|
    desc = """\
 | 
						|
        A bit mask for the file mode on files written by Gunicorn.
 | 
						|
 | 
						|
        Note that this affects unix socket permissions.
 | 
						|
 | 
						|
        A valid value for the ``os.umask(mode)`` call or a string compatible
 | 
						|
        with ``int(value, 0)`` (``0`` means Python guesses the base, so values
 | 
						|
        like ``0``, ``0xFF``, ``0022`` are valid for decimal, hex, and octal
 | 
						|
        representations)
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Initgroups(Setting):
 | 
						|
    name = "initgroups"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--initgroups"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = 'store_true'
 | 
						|
    default = False
 | 
						|
 | 
						|
    desc = """\
 | 
						|
        If true, set the worker process's group access list with all of the
 | 
						|
        groups of which the specified username is a member, plus the specified
 | 
						|
        group id.
 | 
						|
 | 
						|
        .. versionadded:: 19.7
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class TmpUploadDir(Setting):
 | 
						|
    name = "tmp_upload_dir"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    meta = "DIR"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
        Directory to store temporary request data as they are read.
 | 
						|
 | 
						|
        This may disappear in the near future.
 | 
						|
 | 
						|
        This path should be writable by the process permissions set for Gunicorn
 | 
						|
        workers. If not specified, Gunicorn will choose a system generated
 | 
						|
        temporary directory.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class SecureSchemeHeader(Setting):
 | 
						|
    name = "secure_scheme_headers"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    validator = validate_dict
 | 
						|
    default = {
 | 
						|
        "X-FORWARDED-PROTOCOL": "ssl",
 | 
						|
        "X-FORWARDED-PROTO": "https",
 | 
						|
        "X-FORWARDED-SSL": "on"
 | 
						|
    }
 | 
						|
    desc = """\
 | 
						|
 | 
						|
        A dictionary containing headers and values that the front-end proxy
 | 
						|
        uses to indicate HTTPS requests. These tell Gunicorn to set
 | 
						|
        ``wsgi.url_scheme`` to ``https``, so your application can tell that the
 | 
						|
        request is secure.
 | 
						|
 | 
						|
        The dictionary should map upper-case header names to exact string
 | 
						|
        values. The value comparisons are case-sensitive, unlike the header
 | 
						|
        names, so make sure they're exactly what your front-end proxy sends
 | 
						|
        when handling HTTPS requests.
 | 
						|
 | 
						|
        It is important that your front-end proxy configuration ensures that
 | 
						|
        the headers defined here can not be passed directly from the client.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class ForwardedAllowIPS(Setting):
 | 
						|
    name = "forwarded_allow_ips"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--forwarded-allow-ips"]
 | 
						|
    meta = "STRING"
 | 
						|
    validator = validate_string_to_list
 | 
						|
    default = os.environ.get("FORWARDED_ALLOW_IPS", "127.0.0.1")
 | 
						|
    desc = """\
 | 
						|
        Front-end's IPs from which allowed to handle set secure headers.
 | 
						|
        (comma separate).
 | 
						|
 | 
						|
        Set to ``*`` to disable checking of Front-end IPs (useful for setups
 | 
						|
        where you don't know in advance the IP address of Front-end, but
 | 
						|
        you still trust the environment).
 | 
						|
 | 
						|
        By default, the value of the ``FORWARDED_ALLOW_IPS`` environment
 | 
						|
        variable. If it is not defined, the default is ``"127.0.0.1"``.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class AccessLog(Setting):
 | 
						|
    name = "accesslog"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--access-logfile"]
 | 
						|
    meta = "FILE"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
        The Access log file to write to.
 | 
						|
 | 
						|
        ``'-'`` means log to stdout.
 | 
						|
        """
 | 
						|
 | 
						|
class DisableRedirectAccessToSyslog(Setting):
 | 
						|
    name = "disable_redirect_access_to_syslog"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--disable-redirect-access-to-syslog"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = 'store_true'
 | 
						|
    default = False
 | 
						|
    desc = """\
 | 
						|
    Disable redirect access logs to syslog.
 | 
						|
 | 
						|
    .. versionadded:: 19.8
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class AccessLogFormat(Setting):
 | 
						|
    name = "access_log_format"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--access-logformat"]
 | 
						|
    meta = "STRING"
 | 
						|
    validator = validate_string
 | 
						|
    default = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
 | 
						|
    desc = """\
 | 
						|
        The access log format.
 | 
						|
 | 
						|
        ===========  ===========
 | 
						|
        Identifier   Description
 | 
						|
        ===========  ===========
 | 
						|
        h            remote address
 | 
						|
        l            ``'-'``
 | 
						|
        u            user name
 | 
						|
        t            date of the request
 | 
						|
        r            status line (e.g. ``GET / HTTP/1.1``)
 | 
						|
        m            request method
 | 
						|
        U            URL path without query string
 | 
						|
        q            query string
 | 
						|
        H            protocol
 | 
						|
        s            status
 | 
						|
        B            response length
 | 
						|
        b            response length or ``'-'`` (CLF format)
 | 
						|
        f            referer
 | 
						|
        a            user agent
 | 
						|
        T            request time in seconds
 | 
						|
        D            request time in microseconds
 | 
						|
        L            request time in decimal seconds
 | 
						|
        p            process ID
 | 
						|
        {Header}i    request header
 | 
						|
        {Header}o    response header
 | 
						|
        {Variable}e  environment variable
 | 
						|
        ===========  ===========
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class ErrorLog(Setting):
 | 
						|
    name = "errorlog"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--error-logfile", "--log-file"]
 | 
						|
    meta = "FILE"
 | 
						|
    validator = validate_string
 | 
						|
    default = '-'
 | 
						|
    desc = """\
 | 
						|
        The Error log file to write to.
 | 
						|
 | 
						|
        Using ``'-'`` for FILE makes gunicorn log to stderr.
 | 
						|
 | 
						|
        .. versionchanged:: 19.2
 | 
						|
           Log to stderr by default.
 | 
						|
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Loglevel(Setting):
 | 
						|
    name = "loglevel"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--log-level"]
 | 
						|
    meta = "LEVEL"
 | 
						|
    validator = validate_string
 | 
						|
    default = "info"
 | 
						|
    desc = """\
 | 
						|
        The granularity of Error log outputs.
 | 
						|
 | 
						|
        Valid level names are:
 | 
						|
 | 
						|
        * debug
 | 
						|
        * info
 | 
						|
        * warning
 | 
						|
        * error
 | 
						|
        * critical
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class CaptureOutput(Setting):
 | 
						|
    name = "capture_output"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--capture-output"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = 'store_true'
 | 
						|
    default = False
 | 
						|
    desc = """\
 | 
						|
        Redirect stdout/stderr to specified file in :ref:`errorlog`.
 | 
						|
 | 
						|
        .. versionadded:: 19.6
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class LoggerClass(Setting):
 | 
						|
    name = "logger_class"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--logger-class"]
 | 
						|
    meta = "STRING"
 | 
						|
    validator = validate_class
 | 
						|
    default = "gunicorn.glogging.Logger"
 | 
						|
    desc = """\
 | 
						|
        The logger you want to use to log events in Gunicorn.
 | 
						|
 | 
						|
        The default class (``gunicorn.glogging.Logger``) handle most of
 | 
						|
        normal usages in logging. It provides error and access logging.
 | 
						|
 | 
						|
        You can provide your own logger by giving Gunicorn a
 | 
						|
        Python path to a subclass like ``gunicorn.glogging.Logger``.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class LogConfig(Setting):
 | 
						|
    name = "logconfig"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--log-config"]
 | 
						|
    meta = "FILE"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
    The log config file to use.
 | 
						|
    Gunicorn uses the standard Python logging module's Configuration
 | 
						|
    file format.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class LogConfigDict(Setting):
 | 
						|
    name = "logconfig_dict"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--log-config-dict"]
 | 
						|
    validator = validate_dict
 | 
						|
    default = {}
 | 
						|
    desc = """\
 | 
						|
    The log config dictionary to use, using the standard Python
 | 
						|
    logging module's dictionary configuration format. This option
 | 
						|
    takes precedence over the :ref:`logconfig` option, which uses the
 | 
						|
    older file configuration format.
 | 
						|
 | 
						|
    Format: https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig
 | 
						|
 | 
						|
    .. versionadded:: 19.8
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class SyslogTo(Setting):
 | 
						|
    name = "syslog_addr"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--log-syslog-to"]
 | 
						|
    meta = "SYSLOG_ADDR"
 | 
						|
    validator = validate_string
 | 
						|
 | 
						|
    if PLATFORM == "darwin":
 | 
						|
        default = "unix:///var/run/syslog"
 | 
						|
    elif PLATFORM in ('freebsd', 'dragonfly', ):
 | 
						|
        default = "unix:///var/run/log"
 | 
						|
    elif PLATFORM == "openbsd":
 | 
						|
        default = "unix:///dev/log"
 | 
						|
    else:
 | 
						|
        default = "udp://localhost:514"
 | 
						|
 | 
						|
    desc = """\
 | 
						|
    Address to send syslog messages.
 | 
						|
 | 
						|
    Address is a string of the form:
 | 
						|
 | 
						|
    * ``unix://PATH#TYPE`` : for unix domain socket. ``TYPE`` can be ``stream``
 | 
						|
      for the stream driver or ``dgram`` for the dgram driver.
 | 
						|
      ``stream`` is the default.
 | 
						|
    * ``udp://HOST:PORT`` : for UDP sockets
 | 
						|
    * ``tcp://HOST:PORT`` : for TCP sockets
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class Syslog(Setting):
 | 
						|
    name = "syslog"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--log-syslog"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = 'store_true'
 | 
						|
    default = False
 | 
						|
    desc = """\
 | 
						|
    Send *Gunicorn* logs to syslog.
 | 
						|
 | 
						|
    .. versionchanged:: 19.8
 | 
						|
 | 
						|
     You can now disable sending access logs by using the
 | 
						|
     :ref:`disable-redirect-access-to-syslog` setting.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class SyslogPrefix(Setting):
 | 
						|
    name = "syslog_prefix"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--log-syslog-prefix"]
 | 
						|
    meta = "SYSLOG_PREFIX"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
    Makes Gunicorn use the parameter as program-name in the syslog entries.
 | 
						|
 | 
						|
    All entries will be prefixed by ``gunicorn.<prefix>``. By default the
 | 
						|
    program name is the name of the process.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class SyslogFacility(Setting):
 | 
						|
    name = "syslog_facility"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--log-syslog-facility"]
 | 
						|
    meta = "SYSLOG_FACILITY"
 | 
						|
    validator = validate_string
 | 
						|
    default = "user"
 | 
						|
    desc = """\
 | 
						|
    Syslog facility name
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class EnableStdioInheritance(Setting):
 | 
						|
    name = "enable_stdio_inheritance"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["-R", "--enable-stdio-inheritance"]
 | 
						|
    validator = validate_bool
 | 
						|
    default = False
 | 
						|
    action = "store_true"
 | 
						|
    desc = """\
 | 
						|
    Enable stdio inheritance.
 | 
						|
 | 
						|
    Enable inheritance for stdio file descriptors in daemon mode.
 | 
						|
 | 
						|
    Note: To disable the Python stdout buffering, you can to set the user
 | 
						|
    environment variable ``PYTHONUNBUFFERED`` .
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
# statsD monitoring
 | 
						|
class StatsdHost(Setting):
 | 
						|
    name = "statsd_host"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--statsd-host"]
 | 
						|
    meta = "STATSD_ADDR"
 | 
						|
    default = None
 | 
						|
    validator = validate_hostport
 | 
						|
    desc = """\
 | 
						|
    ``host:port`` of the statsd server to log to.
 | 
						|
 | 
						|
    .. versionadded:: 19.1
 | 
						|
    """
 | 
						|
 | 
						|
class StatsdPrefix(Setting):
 | 
						|
    name = "statsd_prefix"
 | 
						|
    section = "Logging"
 | 
						|
    cli = ["--statsd-prefix"]
 | 
						|
    meta = "STATSD_PREFIX"
 | 
						|
    default = ""
 | 
						|
    validator = validate_string
 | 
						|
    desc = """\
 | 
						|
    Prefix to use when emitting statsd metrics (a trailing ``.`` is added,
 | 
						|
    if not provided).
 | 
						|
 | 
						|
    .. versionadded:: 19.2
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class Procname(Setting):
 | 
						|
    name = "proc_name"
 | 
						|
    section = "Process Naming"
 | 
						|
    cli = ["-n", "--name"]
 | 
						|
    meta = "STRING"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
        A base to use with setproctitle for process naming.
 | 
						|
 | 
						|
        This affects things like ``ps`` and ``top``. If you're going to be
 | 
						|
        running more than one instance of Gunicorn you'll probably want to set a
 | 
						|
        name to tell them apart. This requires that you install the setproctitle
 | 
						|
        module.
 | 
						|
 | 
						|
        If not set, the *default_proc_name* setting will be used.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class DefaultProcName(Setting):
 | 
						|
    name = "default_proc_name"
 | 
						|
    section = "Process Naming"
 | 
						|
    validator = validate_string
 | 
						|
    default = "gunicorn"
 | 
						|
    desc = """\
 | 
						|
        Internal setting that is adjusted for each type of application.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class PythonPath(Setting):
 | 
						|
    name = "pythonpath"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--pythonpath"]
 | 
						|
    meta = "STRING"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
        A comma-separated list of directories to add to the Python path.
 | 
						|
 | 
						|
        e.g.
 | 
						|
        ``'/home/djangoprojects/myproject,/home/python/mylibrary'``.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Paste(Setting):
 | 
						|
    name = "paste"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--paste", "--paster"]
 | 
						|
    meta = "STRING"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
        Load a PasteDeploy config file. The argument may contain a ``#``
 | 
						|
        symbol followed by the name of an app section from the config file,
 | 
						|
        e.g. ``production.ini#admin``.
 | 
						|
 | 
						|
        At this time, using alternate server blocks is not supported. Use the
 | 
						|
        command line arguments to control server configuration instead.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class OnStarting(Setting):
 | 
						|
    name = "on_starting"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(1)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def on_starting(server):
 | 
						|
        pass
 | 
						|
    default = staticmethod(on_starting)
 | 
						|
    desc = """\
 | 
						|
        Called just before the master process is initialized.
 | 
						|
 | 
						|
        The callable needs to accept a single instance variable for the Arbiter.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class OnReload(Setting):
 | 
						|
    name = "on_reload"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(1)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def on_reload(server):
 | 
						|
        pass
 | 
						|
    default = staticmethod(on_reload)
 | 
						|
    desc = """\
 | 
						|
        Called to recycle workers during a reload via SIGHUP.
 | 
						|
 | 
						|
        The callable needs to accept a single instance variable for the Arbiter.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class WhenReady(Setting):
 | 
						|
    name = "when_ready"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(1)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def when_ready(server):
 | 
						|
        pass
 | 
						|
    default = staticmethod(when_ready)
 | 
						|
    desc = """\
 | 
						|
        Called just after the server is started.
 | 
						|
 | 
						|
        The callable needs to accept a single instance variable for the Arbiter.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Prefork(Setting):
 | 
						|
    name = "pre_fork"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(2)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def pre_fork(server, worker):
 | 
						|
        pass
 | 
						|
    default = staticmethod(pre_fork)
 | 
						|
    desc = """\
 | 
						|
        Called just before a worker is forked.
 | 
						|
 | 
						|
        The callable needs to accept two instance variables for the Arbiter and
 | 
						|
        new Worker.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class Postfork(Setting):
 | 
						|
    name = "post_fork"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(2)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def post_fork(server, worker):
 | 
						|
        pass
 | 
						|
    default = staticmethod(post_fork)
 | 
						|
    desc = """\
 | 
						|
        Called just after a worker has been forked.
 | 
						|
 | 
						|
        The callable needs to accept two instance variables for the Arbiter and
 | 
						|
        new Worker.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class PostWorkerInit(Setting):
 | 
						|
    name = "post_worker_init"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(1)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def post_worker_init(worker):
 | 
						|
        pass
 | 
						|
 | 
						|
    default = staticmethod(post_worker_init)
 | 
						|
    desc = """\
 | 
						|
        Called just after a worker has initialized the application.
 | 
						|
 | 
						|
        The callable needs to accept one instance variable for the initialized
 | 
						|
        Worker.
 | 
						|
        """
 | 
						|
 | 
						|
class WorkerInt(Setting):
 | 
						|
    name = "worker_int"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(1)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def worker_int(worker):
 | 
						|
        pass
 | 
						|
 | 
						|
    default = staticmethod(worker_int)
 | 
						|
    desc = """\
 | 
						|
        Called just after a worker exited on SIGINT or SIGQUIT.
 | 
						|
 | 
						|
        The callable needs to accept one instance variable for the initialized
 | 
						|
        Worker.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class WorkerAbort(Setting):
 | 
						|
    name = "worker_abort"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(1)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def worker_abort(worker):
 | 
						|
        pass
 | 
						|
 | 
						|
    default = staticmethod(worker_abort)
 | 
						|
    desc = """\
 | 
						|
        Called when a worker received the SIGABRT signal.
 | 
						|
 | 
						|
        This call generally happens on timeout.
 | 
						|
 | 
						|
        The callable needs to accept one instance variable for the initialized
 | 
						|
        Worker.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class PreExec(Setting):
 | 
						|
    name = "pre_exec"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(1)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def pre_exec(server):
 | 
						|
        pass
 | 
						|
    default = staticmethod(pre_exec)
 | 
						|
    desc = """\
 | 
						|
        Called just before a new master process is forked.
 | 
						|
 | 
						|
        The callable needs to accept a single instance variable for the Arbiter.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class PreRequest(Setting):
 | 
						|
    name = "pre_request"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(2)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def pre_request(worker, req):
 | 
						|
        worker.log.debug("%s %s" % (req.method, req.path))
 | 
						|
    default = staticmethod(pre_request)
 | 
						|
    desc = """\
 | 
						|
        Called just before a worker processes the request.
 | 
						|
 | 
						|
        The callable needs to accept two instance variables for the Worker and
 | 
						|
        the Request.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class PostRequest(Setting):
 | 
						|
    name = "post_request"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_post_request
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def post_request(worker, req, environ, resp):
 | 
						|
        pass
 | 
						|
    default = staticmethod(post_request)
 | 
						|
    desc = """\
 | 
						|
        Called after a worker processes the request.
 | 
						|
 | 
						|
        The callable needs to accept two instance variables for the Worker and
 | 
						|
        the Request.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class ChildExit(Setting):
 | 
						|
    name = "child_exit"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(2)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def child_exit(server, worker):
 | 
						|
        pass
 | 
						|
    default = staticmethod(child_exit)
 | 
						|
    desc = """\
 | 
						|
        Called just after a worker has been exited, in the master process.
 | 
						|
 | 
						|
        The callable needs to accept two instance variables for the Arbiter and
 | 
						|
        the just-exited Worker.
 | 
						|
 | 
						|
        .. versionadded:: 19.7
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class WorkerExit(Setting):
 | 
						|
    name = "worker_exit"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(2)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def worker_exit(server, worker):
 | 
						|
        pass
 | 
						|
    default = staticmethod(worker_exit)
 | 
						|
    desc = """\
 | 
						|
        Called just after a worker has been exited, in the worker process.
 | 
						|
 | 
						|
        The callable needs to accept two instance variables for the Arbiter and
 | 
						|
        the just-exited Worker.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class NumWorkersChanged(Setting):
 | 
						|
    name = "nworkers_changed"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(3)
 | 
						|
    type = six.callable
 | 
						|
 | 
						|
    def nworkers_changed(server, new_value, old_value):
 | 
						|
        pass
 | 
						|
    default = staticmethod(nworkers_changed)
 | 
						|
    desc = """\
 | 
						|
        Called just after *num_workers* has been changed.
 | 
						|
 | 
						|
        The callable needs to accept an instance variable of the Arbiter and
 | 
						|
        two integers of number of workers after and before change.
 | 
						|
 | 
						|
        If the number of workers is set for the first time, *old_value* would
 | 
						|
        be ``None``.
 | 
						|
        """
 | 
						|
 | 
						|
class OnExit(Setting):
 | 
						|
    name = "on_exit"
 | 
						|
    section = "Server Hooks"
 | 
						|
    validator = validate_callable(1)
 | 
						|
 | 
						|
    def on_exit(server):
 | 
						|
        pass
 | 
						|
 | 
						|
    default = staticmethod(on_exit)
 | 
						|
    desc = """\
 | 
						|
        Called just before exiting Gunicorn.
 | 
						|
 | 
						|
        The callable needs to accept a single instance variable for the Arbiter.
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class ProxyProtocol(Setting):
 | 
						|
    name = "proxy_protocol"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--proxy-protocol"]
 | 
						|
    validator = validate_bool
 | 
						|
    default = False
 | 
						|
    action = "store_true"
 | 
						|
    desc = """\
 | 
						|
        Enable detect PROXY protocol (PROXY mode).
 | 
						|
 | 
						|
        Allow using HTTP and Proxy together. It may be useful for work with
 | 
						|
        stunnel as HTTPS frontend and Gunicorn as HTTP server.
 | 
						|
 | 
						|
        PROXY protocol: http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt
 | 
						|
 | 
						|
        Example for stunnel config::
 | 
						|
 | 
						|
            [https]
 | 
						|
            protocol = proxy
 | 
						|
            accept  = 443
 | 
						|
            connect = 80
 | 
						|
            cert = /etc/ssl/certs/stunnel.pem
 | 
						|
            key = /etc/ssl/certs/stunnel.key
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class ProxyAllowFrom(Setting):
 | 
						|
    name = "proxy_allow_ips"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--proxy-allow-from"]
 | 
						|
    validator = validate_string_to_list
 | 
						|
    default = "127.0.0.1"
 | 
						|
    desc = """\
 | 
						|
        Front-end's IPs from which allowed accept proxy requests (comma separate).
 | 
						|
 | 
						|
        Set to ``*`` to disable checking of Front-end IPs (useful for setups
 | 
						|
        where you don't know in advance the IP address of Front-end, but
 | 
						|
        you still trust the environment)
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class KeyFile(Setting):
 | 
						|
    name = "keyfile"
 | 
						|
    section = "SSL"
 | 
						|
    cli = ["--keyfile"]
 | 
						|
    meta = "FILE"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
    SSL key file
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class CertFile(Setting):
 | 
						|
    name = "certfile"
 | 
						|
    section = "SSL"
 | 
						|
    cli = ["--certfile"]
 | 
						|
    meta = "FILE"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
    SSL certificate file
 | 
						|
    """
 | 
						|
 | 
						|
class SSLVersion(Setting):
 | 
						|
    name = "ssl_version"
 | 
						|
    section = "SSL"
 | 
						|
    cli = ["--ssl-version"]
 | 
						|
    validator = validate_pos_int
 | 
						|
    default = ssl.PROTOCOL_SSLv23
 | 
						|
    desc = """\
 | 
						|
    SSL version to use (see stdlib ssl module's)
 | 
						|
 | 
						|
    .. versionchanged:: 19.7
 | 
						|
       The default value has been changed from ``ssl.PROTOCOL_TLSv1`` to
 | 
						|
       ``ssl.PROTOCOL_SSLv23``.
 | 
						|
    """
 | 
						|
 | 
						|
class CertReqs(Setting):
 | 
						|
    name = "cert_reqs"
 | 
						|
    section = "SSL"
 | 
						|
    cli = ["--cert-reqs"]
 | 
						|
    validator = validate_pos_int
 | 
						|
    default = ssl.CERT_NONE
 | 
						|
    desc = """\
 | 
						|
    Whether client certificate is required (see stdlib ssl module's)
 | 
						|
    """
 | 
						|
 | 
						|
class CACerts(Setting):
 | 
						|
    name = "ca_certs"
 | 
						|
    section = "SSL"
 | 
						|
    cli = ["--ca-certs"]
 | 
						|
    meta = "FILE"
 | 
						|
    validator = validate_string
 | 
						|
    default = None
 | 
						|
    desc = """\
 | 
						|
    CA certificates file
 | 
						|
    """
 | 
						|
 | 
						|
class SuppressRaggedEOFs(Setting):
 | 
						|
    name = "suppress_ragged_eofs"
 | 
						|
    section = "SSL"
 | 
						|
    cli = ["--suppress-ragged-eofs"]
 | 
						|
    action = "store_true"
 | 
						|
    default = True
 | 
						|
    validator = validate_bool
 | 
						|
    desc = """\
 | 
						|
    Suppress ragged EOFs (see stdlib ssl module's)
 | 
						|
    """
 | 
						|
 | 
						|
class DoHandshakeOnConnect(Setting):
 | 
						|
    name = "do_handshake_on_connect"
 | 
						|
    section = "SSL"
 | 
						|
    cli = ["--do-handshake-on-connect"]
 | 
						|
    validator = validate_bool
 | 
						|
    action = "store_true"
 | 
						|
    default = False
 | 
						|
    desc = """\
 | 
						|
    Whether to perform SSL handshake on socket connect (see stdlib ssl module's)
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
if sys.version_info >= (2, 7):
 | 
						|
    class Ciphers(Setting):
 | 
						|
        name = "ciphers"
 | 
						|
        section = "SSL"
 | 
						|
        cli = ["--ciphers"]
 | 
						|
        validator = validate_string
 | 
						|
        default = 'TLSv1'
 | 
						|
        desc = """\
 | 
						|
        Ciphers to use (see stdlib ssl module's)
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class PasteGlobalConf(Setting):
 | 
						|
    name = "raw_paste_global_conf"
 | 
						|
    action = "append"
 | 
						|
    section = "Server Mechanics"
 | 
						|
    cli = ["--paste-global"]
 | 
						|
    meta = "CONF"
 | 
						|
    validator = validate_list_string
 | 
						|
    default = []
 | 
						|
 | 
						|
    desc = """\
 | 
						|
        Set a PasteDeploy global config variable in ``key=value`` form.
 | 
						|
 | 
						|
        The option can be specified multiple times.
 | 
						|
 | 
						|
        The variables are passed to the the PasteDeploy entrypoint. Example::
 | 
						|
 | 
						|
            $ gunicorn -b 127.0.0.1:8000 --paste development.ini --paste-global FOO=1 --paste-global BAR=2
 | 
						|
 | 
						|
        .. versionadded:: 19.7
 | 
						|
        """
 | 
						|
 |