网站是做响应式还是自适应的好,wordpress响应式电商,关闭未备案网站,网站建设方案怎样写项目部署
nginxuWSGI django
1. WSGI
WSGI是Web服务器网关接口。它是一个规范#xff0c;描述了Web服务器(返回静态资源的就是web服务器#xff0c;Nginx)如何与Web应用程序(django、Flask)通信#xff0c;以及Web应用程序如何链接在一起以处理一个请求#xff0c;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服务器常用于各种djangoflask结合部署服务器。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以及其后面的东西。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 interfacewsgi不是服务器也不是python模块只是一种协议描述web server如何和web application通信的规则。运行在wsgi上的web框架有bottleflaskdjangouwsgi
和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.repo5、清空之前的yum缓存 yum clean all1. 上传代码
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 -y2.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(系统全局配置文件每次开机都会加载这个文件) # pythonTab键 查看是否有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/profile2.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 Django2.1.8 # 安装Django2、保证本地开发模块和线上模块一致 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 uwsgi3.2 启动crm
使用uwsgi.ini 配置文件启动crm
touch uwsgi.inin # 进入项目目录创建改文件写入如下文件
[uwsgi]
# Django-related settings
# the base directory (full path)
# 填写项目的第一层路径(相对第二层目录的上层目录即wsgi文件的上层目录)
chdir /project/crm
# Djangos 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.com3.5 使用淘宝Nginx
3.5.1 下载淘宝nginx
链接地址Cnblogs.com/clschao/articles/10526431.html
wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz3.5.2 解压缩
tar -zxvf tengine-2.3.2.tar.gz3.5.3 安装
进入tengine-2.3.2(源码目录)开始编译三部曲
# 一、指定安装路径
./configure --prefix/project/tbnginx/
# 二、开始编译
make
# 三、安装
make install3.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 --colorauto nginxnetstat -tunlp | grep nginx # 查看端口tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 30373/nginx: master3.8 配置nginx
进入nginx安装目录,编辑nginx配置文件
vim ./conf/nginx.confnginx 配置文件 # 花括号闭合控制代码块语法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 reload4. 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绝对路径程序启动命令
autostarttrue ; # 在supervisord启动的时候也自动启动
startsecs10 ; # 启动10秒后没有异常退出就表示进程正常启动了默认为1秒
autorestarttrue ; # 程序退出后自动重启,可选值[unexpected,true,false]默认为
stopasgrouptrue ;# 默认为false,进程被杀死时是否向这个进程组发送stop信号包括子进程
killasgrouptrue ;# 默认为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