浅谈Python项目的服务器部署
作者:咸鱼彬 发布时间:2021-01-10 04:26:48
目录
关于Web服务器和应用服务器
Python项目部署架构
关于cgi、wsgi、uwsgi、http协议
关于cgi、fastcgi、php-fpm、FastCGI(额外)
关于uWSGI、Nginx服务器
uWSGI
安装部署
相关文件
配置示例
常用命令
服务监控
总结
关于Web服务器和应用服务器
基本概念:
Web服务器主要功能就是存储、处理、传递网页,客户端和服务器之间基于HTTP协议进行通信。
应用服务器主要是处理动态请求,调用相应的对象完成对请求的处理,返回响应的结果。
两者之间的区别:
Web服务器主要是以HTTP为核心,WEB UI为向导的应用,处理一些静态请求。
应用服务器虽然也支持HTTP协议,但应用服务器可以通过很多协议为应用程序提供商业逻辑。
Python项目部署架构
在我们平时搭建一个Python Web项目时,比如Django框架的项目,这时候常见的服务端架构:
Nginx服务器作为代理服务器,代理处理静态资源(js,css,图片)请求,以及动态请求(增删改查)转发以及返回处理结果。
uWSGI服务器负责接受Nginx服务器,处理过后转发给Django应用,接受Django应用处理返回的信息,在转发给nginx
Django应用从uWSGI服务器接收请求,调用相应的业务逻辑,处理数据渲染相应的页面并且返回给uWSGI服务器。
关于cgi、wsgi、uwsgi、http协议
接下来针对上文提到Django项目部署架构,聊聊这几个协议在这过程中的作用:
http协议:客户端程序和Nginx服务器通信就是基于http协议,而Nginx服务器作为一个代理服务器,会根据HTTP请求返回静态资源还是转发动态请求。
cgi协议:cgi协议是外部应用程序和Web服务器之间的接口标准,简而言之,就是规定如何让一个程序与Web服务器程序之间通信。
wsgi协议:基于现存的CGI标准设计,一个Python web框架编写的应用程序和Web服务器之间通信的规范。
uwsgi:uWSGI服务器独有的协议,用于uWSGI服务器和其他Web服务器之间的数据通信
关于cgi、fastcgi、php-fpm、FastCGI(额外)
CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。
PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。
PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
关于uWSGI、Nginx服务器
简单来讲,uWSGI也是一个Web服务器,他虽然同时实现了http、uwsgi、wsgi协议,但是更多被作为应用服务器和应用程序之间进行通信。
那么这里就有个疑问了,为什么uWSGI都能直接处理http请求了,还需要Nginx服务器?这样处理有几点原因:
首先Nginx服务器在这过程中属于代理服务器的角色,每当一个http请求进来,就需要经过Nginx服务器,而Nginx服务器的优势就在于异步非阻塞的网络模型,它能够在单线程的情况下处理大量的请求,针对处理静态资源请求;而对于动态请求,能够通过缓存的功能,并且配合CDN进行优化,这样能够极大降低系统的负载,降低客户端响应时间。
其次,Nginx服务器能够进行负载均衡,启用多个后端服务器,通过Nginx对HTTP请求进行分配,这样能够极大优化架构的效率,提高处理的性能。
最后,Nginx有很多模块支持一些比如白名单,黑名单功能,并且配合keepalive实现高可用的架构.
总而言之,Nginx服务器在处理http请求上,都有着uWSGI没有的优势,所以在日常部署环境中,经常会使用到Nginx+uWSGI。
uWSGI
安装部署
uWSGI有两种安装方式,一种是通过pip安装,一种是通过源码安装。这里就简单介绍pip安装方式,源码安装有兴趣可以私下自己了解。
pip install uwsgi
相关文件
uWSGI服务器在启动的过程中主要涉及到以下这几个文件,其中uwsgi.sock还会涉及到Nginx相关部署的问题,在Nginx配置的时候回继续展开讲。
(venv) [root@mbb-48 uwsgi]# tree .
.
|-- uwsgi.ini # uwsgi配置文件
|-- uwsgi.log # uwsgi日志文件
|-- uwsgi.pid # uwsgi运行进程pid
|-- uwsgi.sock # uwsgi socket
`-- uwsgi.status # uwsgi状态文件
配置示例
以下配置是自己一个项目中用到的,其中的配置参数都是比较常见通用。
[uwsgi]
chdir=/data/Novel/novel_test
module=novel_test.wsgi:application
home=/data/Novel/venv
static-map=/static=/data/Novel/novel_test/static
threads=8
http=0.0.0.0:23606
master=true
vacuum=true
thunder-lock=true
uid=root
gid=root
harakiri=30
post-buffering=4096
socket=%(chdir)/uwsgi/uwsgi.sock
stats=%(chdir)/uwsgi/uwsgi.status
pidfile=%(chdir)/uwsgi/uwsgi.pid
daemonize=%(chdir)/uwsgi/uwsgi.log
配置解析
chdir: 定义项目的目录
module: 要使用的 WSGI 模块,不同的Python web框架中使用方式也不太一样。
home: 指定Python执行环境,这个参数针对有不同Python运行环境,比如virtualenv创建独立Python环境的情况。
static-map: 映射静态目录
threads: 线程数量
http: 指定启动地址和端口
master: 启用主进程
vacuum: 退出时,清理产生的中间文件(sock,pid,stats)
thunder-lock: 序列化接收的内容
uid: 指定启动用户
gid: 指定启动组
harakiri: 设置服务器响应时间
post-buffering: 启用缓冲
socket: socket文件存放路径
stats: stats文件存放路径
pidfile: pid文件存放路径
daemonize: 日志文件输出文件路径
额外配置
processes: 进程数量
buffer-size: 设置缓冲大小
listen: 设置监听队列大小(默认100)
max-requests: 每个工作进程请求书的最高上限
procname-prefix-spaced: 工作进程的前缀名
wsgi-file: 指定加载WSGI文件
常用命令
上面介绍了相关常用的配置参数,当设置uWSGI参数后,需要启动指定配置文件,以及有关暂停,重启的动作。
uwsgi --ini uwsgi.ini # 启动uWSGI
uwsgi --stop uwsgi.pid # 暂停uWSGI
uwsgi --reload uwsgi.pid # 重启uWSGI
服务监控
uWSGI之一Stats服务器机制,它能将uWSGI状态作为一个JSON对象导出一个socket中,只需要像我们前面配置uWSGI配置文件一样,添加stats选项,跟着一个有效的socket地址接口。
当你配置完毕后,就可以通过客户端连接到指定的socket地址,将会获得一个包含uWSGI内部统计数据的JSON对象。
uwsgi --connect-and-read uwsgi.status
执行完这个命令后,读取的返回的结果是一个json字符串,字符串中包括每个线程的状态,整个应用的负载,版本,监听队列等详细的信息。
uwsgitop查看实时状态
uwsgitop是一个开源的实时监控uWSGI服务器状态的工具,安装也十分简单:
pip install uwsgitop
具体uwsgitop像一个top命令,监听应用程序并且使用socket地址进行调用,查看进程运行状态,运行详细信息:
uwsgitop uwsgi/uwsgi.status
uwsgi-2.0.19.1 - Sun Sep 20 15:58:48 2020 - req: 6 - RPS: 0 - lq: 0 - tx: 67.6K
node: mbb-48 - cwd: /data/Novel/novel_test - uid: 0 - gid: 0 - masterpid: 15109
WID % PID REQ RPS EXC SIG STATUS AVG RSS VSZ TX ReSpwn HC RunT LastSpwn
1100.0 15144 6000idle 15ms 0067.6K 10125.449 15:48:08
:2 16.7 -10--idle -----
:3 16.7 -10--idle -----
:0 33.3 -20--idle -----
:1 33.3 -20--idle -----
具体有兴趣的同学可以参考github地址:
https://github.com/xrmx/uwsgitop
总结
关于uWSGI服务器相关使用就总结到这里,因为在平时工作中会经常接触到,但是由于没有应用到一些高并发的场景,对于uwsgi调优方面没有多少经验,等待以后遇到此类问题再继续总结性能调优方面的问题。同时有关Nginx方面的配置留到下一篇文章继续讲,未完待续。。。。。
来源:https://www.cnblogs.com/linshukai/p/14137601.html
猜你喜欢
- 本文实例为大家分享了python实现微信消息防撤回的具体代码,供大家参考,具体内容如下使用了sqlite3保存数据,当有人撤回消息时取出数据
- 如下所示:# -*- coding: utf-8 -*-# 简述:话说有一对可爱的兔子,出生后的第三个月开始,每一月都会生一对小兔子。# 当
- 有如下 Pandas DataFrame:import pandas as pdinp = [{'c1':10, '
- 理解 CPU 工作原理,重要的是理解 pc 不停地自增地址,顺序执行程序指令。当遇到跳转指令时,会将 pc 重置为新地址。在顺序执行程序指令
- 1. 复制表结构及其数据:create table table_name_new as select * from table_name_o
- 字符串的相似性比较应用场合很多,像拼写纠错、文本去重、上下文相似性等。评价字符串相似度最常见的办法就是:把一个字符串通过插入、删除或替换这样
- 1、二者的区别apply(): 非异步(子进程不是同时执行的),堵塞主进程。它的非异步体现在:一个一个按顺序执行子进程, 子进程不
- 加号+, 是字符串优先.并且从左向右计算. 就是运算前后两个值,只要有一个是字符串,就会将其中一个非字符串的试图转换成字符串.
- 在现代LOGO设计当中,叶子的形状被视做好的创意。或者说,是一种变革的想法。在网页中他们大多被用于轻量级的解决方案、干净的不抽像的设计。在实
- Django 提供内置的视图(view)函数用于处理登录和退出 (以及其他奇技淫巧),但在开始前,我们来看看如何手工登录和退出。 Djang
- 我们可以通过 asyncio.wait() 函数等待异步任务完成。可以等待不同的条件,例如所有任务完成、第一个任务完成以及第一个任务因异常而
- reduce() 函数在 python 2 是内置函数, 从python 3 开始移到了 functools 模块。官方文档是这样介绍的re
- 1、简要说明结巴分词支持三种分词模式,支持繁体字,支持自定义词典2、三种分词模式全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快
- 本文程序针对Python选课系统进行开发,供大家参考,具体内容如下角色:学校、学员、课程、讲师要求:1. 创建北京、上海 2 所学校2. 创
- 什么是异步?含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,
- 很高兴参加了这一期的薯片会,认识了几个朋友~~不料的却是今天我要来总结一下本次薯片会我们总共讨论了三个议题:A、 如何让“用户”更容易识别超
- webargs是一个用于解析和验证HTTP请求对象的Python库,内置了对流行web框架的支持,包括Flask、Django、Bottle
- 今天重新研究了下VB里面的ScriptControl组件,发现asp里面也能调用。研究了下方法,后来和lcx讨论了下。得到了如下代码,在此感
- 在sql语句中,如果查找某个文本字段值为空的可以用select * from 表 where 字段=''但是如果
- 做过主页的朋友,几乎没有一个人没用到它,它使我们排版更加轻松。有人说DW的表格没有Fp的好用,我认为不