web应用程序之服务器部署

news2024/11/14 13:37:08

      当一个web应用层序开发好后,无论你是用什么语言,最后都要考虑部署到服务器上测试使用,这里就常见的服务器上部署进行如下的摸索总结。WSGI(Web Server Gateway Interface),翻译为Python web服务器网关接口,即PythonWeb应用程序(如Flask)和Web服务器(如Nginx)之间的一种通信协议。也就是说,如果让你的Web应用在任何服务器上运行,就必须遵循这个协议。

       那么实现WSGI协议的web服务器有哪些呢?就比如uWSGIgunicorn,下面总结了5个常用的WSGI容器

可能你在许多地方看到的都是采用Nginx + uWSGI(或gunicorn)的部署方式。实际上,直接通过uWSGIgunicorn直接部署也是可以让外网访问的,那你可能会说,那要Nginx何用?别急,那么接来下介绍另一个Web服务器——Nginx

Nginx作为一个高性能Web服务器,具有负载均衡、拦截静态请求、高并发...等等许多功能,你可能要问了,这些功能和使用Nginx + WSGI容器的部署方式有什么关系?

  • 首先是负载均衡,如果你了解过OSI模型的话,其实负载均衡器就是该模型中4~7层交换机中的一种,它的作用是能够仅通过一个前端唯一的URL访问分发到后台的多个服务器,这对于并发量非常大的企业级Web站点非常有效。在实际应用中我们通常会让Nginx监听(绑定)80端口,通过多域名或者多个location分发到不同的后端应用。
  • 其次是拦截静态请求,简单来说,Nginx会拦截到静态请求(静态文件,如图片),并交给自己处理。而动态请求内容将会通过WSGI容器交给Web应用处理;
  • Nginx还有其他很多的功能,这里便不一一介绍。那么前面说了,直接通过uWSGIgunicorn也可以让外网访问到的,但是鉴于Nginx具有高性能、高并发、静态文件缓存、及以上两点、甚至还可以做到限流与访问控制,所以选择Nginx是很有必要的;

这里可以说明,如果你选择的架构是:Nginx + WSGI容器 + web应用,WSGI容器相当于一个中间件;如果选择的架构是uWSGI + web应用,WSGI容器则为一个web服务器。那nginx+uwsgi 和nginx+gunicorn,这两种方案,应该如何选择呢?其实这个看自己的选择,两者都还行,不过第二种配置简单点。下面就这两种方式不同配置方式进行阐述。

(1)nginx+gunicorn

Gunicorn是一个WSGI HTTP服务器,python自带的有个web服务器,叫做wsgiref,Gunicorn的优势在于,它使用了pre-fork worker模式,gunicorn在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求,gunicorn依靠操作系统来提供负载均衡,推进的worker数量是(2*$num_cores)+1。我们知道,python是单线程的语言,当进程阻塞时,后续请求将排队处理。所用pre-fork worker模式,极大提升了服务器请求负载。

  • 安装及简单使用
pip install gunicorn

gunicorn -h
  • 简单示例
####测试脚本test.py
from flask import Flask

app = Flask(__name__)


@app.route('/demo', methods=['GET'])
def demo():
    return "gunicorn and flask demo."

###gunicorn运行脚本 -w 表示2个线程 -b 表示映射的ip及端口 -c 加载配置文件
gunicorn -w 2 -b 172.0.0.1:4000 test:app
  • 生产环境

在生产环境,起停和状态的监控最好用supervisior之类的监控工具,然后在gunicorn的前端放置一个http proxy server, 譬如nginx。

supervisorctl status        //查看所有进程的状态
supervisorctl stop es       //停止es
supervisorctl start es      //启动es
supervisorctl restart       //重启es
supervisorctl update        //配置文件修改后使用该命令加载新的配置
supervisorctl reload        //重新启动配置中的所有程序

(2)nginx+uwsgi

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx在Http Uwsgi Module中的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  • WSGI看过前面小节的同学很清楚了,是一种通信协议。
  • uwsgi同WSGI一样是一种通信协议。
  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

  • 安装简单使用
pip install uwsgi

uwsgi --ini uwsgi.ini   ####启动
 
uwsgi --stop uwsgi.pid  ##停止 当配置了pidfile = uwsgi.pid选项
 
killall -s INT /虚拟环境/bin/uwsgi  ##停止 ,未配置uwsgi.pid选项
 
ps -ef|grep uwsgi  ###查看与uwsgi相关的进程信息

使用示例可以参考https://blog.csdn.net/xiaomu_347/article/details/107191671。


补:supervisor

supervisor是一个用python语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制,更详细的使用方法请参考之前的文章 https://xugaoxiang.com/2019/12/04/supervisor/

首先创建/etc/supervisor/conf.d/gunicorn.conf文件,这是gunicorn服务的配置文件

[program:gunicorn]

command=/home/xugaoxiang/anaconda3/bin/gunicorn -w 2 -b :5000 run:app

directory=/home/xugaoxiang/workshop/Flask-10-wtf

autostart=true

autorestart=true

user=xugaoxiang

redirect_stderr=true

接着还是同样的方法创建nginx的配置文件,/etc/supervisor/conf.d/nginx.conf,内容是

[program:nginx]

command=/usr/sbin/nginx -g 'daemon on;'

autostart=true

autorestart=true

user=root

redirect_stderr=true

nginx是需要root权限的,所以user应该设置成root。最后就可以重启supervisor

sudo /etc/init.d/supervisor restart

参考链接:

1、深入理解uwsgi和gunicorn网络模型_uwsgi三层模型-CSDN博客(深入理解uwsgi和gunicorn网络模型)

2、https://segmentfault.com/a/1190000020386810?utm_source=tag-newest(Django搭建个人博客:将项目部署到阿里云服务器)

3、https://www.cnblogs.com/2mei/p/9213785.html(DJANGO项目部署到服务器上)

4、如何把本地的Django项目部署到服务器(亲测)_django webapi服务如何发布到服务器-CSDN博客(如何把本地的Django项目部署到服务器(亲测))

5、nginx+uwsgi 和nginx+gunicorn区别、如何部署

6、深入理解uwsgi和gunicorn网络模型

7、Flask教程(十二)项目部署-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2080582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【与C++的邂逅】--- 模板初阶

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 与C的邂逅 本篇博客我们将了解C中泛型编程体现的一大利器 --- 模板,有了模板可以帮我们用户省力。 🏠 泛型编程 如何实现一个通…

二叉树的三个简单题

1、二叉树的第k个结点 思路解析 由题可知这是一棵二叉搜索树 它或者是一棵空树,或者是具有下列性质的二叉树: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2. 若它的右子树不空,则右子树…

LSTM唐诗生成

LSTM唐诗生成 1课程简介1-2递归神经网络RNN1-3RNN网络细节1-4LSTM网络架构2-1处理Minist数据集2-2RNN网络模型及训练3-1任务概述与环境配置3-2参数配置3-3数据预处理模块3-4batch数据制作3-5RNN模型定义3-8测试唐诗生成效果 1课程简介 使用深度网络模型 写首歌 写个剧本等 原…

openshift node NotReady kubelet http: TLS handshake error

文章目录 问题现象解决方法 问题现象 openshift 集群 node 节点 notready $ oc get node NAME STATUS ROLES AGE VERSION master1.ocp4.demo.com Ready control-plane,master 4d14h v1.29.76abe8a1 master2.ocp4…

折腾 Quickwit,Rust 编写的分布式搜索引擎-官方教程

快速上手 在本快速入门指南中,我们将安装 Quickwit,创建一个索引,添加文档,最后执行搜索查询。本指南中使用的所有 Quickwit 命令都在 CLI 参考文档 中进行了记录。 https://quickwit.io/docs/main-branch/reference/cli 使用 Qui…

光庭信息半年报:营收利润「双」下降,汽车软件业务竞争加剧

「软件定义汽车」概念,不可否认强化了软件在整车价值的权重、带动更多供应商争夺软件业务的同时,也同样埋下了不小的风险。 比如,在汽车行业,常见的软件业务有两种:1、软件许可/IP,这类产品服务主要集中于…

MacOS 本地打开android模拟器

MacOS 本地打开android模拟器 查看本地安卓模拟器:emulator -list-avds 注意📢:这里会提示你找不到 emulator 命令,此时我们需要进入 cd ~/Library/Android/sdk/tools/ 查看模拟器列表:./emulator -list-avds 启动…

PHP概述-特点-应用领域-如何学习

老师建议注册使用百度文心一言;讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞;Kimi.ai - 帮你看更大的世界 等人工智能工具软件的一个到两个,也可下载文心一言、讯飞星火、kimi等APP软件使用,对于我们在读的大二学生来说有什么…

需方软件供应链安全保障要求及开源场景对照自评表(上)

国标《信息安全技术 软件供应链安全要求》确立了软件供应链安全目标,规定了软件供应链安全风险管理要求和供需双方的组织管理和供应活动管理安全要求。 开源软件供应链作为软件供应链的一种特殊形式,该国标亦适用于指导开源软件供应链中的供需双方开展组…

BaseCTF [Week2] 最简单的编码

前言:做题笔记。 下载解压 查壳。 64ida打开。 查找字符串。 跟进。 逆着向前看。 说明是密文。 里面是base64的变异加密。 原base64关键加密: (看BaseCTF week1 [第一周]BasePlus 官方WP) 变种后: 在此基础上加上了…

安卓系统 XBL阶段详解

在安卓系统的启动流程中,XBL(eXtensible Boot Loader 或 Secondary Bootloader)是一个关键阶段,特别是在使用QualComm(高通)等SOC(System on Chip)的设备上。以下是对XBL阶段的详细解…

Yololov5+Pyqt5+Opencv 实时城市积水报警系统

在现代城市生活中,积水问题不仅影响交通和人们的日常生活,还可能对城市基础设施造成潜在的威胁。为了快速、准确地识别和应对积水问题,使用计算机视觉技术进行智能积水检测成为一个重要的解决方案。在这篇博客中,我将带你一步步实…

数据结构(邓俊辉)学习笔记】串 08——KMP算法:再改进

文章目录 1. 美中不足2. 以卵击石3. 前车之覆4. 后车之鉴5. 可视对比 1. 美中不足 以上,我们不仅给出了 KMP 算法,同时也证明它的时间复杂度已经达到了渐进意义上的最优,也就是最坏情况也不超过 O(n)。而该算法目前这个版本也绝非完美无缺&am…

005、架构_数据节点

​DN组件总览 ​ DN节点包含进程 dbagent进程:主要提供数据节点高可用、数据导入导出、数据备份恢复、事务一致性、运维类功能、集群的扩缩容、卸数等功能;MySQL进程:主要提供数据一致性、分组管理、快同步复制、高低水位等;

机械学习—零基础学习日志(如何理解概率论10)

数理统计 这里X为总体。x1,x2,x3为样本。具体的取值为样本值。 抽样分布 来一道习题: 回答: 上一道题解析: 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版(王志超)》学习笔记 王志超老师 (UP…

一张图认识视频中间件

之前我们有介绍了很多关于视频中间件的技术资料: 超视网络视频中间件平台详解 视频中间件:海康E-home私有协议接入,并输出标准FLV/HLS/RTSP流 视频中间件:大华IPC/NVR 主动注册协议接入并输出标准FLV/RTSP/HLS流 视频中间件&#…

Meta AI动画生成功能的规模化部署与优化策略

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

SQL 注入之报错注入、延时注入、布尔盲注

在 SQL 注入攻击中,报错注入、延时注入和布尔盲注是常见的攻击手段。这些攻击方式利用了数据库系统在处理用户输入时的漏洞,从而获取敏感信息或者执行恶意操作。本文将详细介绍这三种 SQL 注入攻击方式的原理和实现方法。 一、报错注入 报错注入是利用…

【区块链 + 司法存证】易保全区块链电子数据存证保全系统 | FISCO BCOS应用案例

电子数据在司法领域存在诸多痛点,如数据存储成本高、安全性低;数据控制权分离带来的举证责任分配困难; 读取难度大、证据展示困难;数据独立、无法在司法机构间进行协同共享等。易保全首创“区块链 司法 应 用”的模式&#xff0…

如何提高OZON电商店铺的客户满意度

以下是提高 OZON 电商店铺客户满意度的方法: 一、产品质量与描述相符 严格选品把控:花费 1-2 小时深入研究供应商和产品质量。在选择产品时,要与可靠的供应商合作,确保产品的质量稳定。例如,对于电子产品&#xff0c…