一.导论

WSGI是Web服务器网关接口。它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求)
基于wsgi运行的框架有Bottle,Django,Flask,用于解析动态HTTP请求
支持WSGI的服务器
wsgiref
python自带的web服务器
Gunicorn
用于linux的 python wsgi Http服务器,常用于各种django,flask结合部署服务器。
mode_wsgi
实现了Apache与wsgi应用程序的结合
uWSGI
C语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发。   在部署python程序web应用程序时,可以根据性能的需求,选择合适的wsgi server,不同的wsgi server区别在于并发支持上,有单线程,多进程,多线程,协程的区别,
其功能还是近似,无非是请求路由,执行对应的函数,返回处理结果。

  1.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 设置读取它。

二.nginx+uwsgi结合的好处

1. 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx,

2.  nginx接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,
如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi, uwsgi接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,
wsgi 根据请求调用应用程序的某个文件的某个函数,最后处理完将返回值再次交给uwsgi,uwsgi将返回值进行打包,打包成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以及其后面的东西。

  uwsgi.py文件

# uwsgi在运行django项目的时候,必须找到django的wsgi.py文件内容中的参数,不然会报no application...的错
# 也就是得有这个实例化的对象才行: application = get_wsgi_application() #解决办法就是 uwsgi,一定要找到wsgi.py这个文件

三.关于几个概念和文件

  wsgi

wsgi    全称web server gateway interface,wsgi不是服务器,也不是python模块,只是一种协议,描述web server如何和web application通信的规则。
运行在wsgi上的web框架有bottle,flask,django

  uwsgi

uwsgi    和wsgi一样是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型
 uWSGI 
uWSGI    是一个web服务器,实现了WSGI协议,uwsgi协议。a  
  nginx 
nginx    web服务器,更加安全,更好的处理处理静态资源,缓存功能,负载均衡,因此nginx的强劲性能,配合uWSGI服务器会更加安全,性能有保障。
  django
django 高级的python web框架,用于快速开发,解决web开发的大部分麻烦,程序员可以更专注业务逻辑,无须重新造轮子

四.django运行环境 Nginx+uwsgi安装配置

 之前我们使用 python manage.py runserver 来运行服务器。这只适用测试环境中使用。

正式发布的服务,需要一个可以稳定而持续的服务器。

  1.基础开发环境配置

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

  2.提前安装好python3环境

  3.完成virtualenvwrapper工具的配置,解决虚拟环境问题

1. 安装虚拟环境virtualenv

​2. 安装virtualenvwrapper工具

​3. 确认virtualenvwrapper.sh脚本正常使用

​4. 确认用户环境变量配置文件,有virtualenvwrapper.sh的四行配置

  WORKON_HOME=~/Envs
  VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'
  VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3
  source /opt/python36/bin/virtualenvwrapper.sh
5.重新加载环境变量配置文件
  source /etc/profile ​6. 创建路飞学城专用虚拟环境luffy_city_env ​7. 上传requirements.txt ​8. 安装路飞学城项目所需要的所有模块(在虚拟环境安装)
  pip3 -i http://.pypi.douban.com/sample -r requirement
  其中xadmin如果装不上就使用这条命令:
  
 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 

五.centos7下安装配置mariadb数据库,且创建数据库数据,迁移导入路飞学城数据

  1.从windows上导出mysql的数据库

有两种方法
第一种:
mysqldump -u root -p --all-databases > luffy_city.sql
第二种:
直接从navicat导出数据库的数据
(1) 先从navicat导出数据库数据,导出为luffycity.sql
(2) 将luffycity.sql上传到服务器的/opt目录下
(3) 在服务器上进入mysql,然后创建数据库luffycity
(4) 切换到数据库luffycity(use luffycity)
(5) 使用命令source /opt/luffycity.sql导入luffycity.sql数据
(6) 使用show tables命令查看数据是否成功导入

  2.给mariadb的root用户远程登录权限(如果数据库init最后一步选择了y,允许root远程登录则不需要这一步)

#linux本机登录

mysql -uroot -p

# 允许root用户远程登录,并且给予所有数据库所有表的所有权限
grant all privileges on *.* to root@'%' identified by 'nihao123';
flush privileges;

 

  3.远程登录,导入数据

    在linux的mysql,导入这个数据文件

(1) 进入mysql
mysql -u root -p
(2) 切换数据库
use luffycity
(3) 导入数据
source /opt/luffycity.sql
注意1,SELinux和linux的防火墙要给关闭,否则windows去链接linux的3306端口可能被拒绝
注意2: 第3步一定要确认OK之后才能继续往下操作

六.测试使用linux的python解释器去运行项目 切换到 项目中运行(注意要解决解释器的模块问题,才能正常运转项目)

(1) 先修改路飞学城项目的settings.py文件

  一个是host=['*'],一个是数据库的用户密码,数据库名

ALLOW_HOSTS=["*"]
数据库连接配置
注意: mariadb就是mysql,这里的ENGINE不用修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
"HOST": "127.0.0.1",
"PORT": 3306,
"USER": "root",
"PASSWORD": "root",
"NAME": "luffycity",
}
}

  

 (2)进入项目文件夹运行项目

python3 manage.py runserver 0.0.0.0:8000  #这边一定要指定0.0.0.0:8000

七.安装测试uwsgi,使用uwsgi运行路飞学城,支持多进程

  1.安装uwsgi

(1) 进入luffy_city_env虚拟环境
workon luffy_city_env
(2) 安装uwsgi
pip3 install uwsgi

  2.测试uwsgi的功能是否正常

(1) 创建一个testqishi2.py          #这个文件路径随便建,只是你要知道他的路径
(2) 写入以下几行代码
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
(3) 通过uwsgi命令将测试文件跑起来
uwsgi --http :9000 --wsgi-file testqishi2.py
(4) 测试通过IP+端口访问
http://192.168.226.128:9000
(5)浏览器界面返回Hello World

  3.uwsgi启动路飞项目

uwsgi --http :9000 --module luffy.wsgi

  4.用uwsgi热启动项目

uwsgi --http :9000 --module lufei.wsgi --py-autoreload=1  #修改了项目会自动重新加载文件 这个命令需要在项目我文件夹才可意思使用,因为wsgi.py文件

  5.uwsgi启动要加载很多的参数,比较麻烦,所以我们把参数放在一个文件中用文件启动

(1) 创建一个配置文件uwsgi.ini(注意,这个配置文件不管放在哪里都可以,但是启动的时候,需要找到这个配置文件)
(2) 写入以下配置
[uwsgi]

  chdir = /opt/lufei_pro/lufei
  module = lufei.wsgi
  home = /root/Envs/luffy_city_env
  master = true
  processes = 1
  socket = 0.0.0.0:9000
  #http = 0.0.0.0:9000
  vacuum = true


(3) 通过指定uwsgi.ini配置文件把django跑起来
uwsgi uwsgi.ini

    #参数详解:

[uwsgi]
# Django-related settings
# the base directory (full path)
# 写上项目的绝对路径
chdir = /opt/book_manage
# Django's wsgi file
# 填写找到django的wsgi文件,填写相对路径,以chdir参数为相对路径
module = book_manage.wsgi
# the virtualenv (full path)
# 填写虚拟环境的绝对路径
home = /root/Envs/book_manage_env/
# process-related settings
# master
#启动uwsgi主进程
master = true
# maximum number of worker processes
processes = 1
# the socket (use the full path to be safe
#如果你使用了nginx,做反向代理,必须填写socket链接,而不是http参数
socket = 0.0.0.0:8000
#如果你不用nginx,直接使用uwsgi,运行一个http服务端,就用这个http参数
http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true

注意: socket和http参数二选一,一定要注意!!!!!!!!!!!!!!!!!!

注意: socket和http参数二选一,一定要注意!!!!!!!!!!!!!!!!!!

注意: socket和http参数二选一,一定要注意!!!!!!!!!!!!!!!!!!

  但是由于uwsgi 不支持处理静态文件,所以,我们需要配置nginx与uwsgi结合,通过nginx来处理静态文件

八.完成nginx的安装配置,是nginx可以帮我们处理静态文件和转发请求给uwsgi

  1.收集静态文件

     (1) 修改settings.py配置文件, 加入以下一行配置

STATIC_ROOT='/opt/luffy_pro/static'

     (2) 创建静态文件存放目录/opt/luffy_pro/static

mkdir -p /opt/luffy_city/static

      (3) 一条命令收集django项目下面的所有静态文件

python3 manage.py collectstatic
# STATIC_ROOT 文件夹 是用来将所有STATICFILES_DIRS中所有文件夹中的文件,以及各app中static中的文件都复制过来
# 把这些文件放到一起是为了用nginx等部署的时候更方便

    

    收集成功的标记

  2. 配置nginx结合uwsgi进行转发

    (1)在nginx.conf配置文件下添加以下配置文件

location / {
include /opt/nginx112/conf/uwsgi_params;
uwsgi_pass 0.0.0.0:9000;
}

  

    (2) 将uwsgi.ini配置文件里面的http注释掉,启用socket

socket          = 0.0.0.0:9000   # 启用此行
# http = 0.0.0.0:9000 # 停用此行

    (3) 在nginx.conf中添加静态文件地址

location /static{
alias /opt/lufei_pro/static;
}

  

    (4) 平滑重启nginx

/opt/nginx1-12/sbin/nginx -s reload

    (5) 在物理机上添加hosts

192.168.12.56    www.qishi2.com  #这样配置完了你也只能通过这两个配合8000端口访问,如果成功了说明后端配置成功了

九.验证

1.  验证域名是否正常访问

2.  验证静态文件是否正常显示

3.  验证数据库是否连接正常

4. 验证redis数据库是否连接正常

5.  验证uwsgi是否正常启动

十.安装node,配置vue前端

  1.下载安装node软件包

wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz

  2.解压(免安装)

tar -zxvf node-v8.6.0-linux-x64.tar.gz

   3.添加环境变量(/etc/profile,配置完记得source /etc/profile)

PATH=/opt/node-v8.6.0-linux-x64/bin:/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

  4.将vue项目里面的所有127.0.0.1和所有的localhost全部改为我们的服务器地址192.168.12.56

注意:   此步非常重要, 讲师机上面的vue项目里面,这个IP没有创建全局变量,导致127.0.0.1和localhost分布在很多个文件中,所以需要一个一个替换

  5.进入到vue前端的项目目录, 使用npm run build生成dist项目静态文件

cd /opt/luffy_pro/luffy_pc

npm run build

  6.在luffy_pc目录下就可以看到dist文件夹

/opt/luffy_city/luffy_pro/dist

  7.在nginx修改配置文件

    新增一个主机

server{
listen 80;
server_name 192.168.226.128;
#url匹配, 也就是在192.168.110.12时,此时进入location,返回vue的dist下的路飞学城首页index.html
location /{
root /opt/lufei_pro/lufei_02/dist;
index index.html index.htm;
}
}

  

    8.运行nginx,访问www.qishi2.com

十一.supervisor守护进程工具

  使用uwsgi启动django项目时,如果一旦挂掉了九九出大事情了,所以我们就用supervisor来为uwsgi开启守护进程

  1. 安装supervisor

·    由于supervisor在python3下无法使用,因此只能用python2去下载!!!!!!

    由于supervisor在python3下无法使用,因此只能用python2去下载!!!!!!

    由于supervisor在python3下无法使用,因此只能用python2去下载!!!!!!

ech# 注意此时已经退出虚拟环境了!!!!!
easy_install supervisor # 如果没有easy_install的话,就yum安装一个setuptools工具就可以用了
yum install python-setuptools

  2. 生成supervisord配置文件

echo_supervisord_conf > /etc/supervisord.conf

  3. 在/etc/supervisord.conf下添加以下两行配置

[program:luffy_city]
command=/root/Envs/luffy_city_env/bin/uwsgi /opt/luffy_city/luffy/uwsgi.ini #这里是结合virtualenv的命令 和supervisor的精髓!!!!

  参数详解:

supervisord.conf配置文件参数解释
[program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程 supervisord.conf配置文件参数解释

参数详解

  4.更新新的配置到supervisord

supervisorctl update

  5. 启动supervisor

supervisord -c /etc/supervisord.conf # 启动supervisor
supervisorctl -c /etc/supervisord.conf # 启动和进入supervisor交互模式

  6. 查看supervisor运行状态

supervisorctl  # 使用此命令后将会进入supervisor交互式管理界面
status # 查看进程运行状态

  7. 管理supervisor里面的进程

stop luffy_city    # 关闭luffy_city进程
stop all # 关闭所有进程
start luffy_city # 开启luffy_city进程
start all # 开启所有进程
status # 查看所有进程运行状态
restart 进程名称 #重启某一进程
supervisorctl reload #重新启动所有进程

supervisorctl status  # 可以不用进入交互模式查看

这边要注意的是:因为uwsgi启动了django项目,而访问这个项目时通过nginx转发到uwsgi,所以uwsgi启动django项目要早于naginx启动

nginx+uwsgi+virtualenv+supervisor部署项目的更多相关文章

  1. uWSGI+nginx+django+virtualenv+supervisor部署项目

    一.前言 在部署项目前,你已有一个能够在你本机测试过,能正常启动的Django项目(毕竟本文主要讲解部署Django项目),以及掌握了Linux系统的一些基本命令. 相关链接: Centos7安装py ...

  2. Linux(8)- nginx+uWSGI+virtualenv+supervisor 发布web服务器

    一.理论梳理 WSGI是web服务器的网关接口,它是一个规范,描述了web服务器(下图中的WEB server)如何与web应用程序(下图中的Application)通信,以及web应用程序如何链接在 ...

  3. Nginx+uwsgi+django+vue部署项目

    购买服务器 # 购买阿里云服务器 # 短期或是测试使用,创建 按量收费 服务器,可以随时删除,删除后不再计费,但要保证账户余额100元以上 连接服务器 1)账号 >: ssh root@39.9 ...

  4. nginx+uwsgi+flask+supervisor 项目部署

    环境 - Linux: Ubuntu 16.04 - uWSGI 2.0.18 - Flask 1.0.2 - supervisor 3.2.0 - nginx/1.8.1 首先区分几个概念 WSGI ...

  5. nginx+uwsgi+django+supervisor+mysql+redis

    目录 1. 概述 3 2. 安装与配置 3 2.1 django项目与应用创建 3 2.2 uwsgi安装与配置 6 2.3 supervisor安装与配置 8 2.4 nginx安装与作为反向代理服 ...

  6. 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...

  7. 使用Nginx+uWSGI+Django方法部署Django程序

    第一步先解决uwsgi与django的桥接.解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器. 第二步解决uwsgi与Nginx的桥接.通过nginx与uws ...

  8. 使用Nginx+uWSGI+Django方法部署Django程序(上)

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...

  9. 使用Nginx+uWSGI+Django方法部署Django程序(下)

    在上一篇文章<五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)>中,阐述了如何只使用uWSGI来部署Django程序. 当然,单单只有uWSGI是不够的, ...

随机推荐

  1. sencha:日期选择组件datepicker

    来源于<sencha touch权威指南> ------------------------------- 除app.js外,其它内容都与上一篇博客里的内容相同.app.js代码如下: E ...

  2. python gridsearchcv 里的评价准则

    http://scikit-learn.org/stable/modules/model_evaluation.html 3.3.1. The scoring parameter: defining ...

  3. Luogu 3206 [HNOI2010]城市建设

    BZOJ 2001 很神仙的cdq分治 先放论文的链接   顾昱洲_浅谈一类分治算法 我们考虑分治询问,用$solve(l, r)$表示询问编号在$[l, r]$时的情况,那么当$l == r$的时候 ...

  4. ESP8266文档阅读ESP8266 SDK 入门指南

    ESP8266 SDK  入门指南 1.概述 1.2.ESP8266 HDK 1.3.ESP8266 SDK 1.4.ESP8266 FW 1.5.ESP8266 工具集 2.1.开发板方案 3.软件 ...

  5. IIS身份验证知识摘录

    IIS 身份验证 ASP.NET 身份验证分为两个步骤.首先,Internet 信息服务 (IIS) 对用户进行身份验证,并创建一个 Windows 令牌来表示该用户.IIS 通过查看 IIS 元数据 ...

  6. eclipse——配置maven插件

    Step 1 配置installations installations:指定Maven核心程序的位置  从本地磁盘中找到本地maven的位置 Step 2 配置user settings user ...

  7. 半平面交 (poj 1279(第一道半平面NlogN)完整注释 )

    半平面交的O(nlogn)算法(转载) 求n个半平面的交有三种做法: 第一种就是用每个平面去切割已有的凸多边形,复杂度O(n^2). 第二种就是传说中的分治算法.将n个半平面分成两个部分,分别求完交之 ...

  8. 当Linux用尽内存

    Mulyadi Santosa 也许你很少面临这一情况,但是一旦如此,你一定知道出什么错了:可用内存不足或者说内存用尽(OOM).结果非常典型:你不能再分配内存,内核会杀掉一个任务(一般是正在运行那个 ...

  9. docker run hello-world失败

    提示镜像拉取失败,解决方案 到 https://cr.console.aliyun.com/   注册一个账户 列表中就有 加速器 启动  Docker 端  右键  选择配置 在Docker Dae ...

  10. SOA IN Real World

    微软发布了一个名为“真实世界里的面向服务架构(SOA)”的电子书.这本书表达了微软对面向服务架构的观点,并包括了数个展示如何用微软产品和技术实现SOA的真实案例.书中解释到,SOA的功能型架构本身是松 ...