浅谈Python项目的服务器部署


Posted in Python onApril 25, 2021

关于Web服务器和应用服务器

基本概念:

  • Web服务器主要功能就是存储、处理、传递网页,客户端和服务器之间基于HTTP协议进行通信。
  • 应用服务器主要是处理动态请求,调用相应的对象完成对请求的处理,返回响应的结果。

两者之间的区别:

  • Web服务器主要是以HTTP为核心,WEB UI为向导的应用,处理一些静态请求。
  • 应用服务器虽然也支持HTTP协议,但应用服务器可以通过很多协议为应用程序提供商业逻辑。

Python项目部署架构

在我们平时搭建一个Python Web项目时,比如Django框架的项目,这时候常见的服务端架构:

  1. Nginx服务器作为代理服务器,代理处理静态资源(js,css,图片)请求,以及动态请求(增删改查)转发以及返回处理结果。
  2. uWSGI服务器负责接受Nginx服务器,处理过后转发给Django应用,接受Django应用处理返回的信息,在转发给nginx
  3. Django应用从uWSGI服务器接收请求,调用相应的业务逻辑,处理数据渲染相应的页面并且返回给uWSGI服务器。

关于cgi、wsgi、uwsgi、http协议

接下来针对上文提到Django项目部署架构,聊聊这几个协议在这过程中的作用:

  1. http协议:客户端程序和Nginx服务器通信就是基于http协议,而Nginx服务器作为一个代理服务器,会根据HTTP请求返回静态资源还是转发动态请求。
  2. cgi协议:cgi协议是外部应用程序和Web服务器之间的接口标准,简而言之,就是规定如何让一个程序与Web服务器程序之间通信。
  3. wsgi协议:基于现存的CGI标准设计,一个Python web框架编写的应用程序和Web服务器之间通信的规范。
  4. uwsgi:uWSGI服务器独有的协议,用于uWSGI服务器和其他Web服务器之间的数据通信

关于cgi、fastcgi、php-fpm、FastCGI(额外)

  1. CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
  2. FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。
  3. PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。
  4. PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。

关于uWSGI、Nginx服务器

简单来讲,uWSGI也是一个Web服务器,他虽然同时实现了http、uwsgi、wsgi协议,但是更多被作为应用服务器和应用程序之间进行通信。
那么这里就有个疑问了,为什么uWSGI都能直接处理http请求了,还需要Nginx服务器?这样处理有几点原因:

  1. 首先Nginx服务器在这过程中属于代理服务器的角色,每当一个http请求进来,就需要经过Nginx服务器,而Nginx服务器的优势就在于异步非阻塞的网络模型,它能够在单线程的情况下处理大量的请求,针对处理静态资源请求;而对于动态请求,能够通过缓存的功能,并且配合CDN进行优化,这样能够极大降低系统的负载,降低客户端响应时间。
  2. 其次,Nginx服务器能够进行负载均衡,启用多个后端服务器,通过Nginx对HTTP请求进行分配,这样能够极大优化架构的效率,提高处理的性能。
  3. 最后,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
 1	100.0   15144   6	0	0	0	idle    15ms    0	0	67.6K   1	0	125.449 15:48:08
  :2    16.7    -	1	0	-	-	idle    -	-	-	-	-
  :3    16.7    -	1	0	-	-	idle    -	-	-	-	-
  :0    33.3    -	2	0	-	-	idle    -	-	-	-	-
  :1    33.3    -	2	0	-	-	idle    -	-	-	-	-

具体有兴趣的同学可以参考github地址:

https://github.com/xrmx/uwsgitop

总结

关于uWSGI服务器相关使用就总结到这里,因为在平时工作中会经常接触到,但是由于没有应用到一些高并发的场景,对于uwsgi调优方面没有多少经验,等待以后遇到此类问题再继续总结性能调优方面的问题。同时有关Nginx方面的配置留到下一篇文章继续讲,未完待续。。。。。

以上就是浅谈Python项目的服务器部署的详细内容,更多关于python 服务器部署的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现倒计时的示例
Feb 14 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
深入理解Python装饰器
Jul 27 Python
Python3生成手写体数字方法
Jan 30 Python
在mac下查找python包存放路径site-packages的实现方法
Nov 06 Python
django之自定义软删除Model的方法
Aug 14 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
java字符串格式化输出实例讲解
Jan 06 Python
Django展示可视化图表的多种方式
Apr 08 Python
python字符串的多行输出的实例详解
Jun 08 Python
pandas求平均数和中位数的方法实例
Aug 04 Python
Python Socket编程详解
Apr 25 #Python
Python Django 后台管理之后台模型属性详解
如何用python反转图片,视频
python基于tkinter制作m3u8视频下载工具
用python自动生成日历
解决Django transaction进行事务管理踩过的坑
Apr 24 #Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 #Python
You might like
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
php数字游戏 计算24算法
2012/06/10 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
python中metaclass原理与用法详解
2019/06/25 Python
如何基于Python创建目录文件夹
2019/12/31 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
物流专业求职计划书
2014/01/10 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
在项目中使用redis做缓存的一些思路
2021/09/14 Redis