Python生产环境部署(fastcgi,uwsgi)
Python部署web开发程序的几种方法
fastcgi ,通过flup模块来支持,在nginx里对应的配置指令是 fastcgi_pass
http,nginx使用proxy_pass转发,这个要求后端appplication必须内置一个能处理高并发的http server,在python的web框架当中,只能选择tornado.
uwsgi,包括4部分组成:
- uwsgi协议
- web server内置支持协议模块
- application服务器协议支持模块
- 进程控制程序
nginx从0.8.4开始内置支持uwsgi协议,uwsgi协议非常简单,一个4个字节header+一个body,body可以是很多协议的包,比如说http,cgi等(通过header里面字段标示)。
uwsgi的特点在于自带的进程控制程序.它是用c语言编写,使用natvie函数,其实和spawn-fcgi/php-fpm类似。所以uwsgi可以支持多种应用框架,包括(python,lua,ruby,erlang,go)等等
mod_python,这是apache内置的模块,很严重的依赖于mod_python编译使用的python版本,和apache配套使用,不推荐
cgi,这个太old,不推荐,而且nginx不支持cgi方式,只能用lighttpd或者apache
spawn-fcgi,这个是fastcgi多进程管理程序,lighttpd安装包附带的,和 flup效果一样,区别是flup是 python代码级引入,spawn-fcgi是外部程序。spawn-fcgi用途很广,可以支持任意语言开发的代码,php,python,perl,只要你代码实现了fastcgi接口,它都可以帮你管理你的进程
scgi,全名是Simple Common Gateway Interface,也是cgi的替代版本,scgi协议很简单,我觉得和fastcgi差不多,只是没有怎么推广开来,nginx对应的配置指令是scgi_pass,你想用就用,flup也支持。
Gunicorn,和uwsgi类似的工具,从rails的部署工具(Unicorn)移植过来的。但是它使用的协议是 WSGI,全称是Python Web Server Gateway Interface ,这是python2.5时定义的官方标准(PEP 333 ),根红苗正,而且部署比较简单,http://gunicorn.org/ 上有详细教程
mod_wsgi,apache的一个module,也是支持WSGI协议,https://code.google.com/p/modwsgi/
uwsgi
安装uwsgi
pip install uwsgi
配置uwsgi
uwsgi 有多种配置可用:
1,ini 2,xml 3,json 4,yaml
配置示例
$ cat etc/uwsgi.ini [uwsgi] socket = 127.0.0.1:9005 chdir = /Users/suoning/python_project/trunk/ wsgi-file = main.py processes = 4 stats = 127.0.0.1:9000 daemonize = /tmp/uwsgiServer.log pidfile = /tmp/uwsgi.pid vacuum = true log-maxsize = 50000000 disable-logging = true callable = app $
配置参数详解:
常用选项:
socket : 地址和端口号,例如:socket = 127.0.0.1:50000
processes : 开启的进程数量
workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number of workers / processes)
chdir : 指定运行目录(chdir to specified directory before apps loading)
wsgi-file : 载入wsgi-file(load .wsgi file)
stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
master : 允许主进程存在(enable master process)
daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。
log-maxsize :以固定的文件大小(单位KB),切割日志文件。 例如:log-maxsize = 50000000 就是50M一个日志文件。
pidfile : 指定pid文件的位置,记录主进程的pid号。
vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)
disable-logging : 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。如果不开启这项,那么你的日志中会大量出现这种记录:
[pid: 347|app: 0|req: 106/367] 117.116.122.172 () {52 vars in 961 bytes} [Thu Jul 7 19:20:56 2016] POST /post => generated 65 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 0)
配置nginx
$ cat etc/nginx/servers/tongbupan.conf server {listen 80;server_name localhost;location / {include uwsgi_params;uwsgi_pass 127.0.0.1:9005;}location /webstatic/ {expires 7d;add_header Cache-Control public;alias /Users/suoning/probject/python_project/webstatic/trunk/;}}$ $ nginx -t nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful $ $ nginx -s reload $
配置application
flask 示例
... app = Flask('pan') ...if __name__ == '__main__':# app.run(host='0.0.0.0', port=5000)app.run()# 注意:变量app对应uwsgi配置文件uwsgi.ini中 callable = app
启动uwsgi
$ $ uwsgi --ini /usr/local/etc/uwsgi.ini [uWSGI] getting INI configuration from /usr/local/etc/uwsgi.ini $ $ ps -ef|grep uwsgi501 11428 1 0 11:40下午 ?? 0:01.23 uwsgi --ini /usr/local/etc/uwsgi.ini501 11432 11428 0 11:40下午 ?? 0:00.00 uwsgi --ini /usr/local/etc/uwsgi.ini501 11433 11428 0 11:40下午 ?? 0:00.00 uwsgi --ini /usr/local/etc/uwsgi.ini501 11434 11428 0 11:40下午 ?? 0:00.00 uwsgi --ini /usr/local/etc/uwsgi.ini501 11435 11428 0 11:40下午 ?? 0:00.00 uwsgi --ini /usr/local/etc/uwsgi.ini501 11440 69240 0 11:40下午 ttys000 0:00.00 grep uwsgi $ $ lsof -i tcp:9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME uwsgi 11428 suoning 28u IPv4 0x5583e11534d24e73 0t0 TCP localhost:cslistener (LISTEN) $ $ lsof -i tcp:9005 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME uwsgi 11428 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN) uwsgi 11432 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN) uwsgi 11433 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN) uwsgi 11434 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN) uwsgi 11435 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN) $
FCGI
参考:http://webpy.org/cookbook/fastcgi-nginx
配置Nginx
$ cat etc/nginx/servers/pan.conf server {listen 80;server_name localhost;error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}location / {fastcgi_param REQUEST_METHOD $request_method;fastcgi_param QUERY_STRING $query_string;fastcgi_param CONTENT_TYPE $content_type;fastcgi_param CONTENT_LENGTH $content_length;fastcgi_param GATEWAY_INTERFACE CGI/1.1;fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;fastcgi_param REMOTE_ADDR $remote_addr;fastcgi_param REMOTE_PORT $remote_port;fastcgi_param SERVER_ADDR $server_addr;fastcgi_param SERVER_PORT $server_port;fastcgi_param SERVER_NAME $server_name;fastcgi_param SERVER_PROTOCOL $server_protocol;fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_script_name;fastcgi_pass 127.0.0.1:9005;}location /webstatic/ {expires 7d;add_header Cache-Control public;alias /Users/suoning/probject/python_project/webstatic/trunk/;}}$
配置application
简单示例
from flup.server.fcgi import WSGIServer from pan import appWSGIServer(app,bindAddress=(host, port), maxThreads=threads ).run()
生产环境示例
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'suoning'import sys import argparse from flup.server.fcgi import WSGIServer from lib.daemon import Daemon from pan import appAPP_NAME = 'pan_platform' APP_INST_NAME = '20170501'parser = argparse.ArgumentParser(description=u'Run an pan FastCGI server') parser.add_argument('command', type=str,help=u'command [start|stop|restart]',choices=['start', 'stop', 'restart']) parser.add_argument('-p', '--port', type=int,help=u'port of this server', required=True) parser.add_argument('-t', '--threads', type=int, default=50,help=u'max number of threads') parser.add_argument('-host', '--host', default='0.0.0.0',help=u'Listen to the main clause')class panPlatformDaemon(Daemon):def run(self):# 运行服务try:WSGIServer(app,bindAddress=(args.host, args.port),maxThreads=args.threads,umask=0111).run()except:sys.stderr.write('oops')def gen_pidfile(port):return '/var/run/%s_%s_%d.pid' % (APP_NAME, APP_INST_NAME, port)if __name__ == '__main__':args = parser.parse_args()daemon = panPlatformDaemon(gen_pidfile(args.port))if 'start' == args.command:daemon.start()elif 'stop' == args.command:daemon.stop()elif 'restart' == args.command:daemon.restart()else:print "Unknown command"sys.exit(2)sys.exit(0)
fastcgi协议和http协议在代码部署中的的优劣对比
fastcgi虽然是二进制协议,相对于http协议,并不节省资源。二进制协议,只能节省数字的表达,比如 1234567,用字符串表示需要7个Byte,用数字就是4个Byte,而字符串到哪里都一样
fastcgi在传输数据的时候,为了兼容cgi协议,还要带上一堆cgi的环境变量,所以和http协议相比,用fastcgi传输数据并不省,反而多一些
fastcgi 唯一的优点是,它是长连接的,用户并发1000个request,fastcgi可能就用10个 链接转发给后端的appplication,如果用http协议,那来多少给多少,会向后端appplication 发起1000个请求
http代理转发方式,在面对超高并发的情况下会出问题,因为,tcp协议栈当中,port是int16整型 你本地新建一个connect,需要消耗一个端口,最多能到65536。外部并发几十万个请求,port池耗干,你的服务器只能拒绝响应了
CGI, FCGI, SCGI, WSGI 区别
WIKI Links:
http://www.cnblogs.com/suoning/p/6786621.html
转载于:https://www.cnblogs.com/softidea/p/6855214.html
Python生产环境部署(fastcgi,uwsgi)相关推荐
- python生产环境部署
文章目录 一.前言 二.准备工作 三.安装python 四.安装虚拟环境 一.前言 在实际工作中,很多公司的生产环境都是隔离外网的,而且往往多个项目组共用相同的服务器,因此经常会遇到两个问题: pyt ...
- 如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)
本文主要向大家介绍了生产环境部署Python语言代码(django+uwsgi+nginx),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 基础环境不做介绍,在django开发w ...
- Django + Uwsgi + Nginx 实现生产环境部署1
项目开发完毕后,需要将代码放到服务器上,这样用户才能访问.接下来我们一步一步来进行一波部署操作. 1. 简单粗暴 项目开发完毕,在部署之前需要再配置文件中将 ALLOWED_HOSTS配置设置为:当前 ...
- django生产环境部署
最近尝试进行一些python web生产环境部署的任务.主要是使用django框架进行web开发.本地使用windows + python3.7可是上到服务器之后是ubuntu系统.ubuntu默认是 ...
- springcloud生产环境一般怎么部署_机器学习模型生产环境部署的四种系统架构总结...
本文将从简单到复杂介绍典型架构的特点以及其优缺点. 介绍 一旦数据科学家对模型的性能感到满意,下一步便是"模型生产环境部署", 没有系统的合理配置,您的Kaggle Top1模型可 ...
- 深度学习TensorFlow生产环境部署(环境准备篇)
最近在研究Tensorflow Serving生产环境部署,尤其是在做服务器GPU环境部署时,遇到了不少坑.特意总结一下,当做前车之鉴. 1 系统背景 系统是ubuntu16.04 ubuntu@ub ...
- 11-02 生产环境部署 部署微电影网站
生产环境部署 关键点: 安装依赖包 关闭调试模式 app.debug = False 修改mysql数据库连接,导入数据 开启多个端口后台运行 配置nginx反向代理 安装依赖包 步骤1: 获取依 ...
- SpringBoot与ElasticSearch、ActiveMQ、RocketMQ的整合及多环境配置、响应式框架WebFlux、服务器端主动推送SSE技术、生产环境部署、Actuator监控平台
1.SpringBoot 与 ElasticSearch 框架的整合 (1)主要的搜索框架:MySQL.Solr.ElasticSearch MySQL:使用 like 进行模糊查询,存在性能问题 S ...
- Vue.js 生产环境部署
生产环境部署 开启生产环境模式 开发环境下,Vue 会提供很多警告来帮你对付常见的错误与陷阱.而在生产环境下,这些警告语句却没有用,反而会增加应用的体积.此外,有些警告检查还有一些小的运行时开销,这在 ...
最新文章
- 京东数科首次公开:强一致、高性能分布式事务中间件JDTX
- java include 传递对象_变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)...
- 梯度下降法原理及实现
- 在命令行下进行Oracle用户解锁
- 关于vue项目中添加less,less-loader不能运行的问题
- HttpClientFactory 结合 Polly 轻松实现重试机制
- jdk源码——HashMap
- Android消息传递之EventBus 3.0使用详解
- H5自定义属性详细介绍
- android图像与动画处理,在Android和iPhone上对照片进行动画处理的7种最佳应用 | MOS86...
- 文本识别CRNN模型介绍以及pytorch代码实现
- MongoDB数据同步工具之 MongoShake
- 利用nat123解决微信公众号对接服务器必须为80端口的问题
- 在mosquitto和Node-Red间使用基于的MQTTS双向认证通讯( 私有CA)
- 【开源小软件 】Bing每日壁纸 V1.2.1
- GBase 8c核心技术简介
- linux命令 ln命令 ln -s命令
- SG3525频率和占空比参数的选取
- 面向小白visual studio 2019 添加第三方库教程
- SUSE Linux配置xmanager5