茉莉绿雪 發表於 2019-7-9 11:07:00

python gunicorn详解

<p>Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。<br>和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。</p>
<h2>gunicorn 安装</h2>
<div class="cnblogs_code">
<pre>pip install gunicorn</pre>
</div>
<h2>gunicorn + flask 简单示例</h2>
<p>flask程序需要先安装flask module,pip install flask。</p>
<p>gunicorn_demo.py</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">from</span> flask <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> Flask

app </span>= Flask(<span style="color: rgba(128, 0, 128, 1)">__name__</span><span style="color: rgba(0, 0, 0, 1)">)


@app.route(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/demo</span><span style="color: rgba(128, 0, 0, 1)">'</span>, methods=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> demo():
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gunicorn and flask demo.</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>通过gunicorn运行flask app</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> gunicorn gunicorn_demo:app</span>
Starting gunicorn 19.7.1<span style="color: rgba(0, 0, 0, 1)">
[</span>2017-12-23 10:36:09 +0000] Listening at: http://127.0.0.1:8000 (24441<span style="color: rgba(0, 0, 0, 1)">)
[</span>2017-12-23 10:36:09 +0000] Using worker: sync
[</span>2017-12-23 10:36:09 +0000] Booting worker with pid: 24446</pre>
</div>
<p>测试结果</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> curl http://127.0.0.1:8000/demo</span>
gunicorn <span style="color: rgba(0, 0, 255, 1)">and</span> flask demo.</pre>
</div>
<h2>gunicorn 详细配置</h2>
<div>
<div>
<p>gunicorn配置项可以通过gunicorn的启动命令行中设定,也可以通过配置文件指定。强烈建议使用一个配置文件。</p>
<p>配置项如下:</p>
<h3>server socket</h3>
<ul>
<li>
<p>bind<br>
监听地址和端口。</p>

</li>
<li>
<p>backlog<br>
服务器中在pending状态的最大连接数,即client处于waiting的数目。超过这个数目, client连接会得到一个error。<br>
建议值64-2048。</p>

</li>

</ul>

</div>
<div>
<div>
<h3>worker 进程</h3>
<ul>
<li>
<p>workers<br>
worker进程的数量。建议值2-4 x $(NUM_CORES), 缺省为1。</p>

</li>
<li>
<p>worker_class<br>
worker进程的工作方式。 有 sync, eventlet, gevent, tornado, gthread, 缺省值sync。</p>

</li>
<li>
<p>threads<br>
工作进程中线程的数量。建议值2-4 x $(NUM_CORES), 缺省值1。<br>
此配置只适用于gthread 进程工作方式, 因为gevent这种使用的是协程工作方式。</p>

</li>
<li>
<p>worker_connections<br>
客户端最大同时连接数。只适用于eventlet, gevent工作方式。</p>

</li>
<li>
<p>max_requests<br>
worker重启之前处理的最大requests数, 缺省值为0表示自动重启disabled。主要是防止内存泄露。</p>

</li>
<li>
<p>max_requests_jitter<br>
抖动参数,防止worker全部同时重启。</p>

</li>
<li>
<p>timeout<br>
通常设为30。</p>

</li>
<li>
<p>graceful_timeout<br>
接收到restart信号后,worker可以在graceful_timeout时间内,继续处理完当前requests。</p>

</li>
<li>
<p>keepalive<br>
server端保持连接时间。</p>

</li>


</ul>
<h3>security</h3>
<ul>
<li>
<p>limit_request_line<br>
http request line最大字节数。值范围0-8190, 0表示无限制。</p>

</li>
<li>
<p>limit_request_field<br>
http request中 header字段数的最大值。缺省为100,最大32768。</p>

</li>
<li>
<p>limit_request_field_size<br>
http request header字段最大字节数。0表示无限制。</p>

</li>


</ul>
<h3>调试</h3>
<ul>
<li>
<p>reload<br>
当代码有修改时,自动重启workers。适用于开发环境。</p>

</li>
<li>
<p>reload_extra_files<br>
扩展reload配置,增加templates,configurations等文件修改监控。</p>

</li>
<li>
<p>spew<br>
跟踪程序执行的每一行。</p>

</li>
<li>
<p>check_config<br>
检查配置。</p>

</li>


</ul>
<h3>server 机制</h3>
<ul>
<li>
<p>sendfile<br>
系统底层拷贝数据方式,提供performance。</p>

</li>
<li>
<p>chdir<br>
在app加载之前,进入到此目录。</p>

</li>
<li>
<p>daemon<br>
应用是否以daemon方式运行。</p>

</li>
<li>
<p>raw_env<br>
key=value, 传递环境参数。</p>

</li>
<li>
<p>pidfile<br>
pid存储文件路径。</p>

</li>
<li>
<p>worker_tmp_dir<br>
临时工作目录。</p>

</li>
<li>
<p>user<br>
指定worker进程的运行用户名。</p>

</li>
<li>
<p>group<br>
指定worker进程运行用户所在组。</p>

</li>
<li>
<p>umask<br>
gunicorn创建文件的缺省权限。</p>

</li>
<li>
<p>pythonpath<br>
附加到python path的目录列表。</p>

</li>


</ul>
<h3>日志</h3>
<ul>
<li>
<p>accesslog<br>
访问日志文件路径。</p>

</li>
<li>
<p>access_log_format<br>
日志格式。 例如 %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" 。</p>

</li>
<li>
<p>errorlog<br>
错误日志路径。</p>

</li>
<li>
<p>loglever<br>
日志级别。debug, info, warning, error, critical.</p>

</li>
<li>
<p>capture_output<br>
重定向stdout/stderr到error log file。</p>

</li>
<li>
<p>logger_class<br>
日志实现类。缺省gunicorn.glogging.Logger 。</p>

</li>
<li>
<p>logconfig<br>
日志配置文件。同python标准日志模块logging的配置。</p>

</li>


</ul>
<h3>进程名</h3>
<ul>
<li>proc_name<br>
设置进程名(setproctitle),在ps,top等命令中会看到. 缺省值为default_proc_name配置。</li>


</ul>
<h3>server钩子</h3>
<ul>
<li>on_starting</li>
<li>on_reload</li>
<li>when_ready</li>
<li>pre_fork</li>
<li>post_fork</li>
<li>post_worker_init</li>
<li>worker_init</li>
<li>worker_abort</li>
<li>pre_exec</li>
<li>pre_request</li>
<li>post_request</li>
<li>child_exit</li>
<li>worker-exit</li>
<li>nworkers_changed</li>
<li>on_exit</li>

</ul>

</div>
<h1>Gunicorn配置</h1>
<p> Gunicorn从三个不同的地方读取配置信息。</p>
<p> 第一个地方:从framework定义的配置信息中读取,目前只对 Paster 框架有效。</p>
<p> 第二个地方:在命令行中定义,命令行中定义的配置信息将会覆盖掉框架中定义的相同的参数名的值。</p>
<p> 最后:将所有的参数信息,放到一个文件中,只要是在命令行中可以定义的参数中,在配置文件中都可以定义。(是一个Python源文件,所以你就像在写Python代码一样)</p>
<p> 第一个地方不不介绍了,不实用。重点介绍第二种和第三种,其实这两种方式都是相同的。</p>
<p> 显示说有配置选项:</p>
<div class="cnblogs_code">
<pre>gunicorn -h</pre>
</div>
<p>使用命令行配置:</p>
<p>在上面的 myapp 例子的基础上</p>
<div class="cnblogs_code">
<pre>gunicorn --workers=4 --bind=127.0.0.1:8000 myapp.test:app</pre>
</div>
<p>上面的命令 启动 4个 workers ,绑定到 127.0.0.1:8000</p>
<p>&nbsp;&nbsp;配置文件 config.py 源码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> multiprocessing

bind </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1:8001</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
workers </span>= multiprocessing.cpu_count() * 2 + 1</pre>
</div>
<p>使用配置文件启动Gunicorn</p>
<div class="cnblogs_code">
<pre>gunicorn --config=config.py myapp.test:app</pre>
</div>
<p>和上面用命令行配置的效果完全一样,当然两者还可以结合起来用:</p>
<div class="cnblogs_code">
<pre>gunicorn --config=gunicorn_conf.py --worker-<span style="color: rgba(0, 0, 255, 1)">class</span>=eventlet myapp.test:app</pre>
</div>
<p>worker-class默认是sync(同步),我们配置成了 eventlet(并发的)</p>
<p>&nbsp;</p>
</div>
<h2>本人自己运营一个淘宝店,如果你觉得文章写得好。帮忙给淘宝店点个关注。谢谢</h2>
<h2>链接:&nbsp;https://shop211977203.taobao.com/</h2>
<br><br></div><br><br>
来源:https://www.cnblogs.com/zlel/p/11156070.html
頁: [1]
查看完整版本: python gunicorn详解