nginx+uWSGI + django部署项目

项目部署

nginx+uWSGI + django

1. WSGI

WSGI是Web服务器网关接口。它是一个规范,描述了Web服务器(返回静态资源的就是web服务器,Nginx)如何与Web应用程序(django、Flask)通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求)
基于wsgi运行的框架有bottle,DJango,Flask,用于解析动态HTTP请求

支持WSGI的服务器wsgirefpython自带的web服务器,django默认调用的模块Gunicorn用于linux的 python wsgi Http服务器,常用于各种django,flask结合部署服务器。mode_wsgi实现了Apache与wsgi应用程序的结合uWSGIC语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发。

在部署python程序web应用程序时,可以根据性能的需求,选择合适的wsgi server,不同的wsgi server区别在于并发支持上,有单线程,多进程,多线程,协程的区别,其功能还是近似,无非是请求路由,执行对应的函数,返回处理结果。

Django部署Django的主要部署平台是 WSGI,这是用于Web服务器和应用程序的Python标准。Django的 startproject管理命令设置一个简单的默认WSGI配置,可以根据需要为您的项目进行调整,并指示任何符合WSGI的应用程序服务器使用。application 
使用WSGI部署的关键概念是应用程序服务器用于与代码通信的 application 可调用。它通常在服务器可访问的Python模块中作为名为 application 的对象提供。startproject 命令创建包含这样的 application 可调用的文件 <project_name>/wsgi.py. ,它被Django的开发服务器和生产WSGI部署使用。
WSGI服务器从其配置中获取 application 可调用的路径。 Django的内置服务器,即 runserver 命令,从 WSGI_APPLICATION 设置读取它。

2. 为什么要用nginx,uwsgi

1、首先nginx 是对外的服务接口,外部浏览器通过url访问nginx,支持大并发

2、nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,

  • 如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,
  • 如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

3、要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况:

1、安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。2、负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。3、静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvhRH0F4-1615946465259)(D:\06_notes\picture\04_服务器部署架构流程.png)]

2.1 web服务器

传统的c/s架构,请求的过程是
客户端 > 服务器 
服务器 > 客户端
服务器就是:1.接收请求 2.处理请求 3.返回响应

2.2 web框架层

HTTP的动态数据交给web框架,例如django遵循MTV模式处理请求。
HTTp协议使用url定位资源,urls.py将路由请求交给views视图处理,然后返回一个结果,完成一次请求。
web框架使用者只需要处理业务的逻辑即可。

3. nginx、WSGI、uwsgi、uWSGI、django关系梳理

wsgi  
全称web server gateway interface,wsgi不是服务器,也不是python模块,只是一种协议,描述web server如何和web application通信的规则。运行在wsgi上的web框架有bottle,flask,djangouwsgi  
和wsgi一样是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型uWSGI  
是一个web服务器,实现了WSGI协议,uwsgi协议。nginx  
- web服务器,更加安全,更好的处理处理静态资源,缓存功能,负载均衡,因此nginx的强劲性能,配合uWSGI服务器会更加安全,性能有保障。
- 暴露在公网、支持大并发、可以封禁IP地址、反向代理django 
高级的python web框架,用于快速开发,解决web开发的大部分麻烦,程序员可以更专注业务逻辑,无须重新造轮子

案例:

配置阿里云yum源,方便下载各种转件:

1、进入Linux配置yum源路径

cd /etc/yum.repos.d/

2、删除原有repo结尾的仓库文件

rm -rf *

3、进入ali云镜像站

https://developer.aliyun.com/mirror/

4、获取两个yum仓库 ‘wget’ 表示在线下载

# 获取centos仓库   'CentOS-Base.repo'
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 再获取另一个软件比较多的epel仓库  'epel.repo'
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

5、清空之前的yum缓存

yum clean all

1. 上传代码

Windows + Linux互传文件

  • 通过拖拽形式上传,

    yum install lrzsz -y  # 安装lrzsz提供的文件传输软件
    - rz 是上传文件的命令
    - sz 是下载文件的命令
    

Linux + Linux 之间互传文件

  • 通过 scp 命令互传

    scp 本地文件 root@远程服务器IP:/上传地址
    

将本地代码压缩打包上传至服务器并解压

2. 安装python环境

# 解决编译python所需的基础开发环境yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

2.1 源代码编译安装

  • 获取python源码

    wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tar.xz
    
  • 解压缩python源码文件 Python-3.7.5.tar.xz

    xz -d Python-3.7.5.tar.xz
    tar -xf Python-3.7.5.tar
    
  • 编译三部曲

    # 进入源码目录,指定python安装路径
    cd Python-3.7.5
    ./configure --prefix=/project/python375/
    # 编译
    make
    # 安装
    make install
    
  • 编译安装完成后,配置Linux的PATH环境变量,且永久生效 /etc/profile(系统全局配置文件,每次开机都会加载这个文件)

    # python+Tab键 查看是否有python3# 获取环境变量  $是Linux取变量值得一个符号
    echo $PATHPATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
    # 进入python375/bin/ pwd 获取路径
    cd /project/python375/bin/
    pwd   # /project/python375/bin# 将获取的路径添加至PATH,冒号隔开(PATH加载顺序是从前往后)
    PATH='/project/python375/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'# 编辑/etc/profile 在最后一行添加新的PATH变量
    vim /etc/profile
    # 读取/etc/profile 让设置生效
    source /etc/profile
    

2.2 配置python的虚拟环境 virtualenvwrapper

在使用python开发的过程中,工程较多时,难免会产生 不同工程依赖不同版本库的问题;

或者是在开发过程中不想让物理环境里充斥着各种各样的库,引发以后依赖灾难

此时,就需要 对不同工程使用不同的虚拟环境 来保持开发环境的整洁

virtualenv 可以在系统中建立多个不同 并且相互不干扰的虚拟环境

安装这个工具

pip3 install virtualenvwrapper

配置虚拟环的环境参数:

打开 /etc/profile 添加如下 4个参数

export WORKON_HOME=~/Envs   #设置virtualenv的统一管理目录
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'   #添加virtualenvwrapper的参数,生成干净隔绝的环境
export VIRTUALENVWRAPPER_PYTHON=/project/python375/bin/python3     #指定python解释器
source /project/python375/bin/virtualenvwrapper.sh #执行virtualenvwrapper安装脚本

【提示】:virtualenv版本大于20,不需要添加 export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' #添加virtualenvwrapper的参数,生成干净隔绝的环境 此条参数,此版本默认已添加

手动安装虚拟环境工具

source /etc/profile

此时使用虚拟环境的命令,比较方便:

mkvirtualenv crm_venv1  # 创建虚拟环境
workon crm_venv1  # 激活/切换虚拟环境
deactivate  # 退出虚拟环境

2.3 在虚拟环境下启动crm项目

1、解决crm所需的模块(库)

pip3 install Django==2.1.8   # 安装Django

2、保证本地开发模块和线上模块一致

pip3 freeze > requirement.txt  # 导出当前python解释器所有模块信息至requirement.txt文件
pip3 install -r requirement.txt  # pip 会一行一行读取requirement文件一行一行安装

3、启动

python manage.py runserver 0.0.0.0:8000   # 只做调试代码使用

3. Nginx部署crm

用 supervisor 进程管理工具,指定 uwsgi 启动 crm

3.1 安装uwsgi

pip3 install uwsgi

3.2 启动crm

使用uwsgi.ini 配置文件,启动crm

touch uwsgi.inin   # 进入项目目录创建改文件

写入如下文件:

[uwsgi]
# Django-related settings
# the base directory (full path)
# 填写项目的第一层路径(相对第二层目录的上层目录,即wsgi文件的上层目录)
chdir           = /project/crm
# Django's wsgi file
# 填写第二层项目,填写Django的wsgi.py文件路径
module          = CRM_v1.wsgi
# the virtualenv (full path)
# cd virtualenv 进入虚拟环境的家目录,pwd获取虚拟环境的绝对路径
# 填写虚拟环境的绝对路径
home            = /root/Envs/crm_venv1
# process-related settings
# master
master          = true
# maximum number of worker processes
# 进程数(填写CPU核数,top查看)
processes       = 1
# the socket (use the full path to be safe
# 指定uwsgi的启动协议,是unix-socket协议,必须通过Nginx反向代理才能访问到
socket          = 0.0.0.0:8000# 还可以指定http协议,启动uwsgi
# http  = 0.0.0.0:8000# uwsgi内部解析的数据包大小,默认4k,如果准备接收大请求,可以增长到64k
buffer-size = 65535# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

指定uwsgi.ini配置文件,启动项目

 uwsgi --ini  uwsgi.ini  # --ini代表指定配置文件启动

3.3 nginx收集静态文件

uwsgi默认不解析Django的静态文件,需要收集起来给nginx

修改Django的静态文件 settings.py

vim supercm/settings.py# 添加如下参数
STATIC_ROOT='/project/crm_static' # 代表收集django所有静态文件,以及admin后台的静态文件(css、js、img等)

执行命令开始收集

python3 manage.py collectstatic  # 收集静态文件至STATIC_ROOT路径。

3.4 配置nginx反向代理及处理

查看服务器是否有Nginx

which nginx

查看淘宝使用的web服务器

curl -I taobao.com

3.5 使用淘宝Nginx

3.5.1 下载淘宝nginx

链接地址:Cnblogs.com/clschao/articles/10526431.html

wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
3.5.2 解压缩
tar -zxvf tengine-2.3.2.tar.gz
3.5.3 安装

进入tengine-2.3.2(源码目录),开始编译三部曲

# 一、指定安装路径
./configure --prefix=/project/tbnginx/ 
# 二、开始编译
make
# 三、安装
make install

3.6 配置环境变量

进入安装目录,找到路径,添加至PATH

cd tbnginx/
cd sbin/    # 进入可执行脚本
pwd         # /project/tbnginx/sbin
vim /etc/profile   # 编辑profile,将/project/tbnginx/sbin添加PATH,冒号隔开
source /etc/profile   # 执行profile 

3.7 启动nginx

nginx  # 启动ps -ef | grep nginx  # 查看Nginx进程,-ef 表示列出所有进程,管道符筛选nginxroot     30373     1  0 10:01 ?        00:00:00 nginx: master process nginx  # 用来调度nobody   30374 30373  0 10:01 ?        00:00:00 nginx: worker process  # 用来解析root     30389 10838  0 10:01 pts/0    00:00:00 grep --color=auto nginxnetstat -tunlp | grep nginx  # 查看端口tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      30373/nginx: master

3.8 配置nginx

进入nginx安装目录,编辑nginx配置文件

vim ./conf/nginx.conf

nginx 配置文件:

 # 花括号闭合控制代码块语法16 17 http {18     include       mime.types;19     default_type  application/octet-stream;...# nginx的虚拟主机功能,用于定义静态文件服务器,或者反向代理功能36     server {37         listen       80;38         server_name  localhost;39...44	        # 注意:这个location的作用就是定义静态文件服务器或者反向代理45         location / {# 注释掉root,去掉静态文件的功能46             # root   html;  # 指定nginx默认 页面路径47             # index  index.html index.htm;# nginx 请求转发的参数include    	uwsgi_params;   # 导入另一文件中参数使之生效uwsgi_pass  0.0.0.0:8000;      # 基于uwsgi协议的转发# proxy_pass		  # 反向代理,请求来了啥也不管直接转发给另一个人,基于的http协议转发48         }49
136 }

3.9 重启nginx

# 平滑重启,只重读nginx的配置文件nginx  -s reload

4. supervisor进程管理工具,启动uwsgi

安装supervisor:

yum install supervisor -y

生成配置文件:

echo_supervisord_conf  >  /etc/supervisord.conf   # 在/etc 下生成supervisord文件
worken + 'Tab'键
which uwsgi  # 获取绝对路径

编辑 /etc/supervisord.conf 配置文件,启动crm的任务

# supervisord.conf配置文件参数解释
# [program:xx]是被管理的进程配置参数,xx是进程的名称[program:crm]
command=/root/Envs/crm_venv1/bin/uwsgi  --ini   /project/crm/uwsgi.ini  ; # uwsgi绝对路径+程序启动命令
autostart=true       ; # 在supervisord启动的时候也自动启动
startsecs=10         ; # 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; # 程序退出后自动重启,可选值:[unexpected,true,false],默认为
stopasgroup=true     ;# 默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true     ;# 默认为false,向进程组发送kill信号,包括子进程

5. 启动supervisor,并且自动启动了uwsgi

supervisord -c  /etc/supervisord.conf  # d表示服务端

6. 管理supervisor的进程

supervisorctl  -c /etc/supervisord.conf  # ctl表示客户端

7. 处理uwsgi的静态文件

修改nginx.conf, 添加一个新的location路径匹配静态资源

location /static {alias /project/crm_static;
}

重启nginx

# 平滑重启,只重读nginx的配置文件nginx  -s reload

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

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

相关文章

71页《乌镇智库:全球人工智能发展报告(2018)》PDF下载

来源&#xff1a;专知【导读】人工智能热潮之下&#xff0c;斯坦福、阿里等纷纷出台人工智能报告。乌镇智库已连续发布三年《全球人工智能发展报告》&#xff0c;以宏观视角纵览全球人工智能发展&#xff0c;从产业、融资、技术、教育和应用等多个角度展现人工智能在全球的发展…

Windows实用技巧

Windows常用命令&#xff0c;亲测可用 创建文件夹Test&#xff0c;命令为&#xff1a;mkdir Test 盘符&#xff1a; 进入系统中的某个盘&#xff0c;例如E&#xff1a;进入E盘cd 文件夹位置 进入某个文件夹&#xff0c;需要先进入盘符&#xff0c;即完成第一步&#xff0c;例如…

python进程、线程、协程

通过学习bi站 蚂蚁学Python 老师视频总结文档&#xff0c;仅用于学习。。。 python进程、线程、协程 多线程&#xff1a;threading&#xff0c;利用CPU和IO可以同时执行的原理&#xff0c;不会让CPU干巴巴的等待IO完成 多进程&#xff1a;multiprocessing&#xff0c;利用多核…

一文读懂计算计仿真技术

来源&#xff1a;传感器技术计算机仿真作为分析和研究系统运行行为、揭示系统动态过程和运动规律的一种重要手段和方法, 随着系统科学研究的深入、控制理论、计算技术、计算机科学与技术的发展而形成的一门新兴学科。近年来, 随着信息处理技术的突飞猛进, 使仿真技术得到迅速发…

Chrome Cookie SameSite 属性设置

Chrome Cookie SameSite 设置 Chrome 51 开始&#xff0c;浏览器的 Cookie 新增加了一个SameSite属性&#xff0c;用来防止 CSRF 攻击和用户追踪。 Cookie 的SameSite属性用来限制第三方 Cookie&#xff0c;从而减少安全风险。 它可以设置三个值。 StrictLaxNone Chrome 默认…

胡蜂也会逻辑推理

胡蜂能通过基本的逻辑测试。来源&#xff1a; 中国科学报逻辑推理是一种复杂的行为&#xff0c;通常被认为仅限于具有复杂神经系统的动物。但一项新的研究表明&#xff0c;胡蜂可以运用某种逻辑推理。这在无脊椎动物中尚属首次。相关成果日前发表于英国《皇家学会生物学报》。这…

二十大未来最有潜力的新材料(绝对经典值得收藏)

来源&#xff1a;新材料在线石墨烯、碳纳米管、非晶合金、泡沫金属、离子液体……20种新材料&#xff0c;为材料工业工业发展带来无限机遇。材料工业是国民经济的基础产业&#xff0c;新材料是材料工业发展的先导&#xff0c;是重要的战略性新兴产业。今天&#xff0c;科技革命…

Unity3D 4.x 使用Mecanim实现动画控制

Unity3D 4.x 版本号之后提供了一种新的动画机制Mecanim&#xff0c;尽管眼下还支持之前的Animation。但看到Unity3D 4.3 预览版里Sprite的动画也是基于Animator的&#xff0c;可知Mecanim将会是以后动画播放的趋势&#xff01; Mecanim是一种基于状态机的结构&#xff0c;不同的…

全国国家重点实验室分布总览

来源&#xff1a;114产学研在我国的科研平台&#xff0c;企业国家重点实验室、国家重点实验室和省部共建国家重点实验室在科学前沿探索和解决国家重大需求方面发挥了非常重要的作用&#xff0c;在科学研究方面取得不少具有国际先进水平的成果。2018年5月21日&#xff0c;科技部…

能源枯竭?在能源互联网时代不存在!

曹军威清华大学信息技术研究院研究员、副院长北京智中能源互联网研究院首席科学家来源&#xff1a;DeepTech深科技演绎inSite第十一期节目能量路由器离我们还远吗&#xff1f;曹军威演绎inSite演讲视频链接&#xff1a;以下为曹军威老师演讲文字稿&#xff1a;&#xff08;根据…

Django3 --- ASGI

1. 什么是WSGI 1.1 CGI 解释 WSGI 之前应该先说一下什么是 CGI&#xff08;通用网关接口&#xff0c;Common Gateway Interface&#xff0c;CGI&#xff09;&#xff0c;是Web 服务器运行时外部程序的规范 &#xff0c; 是外部扩展应用程序与 Web 服务器交互的一个标准接口。…

网络安全:等保2.0落地在即,触发五百亿新增市场

报告数据来源&#xff1a;华创证券、东方财富、东吴证券前 言&#xff1a;据公安部十一局七处处长祝国邦&#xff1a;《网络安全等级保护技术》2.0版本将于5月13日发布。相比等保1.0只针对网络和信息系统&#xff0c;等保2.0把云计算、大数据、物联网等新业态也纳入了监管&…

Django3 --- async

官方文档&#xff1a;https://docs.djangoproject.com/en/3.2/releases/3.0/ Django 3.0 通过提供对作为ASGI应用程序运行的支持&#xff0c;开始了我们使 Django 完全具有异步能力的旅程。 Django 3.1于2020年8月4日发布&#xff01;从3.1版本开始&#xff0c;Django将逐步原…

产业|一文读懂自动驾驶汽车产业链上下游

来源&#xff1a; 亿欧自动驾驶汽车它的产业链上下游已经出现支撑公司&#xff0c;并在逐渐走向成熟。自动驾驶分级标准 关于自动驾驶的分级&#xff0c;主要有SAE&#xff08;美国机动车工程师学会&#xff09;标准和NHTSA&#xff08;国家公路交通安全管理局&#xff09;两个…

AI教父杰弗里辛顿:AI反学习可能揭开人类梦境的奥秘

来源&#xff1a;网易智能近日&#xff0c;多伦多大学的教员、谷歌大脑&#xff08;Google Brain&#xff09;研究员杰弗里辛顿&#xff08;Geoffrey Hinton&#xff09;发表了炉边谈话。他讨论了神经网络的起源&#xff0c;以及人工智能有朝一日可能像人类一样推理的可行性和意…

AttributeError: partially initialized module ‘aiohttp‘ has no attribute ‘ClientSession‘ (most...)

AttributeError: partially initialized module ‘aiohttp’ has no attribute ‘ClientSession’ (most likely due to a circular import) 问题描述&#xff1a; AttributeError: partially initialized module ‘aiohttp’ has no attribute ‘ClientSession’ (most likely…

AIoT重磅报告:四大关键助力,AI+IoT重新定义未来的可能性

来源&#xff1a;北京物联网智能技术应用协会,智能巅峰导 读随着科技的不断发展&#xff0c;一些在功能上具有相互补充作用的技术正在不可避免地发生结合——例如&#xff0c;人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;。在本文中&#xff0c;我…

python---aiohttp库

python—aiohttp库 1. 什么事aiohttp 官方网址&#xff1a;https://docs.aiohttp.org/en/stable/ 用于asyncio和Python的异步HTTP客户端/服务器 2. 安装 pip install aiohttp3. ClientSession() Session封装了一个连接池&#xff08;connector instance&#xff09;&…

关于机器学习实战,那些教科书里学不到的12个“民间智慧”

来源&#xff1a;towardsml机器学习算法被认为能够通过学习数据来弄清楚如何执行重要任务。这意味着数据量越大&#xff0c;这些算法就可以解决更加复杂的问题。然而&#xff0c;开发成功的机器学习应用程序需要一定的“民间技巧”&#xff0c;这在教科书或机器学习入门课程中很…

jsonp模拟获取百度搜索相关词汇

随便写了个jsonp模拟百度搜索相关词汇的小demo&#xff0c;帮助新手理解jsonp的用法。 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>模拟百度搜索框</title><style>*{margin: 0;padding:…