浅析Python项目服务器部署
基础理论
关于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
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地址:
总结
关于uWSGI服务器相关使用就总结到这里,因为在平时工作中会经常接触到,但是由于没有应用到一些高并发的场景,对于uwsgi调优方面没有多少经验,等待以后遇到此类问题再继续总结性能调优方面的问题。同时有关Nginx方面的配置留到下一篇文章继续讲,未完待续。。。。。
参考文章:
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/StatsServer.html
https://uwsgi-docs.readthedocs.io/en/latest/Options.html#harakiri
https://www.jianshu.com/p/c3b13b5ad3d7
https://docs.djangoproject.com/zh-hans/2.2/howto/deployment/wsgi/uwsgi/
https://blog.51cto.com/mbb97/2151933
浅析Python项目服务器部署的更多相关文章
- 康少带你python项目从部署到上线云服务器
首先,服务器要安装nginx和mysql,网站文件建议放在/usr/local/www,环境python3.6+mysql5.7,阿里云的服务器可以用公共镜像有一个配置好的,不然就自己装一下环境吧. ...
- nuxt.js express模板项目服务器部署
nuxt版本:0.10.6 技术栈:nuxt.js, express, pm2 部署环境:windows server 之前用nuxt.js 的express的模板项目在windows下用nginx进 ...
- JAVA项目服务器部署
1.下载 Java JDK 搜索jdk下载,然后进入JAVA官方网站jdk下载页,选择自己的对应的操作系统,点击下载 https://www.oracle.com/technetwork/java/j ...
- Spring框架学习笔记(6)——阿里云服务器部署Spring Boot项目(jar包)
最近接外包,需要部署服务器,便是参考了网上的几篇博文,成功在阿里云服务器成功部署了Spring Boot项目,特记下本篇笔记 Spring Boot项目打包 这里说一下部署的一些问题 1.mysql驱 ...
- 部署python项目到linux服务器
最近用Python写了个外挂,需要部署到Linux环境的服务器上,由于之前本地开发时使用virtualenv,使用这个虚拟环境有个好处是项目中依赖的库不会是全局的,只在当前项目的目录下有效,因为我是M ...
- 案例 (一)如何把python项目部署到linux服务器上
一.背景 用Python写了个脚本,需要部署到Linux环境的服务器上,由于服务器linux系统(centos,redhat等)自带的是python2,现在的python萌新都是从python3开 ...
- 云服务器部署Python项目(nginx+uwsgi+mysql+项目)
python项目部署到云服务器 关注公众号"轻松学编程"了解更多. 一.硬件准备 云服务器,系统ubuntu_16_04 . 注意:要在安全组中开放Http的80端口. 二.软件准 ...
- 使用Jenkins部署Python项目
廖大使用Fabric部署的.我使用Jenkins试试部署过程.虽然说是用python项目部署测试的,但其他项目也是同理的. 参考Jenkins+Python部署完整版,不过安装方式不同. 安装tomc ...
- Python web项目Django部署在Ubuntu18.04腾讯云主机上
Django2.1 + Python3.6 + nginx + uwsgi 部署到Ubuntu18.04 材料准备 准备一个Django项目 准备一台Ubuntu18.04的主机 ssh连接到主机(腾 ...
随机推荐
- 深度分析ReentrantLock源码及AQS源码,从入门到入坟,建议先收藏!
一.ReentrantLock与AQS简介 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:Reentra ...
- 使用Mac清理工具CleanMyMac对Mac电脑进行维护
CleanMyMac是Mac系统下的一款苹果电脑清理软件,同时也是一款优秀的电脑维护软件,它能通过用户手动运行CleanMyMac内置脚本文件,释放电脑内存,帮助电脑缓解卡顿现象,保证电脑的良好持续运 ...
- FL studio系列教程(十六):FL Studio查看菜单讲解
FL Studio中每个窗口的显示.隐藏和布局命令都在查看菜单中.其中它被分为窗口.布局和浏览器3个部分,各项名称都有其单独的作用.窗口部分主要是软件的显示的一些菜单这里就不详细讲解了,接下来我们重点 ...
- NOIP2015 解题报告
Day1 T3 运输计划 二分之后做一遍树上差分,找出被所有时间超限的运输计划覆盖的花费时间最长的航道,将其改造成虫洞. LCA 用倍增求可能会被卡常,建议用 Tarjan 求.
- CF980C Posterized
先来吐槽一下这个 sb 翻译,根本就没做过题吧-- 大概就是让你给值域分成连续的几组,每组大小不能超过 \(k\),然后将序列中的值全部替换成其组内的最小值,要使得序列的字典序最小. 因为是字典序,所 ...
- C语言讲义——链表的实现
节点(结构体描述) struct Node { int _id; char s[50]; struct Node* pre;// 指向前一个节点的地址 struct Node* next;// 指向下 ...
- C语言讲义——结构化编程(分支、循环)
顺序结构(从上到下) 分支结构(也叫选择结构) 循环结构 分支结构 if...else 最基本的分支结构是if(){}else{}. 为了代码的安全,同时也是出于代码规范的考虑,if()后面一定要加花 ...
- Java反射——java.lang.Class和类的加载
反射的基础: java.lang.Class Class类的实例对象,用于记录类描述信息. 源码说:represent classes and interfaces in a running Java ...
- J2EE基本概念
XO POJO:Plain Ordinary Java Object,简单java对象 PO:Persistant Object,持久层对象(对应数据库中一条记录) BO:Business Objec ...
- 【抓取】6-DOF GraspNet 论文解读
[抓取]6-DOF GraspNet 论文解读 [注]:本文地址:[抓取]6-DOF GraspNet 论文解读 若转载请于明显处标明出处. 前言 这篇关于生成抓取姿态的论文出自英伟达.我在读完该篇论 ...