##// END OF EJS Templates
gunicorn: updated with expanded gunicorn_conf.py
marcink -
r2451:b2d6dad7 default
parent child Browse files
Show More
@@ -1,113 +1,151 b''
1 1 """
2 2 gunicorn config extension and hooks. Sets additional configuration that is
3 3 available post the .ini config.
4 4
5 5 - workers = ${cpu_number}
6 6 - threads = 1
7 7 - proc_name = ${gunicorn_proc_name}
8 8 - worker_class = sync
9 9 - worker_connections = 10
10 10 - max_requests = 1000
11 11 - max_requests_jitter = 30
12 12 - timeout = 21600
13 13
14 14 """
15 15
16 16 import multiprocessing
17 17 import sys
18 18 import time
19 19 import datetime
20 20 import threading
21 21 import traceback
22 22 from gunicorn.glogging import Logger
23 23
24 24
25 25 # GLOBAL
26 26 errorlog = '-'
27 27 accesslog = '-'
28 28 loglevel = 'debug'
29 29
30 30 # SECURITY
31
32 # The maximum size of HTTP request line in bytes.
31 33 limit_request_line = 4094
32 limit_request_fields = 100
33 limit_request_field_size = 8190
34
35 # Limit the number of HTTP headers fields in a request.
36 limit_request_fields = 1024
37
38 # Limit the allowed size of an HTTP request header field.
39 # Value is a positive number or 0.
40 # Setting it to 0 will allow unlimited header field sizes.
41 limit_request_field_size = 0
42
43
44 # Timeout for graceful workers restart.
45 # After receiving a restart signal, workers have this much time to finish
46 # serving requests. Workers still alive after the timeout (starting from the
47 # receipt of the restart signal) are force killed.
48 graceful_timeout = 30
49
50
51 # The number of seconds to wait for requests on a Keep-Alive connection.
52 # Generally set in the 1-5 seconds range.
53 keepalive = 2
54
34 55
35 56 # SERVER MECHANICS
36 57 # None == system temp dir
37 58 worker_tmp_dir = None
38 59 tmp_upload_dir = None
39 60
40 61 # Custom log format
41 62 access_log_format = (
42 63 '%(t)s GNCRN %(p)-8s %(h)-15s rqt:%(L)s %(s)s %(b)-6s "%(m)s:%(U)s %(q)s" usr:%(u)s "%(f)s" "%(a)s"')
43 64
44 65 # self adjust workers based on CPU count
45 66 # workers = multiprocessing.cpu_count() * 2 + 1
46 67
47 68
48 69 def post_fork(server, worker):
49 70 server.log.info("[<%-10s>] WORKER spawned", worker.pid)
50 71
51 72
52 73 def pre_fork(server, worker):
53 74 pass
54 75
55 76
56 77 def pre_exec(server):
57 78 server.log.info("Forked child, re-executing.")
58 79
59 80
81 def on_starting(server):
82 server.log.info("Server is starting.")
83
84
60 85 def when_ready(server):
61 86 server.log.info("Server is ready. Spawning workers")
62 87
63 88
89 def on_reload(server):
90 pass
91
92
64 93 def worker_int(worker):
65 94 worker.log.info("[<%-10s>] worker received INT or QUIT signal", worker.pid)
66 95
67 96 # get traceback info, on worker crash
68 97 id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
69 98 code = []
70 99 for thread_id, stack in sys._current_frames().items():
71 100 code.append(
72 101 "\n# Thread: %s(%d)" % (id2name.get(thread_id, ""), thread_id))
73 102 for fname, lineno, name, line in traceback.extract_stack(stack):
74 103 code.append('File: "%s", line %d, in %s' % (fname, lineno, name))
75 104 if line:
76 105 code.append(" %s" % (line.strip()))
77 106 worker.log.debug("\n".join(code))
78 107
79 108
80 109 def worker_abort(worker):
81 110 worker.log.info("[<%-10s>] worker received SIGABRT signal", worker.pid)
82 111
83 112
113 def worker_exit(server, worker):
114 worker.log.info("[<%-10s>] worker exit", worker.pid)
115
116
117 def child_exit(server, worker):
118 worker.log.info("[<%-10s>] worker child exit", worker.pid)
119
120
84 121 def pre_request(worker, req):
85 122 return
86 123 worker.log.debug("[<%-10s>] PRE WORKER: %s %s",
87 124 worker.pid, req.method, req.path)
88 125
89 126
90 127 def post_request(worker, req, environ, resp):
91 128 return
92 129 worker.log.debug("[<%-10s>] POST WORKER: %s %s resp: %s", worker.pid,
93 130 req.method, req.path, resp.status_code)
94 131
95 132
133
96 134 class RhodeCodeLogger(Logger):
97 135 """
98 136 Custom Logger that allows some customization that gunicorn doesn't allow
99 137 """
100 138
101 139 datefmt = r"%Y-%m-%d %H:%M:%S"
102 140
103 141 def __init__(self, cfg):
104 142 Logger.__init__(self, cfg)
105 143
106 144 def now(self):
107 145 """ return date in RhodeCode Log format """
108 146 now = time.time()
109 147 msecs = int((now - long(now)) * 1000)
110 148 return time.strftime(self.datefmt, time.localtime(now)) + '.{0:03d}'.format(msecs)
111 149
112 150
113 151 logger_class = RhodeCodeLogger
General Comments 0
You need to be logged in to leave comments. Login now