Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)
一丶集群和Nginx反向代理
集群的概念:
集群的特性:
Nginx的反向代理
# 反向代理 # 通过访问Nginx的web服务,由Nginx 对 '有效的请求' 进行一个请求转发,请求到真正的web服务后台数据.返回给用户. # 正向代理 # vpn . 访问外国的网站,需要把你的请求进行伪装/代理进行转发 ### 如下图~~:
二丶Wsgi
### Wsgi简介: WSGI是Web服务器网关接口。它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) # 基于wsgi运行的框架有bottle,DJango,Flask,用于解析动态HTTP请求 # 支持WSGI的服务器 1.wsgiref python自带的web服务器 2.Gunicorn 用于linux的 python wsgi Http服务器,常用于各种django,flask结合部署服务器。 3.mode_wsgi 实现了Apache与wsgi应用程序的结合 4.uWSGI C语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发。 ### 结论: 在部署python程序web应用程序时,可以根据性能的需求,选择合适的wsgi server,不同的wsgi server区别在于并发支持上,有单线程,多进程,多线程,协程的区别,其功能还是近似,无非是请求路由,执行对应的函数,返回处理结果。
Django部署
### Django部署 # 1. Django的主要部署平台是 WSGI,这是用于Web服务器和应用程序的Python标准。 # 2. Django的 startproject管理命令设置一个简单的默认WSGI配置,可以根据需要为您的项目进行调整,并指示任何符合WSGI的应用程序服务器使用。 # application # 3. 使用WSGI部署的关键概念是应用程序服务器用于与代码通信的 application 可调用。它通常在服务器可访问的Python模块中作为名为 application 的对象提供。 # 4. startproject 命令创建包含这样的 application 可调用的文件 <project_name>/wsgi.py. ,它被Django的开发服务器和生产WSGI部署使用。 # 5. WSGI服务器从其配置中获取 application 可调用的路径。 Django的内置服务器,即 runserver 命令,从 WSGI_APPLICATION 设置读取它。
三丶Nginx负载均衡
Nginx的优点
# 1. Web服务器,直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台WEB服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中, # 2. 实现负载的分发。那么会大大提升系统的吞吐率、请求性能、高容灾
# 特点: Nginx要实现负载均衡需要用到proxy_pass代理模块配置 Nginx负载均衡与Nginx代理不同地方在于 Nginx代理仅代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池 Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。
upstream配置
# 在 nginx.conf > HTTP 区域中配置如下内容: upstream django { server 10.0.0.10:8000; server 10.0.0.11:9000; }
# 在nginx.conf > http 区域 > server区域 > location配置中 # 添加proxy_pass location / { root html; index index.html index.htm; proxy_pass http://django; }
upstream分配策略
upstream默认按照轮训方式负载,每个请求按时间顺序逐一分配到后端节点。
# weight权重 upstream django { server 10.0.0.10:8000 weight=5; server 10.0.0.11:9000 weight=10;#这个节点访问比率是大于8000的 }
# ip_hash IP哈希 # 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器 upstream django { ip_hash; server 10.0.0.10:8000; server 10.0.0.11:9000; } # 注意:IP哈希和权重不一起使用
# backup 在非backup机器繁忙或者宕机时,请求backup机器,因此机器默认压力最小 upstream django { server 10.0.0.10:8000 weight=5; server 10.0.0.11:9000; server node.oldboy.com:8080 backup; }
Nginx负载均衡实验
# 1. 实验环境划分 角色 ip 主机名 lb01 192.168.119.10 lb01 web01 192.168.119.11 web01 web02 192.168.119.12 web02 # 2. 关闭防火墙 iptables -F sed -i 's/enforcing/disabled/' /etc/selinux/config systemctl stop firewalld systemctl disable firewalld # 3. web01服务器配置nginx,创建index.html server { listen 80; server_name 192.168.119.11; location / { root /node; index index.html index.htm; } } mkdir /node echo 'i am web01' > /node/index.html # 启动NGINX ./sbgin/nginx # 4. web02服务器配置nginx,创建index.html server { listen 80; server_name 192.168.119.12; location / { root /node; index index.html index.htm; } mkdir /node echo 'i am web02...' > /node/index.html #启动nginx ./sbing/nginx # 5. 配置lb01服务器的nginx负载均衡 # 5.1 配置nginx.conf http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream node { server 192.168.119.11:80; server 192.168.119.12:80; } server { listen 80; server_name 192.168.119.10; location / { proxy_pass http://node; include proxy_params; #需要手动创建 } } } # 6.手动创建proxy_params文件,文件中存放代理的请求头相关参数 [root@lb01 conf]# cat /opt/nginx/conf/proxy_params proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffering on; proxy_buffer_size 32k; proxy_buffers 4 128k; 启动lb01负载均衡nginx服务 ./sbin/nginx #### 总结: # 1. 一台机器做后端服务,一台机器搭建nginx环境. # 2. 修改nginx机器的配置 ### 配置负载均衡池 upstream mys23server { #默认负载算法是 轮询方式 server 192.168.13.70; server 192.168.13.117; } ### 配置server 虚拟主机 server { listen 80 default_server; server_name _; #当请求时 192.168.13.64:80/的时候,就进入如下的location location / { #请求转发参数 proxy_pass # proxy_pass是基于http协议的请求转发 # uwsgi_pass 结合python的uWSGI服务器,进行协同工作的 proxy_pass http://mys23server; # 配置请求转发的目标地址 } }
nginx负载均衡调度算法
# 调度算法 概述 轮询 按时间顺序逐一分配到不同的后端服务器(默认) weight 加权轮询,weight值越大,分配到的访问几率越高 ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器 url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器 least_conn 最少链接数,那个机器链接数少就分发 # 注意: 1.轮询(不做配置,默认轮询) 2.weight权重(优先级) 3.ip_hash配置,根据客户端ip哈希分配,不能和weight一起用
nginx动静分离负载均衡
# 分配: 系统 服务 软件 ip地址 centos7(lb01) 负载均衡 nginx proxy 192.168.119.10 centos7(web01) 静态资源 nginx静态资源 192.168.119.11 centos7(web02) 动态资源 django 192.168.119.12
四丶为什么要用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完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况 # 3.1 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。 # 3.2 负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。 # 3.3 静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。 ### 总结: Nginx对处理静态资源有极高的处理能力,减少对真正服务端的请求.可以利用Nginx实现高并发,高可用等. uwsgi是比wsgi更牛逼的网关接口.性能比wsgi更好.
五丶搭建环境(nginx,nodejs)
# 1.安装组件依赖 yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel # 2.配置yum源仓库 # 1. 进入yum源仓库 cd /etc/yum.repo.d # 2. 删除仓库里的内容/不删也可以 rm -rf ./* # 3. 进入阿里yum源 https://opsx.alibaba.com/mirror wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # 3. 安装nginx yum install nginx -y # 启动nginx nginx # 4. 安装nodejs 1.下载node源码 wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz 2.解压缩,由于这是编译好的二进制命令压缩包,直接配置环境变量即可使用 3.配置PATH PATH="/opt/python367/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/opt/tngx232/sbin:/opt/luffys23/node-v8.6.0-linux-x64/bin" 4.读取/etc/profile ,手动生效 5.查看node和npm的版本,是否正常 [root@s23_linux bin]# node -v v8.6.0 [root@s23_linux bin]# npm -v 5.3.0
六丶crm部署流程
crm部署流程 第一步.启动mariadb数据库 1.yum 配置yum源 yum install mariadb-server mariadb -y 2.通过yum安装的软件,怎么启动 systemctl start/stop/status/restart mariadb 3.登陆数据库 2.导出windows的数据库,导入给linux机器 导出命令 mysqldump -uroot -p se_crm > se_crm.sql #指定数据库导出到se_crm.sql这个数据文件中 传输到linux中,进行导入 简单的利用 lrzsz工具传输 或者下载xftp工具 导入数据的命令 方式1: 1.创建一个se_crm数据库 create database se_crm; #导入数据的命令 mysql -uroot -p se_crm < /opt/se_crm.sql #指定se_crm数据库,导入一个sql文件 方式2: 登陆数据库之后,用命令导入数据 1.创建一个se_crm数据库 create database se_crm; 2.切换数据库 use se_crm; 3.读取sql文件,写入数据集 mareiadb> source /opt/se_crm.sql; 第二步:准备python3环境,以及虚拟环境 1.编译安装python3,解决环境变量 2.下载virtualenvwrapper工具 3.使用mkvirtualenv命令,创建新的虚拟环境,用于启动crm mkvirtualenv s23_crm 4.拷贝crm代码,到linux机器 5.解决crm运行所需的依赖环境,django等模块,以及pymysql 解决办法1: 笨办法,一个个报错去看,去解决 pip3 install -i https://pypi.douban.com/simple django==1.11.23 pip3 install -i https://pypi.douban.com/simple pymysql pip3 install -i https://pypi.douban.com/simple django-multiselectfield pip3 install -i https://pypi.douban.com/simple django==1.11.23 不那么笨的办法: 导出python解释器模块的命令 pip3 freeze > requirements.txt #这个 requirements.txt文件是python程序员都认识的模块依赖文件 安装这个requirements.txt文件中所有的模块 pip3 install -r requirements.txt #指定依赖文件安装,读取文件中所有的模块信息 第三步: 安装uwsgi 1.通过pip3安装 pip3 install -i https://pypi.douban.com/simple uwsgi 2.通过uwsgi命令去启动django 启动方式1(只是练习用): 通过命令和参数形式 语法是: uwsgi --http :8000 --module 项目名.wsgi --http指定http协议启动socket服务端,可以通过浏览器直接访问 --module 是找到crm项目第二级目录下的wsgi.py 文件 uwsgi --http :8000 --module se_crm.wsgi 启动方式2(通过配置文件方式启动,线上是这么使用的) uwsig的配置文件 uwsgi.ini 1.创建配置文件 touch uwsgi.ini 2.写入如下内容 uwsgi.ini内容如下 [uwsgi] # Django-related settings # the base directory (full path) # 填写crm项目的绝对路径,第一层 chdir = /opt/crms23/se_crm # Django's wsgi file #填写crm项目第二层目录中的wsgi文件 module = se_crm.wsgi # the virtualenv (full path) #填写解释器的安装绝对路径(虚拟环境) home = /root/Envs/s23_crm # process-related settings # master master = true # maximum number of worker processes #指定uwsgi的多进程数量,指定为cpu的核数即可(填cpu的4倍数量) processes = 4 # the socket (use the full path to be safe #指定crm启动的协议,当你和nginx结合进行反向代理,就用unix-socket协议 ,这种方式无法直接访问,只能通过nginx反代 socket = 0.0.0.0:8000 #指定http协议启动,不安全,没有意义,只是自己调试使用 #http = 0.0.0.0:8000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true 指定uwsgi.ini配置文件启动 uwsgi --ini uwsgi.ini # 参数 --ini是指定文件的意思 3.收集django的所有静态文件,丢给nginx去处理 打开 django的settings.py,修改为如下行 STATIC_ROOT='/opt/crms23/crmstatic/' #加上这个参数就行了 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ] ### 通过命令收集django的所有静态文件 python3 manage.py collectstatic 第四步:启动nginx,配置反向代理 1.安装nginx 2.修改配置文件 nginx.conf , 注意server{}多虚拟主机是自上而下的加载顺序 因此修改第一个server{}虚拟主机,修改为如下反代的写法 且添加nginx处理django的静态文件方式 server { #nginx监听的地址 listen 80; #定义网站的域名 server_name www.s23lol.com; #charset koi8-r; #nginx的url匹配 , /这个斜杠就代表这样的请求: 192.168.13.117:85/ #这个是最低级匹配,所有的请求都会进入location,进行处理 #好比 http://192.168.13.117/crm/login/ location / { #基于uwsgi协议的请求转发,给后端django的启动地址 uwsgi_pass 0.0.0.0:8000; #这个是请求转发 include uwsgi_params; #这个是添加一个文件,添加请起头信息的 } #我现在想处理这样的请求 #我可以这样做 #当以后请求是从static开始,我就让他去这个目录去找 #http://192.168.13.117/static/css/reset.css #不加斜杠 location /static { alias /opt/crms23/crmstatic; } }
七丶vue+uwsgi+nginx部署项目
# https://www.cnblogs.com/pyyu/p/10160874.html
# 流程如下 1.前端搞起(nginx+vue ) 获取代码 wget https://files.cnblogs.com/files/pyyu/07-luffy_project_01.zip 2.解压缩代码,修改vue的提交数据地址,以及编译打包生成 dist 修改这个提交数据的地址js文件 /opt/luffys23/07-luffy_project_01/src/restful/api.js文件 进行批量替换 sed 处理文件内容的命令 #语法 sed -i "s/你想替换的内容/替换之后的内容/g" 文件名 # s是替换模式,g是global全局替换 -i 将替换结果写入到文件,如果不写-i,只是显示替换后的结果 sed -i "s/127.0.0.1:8000/192.168.13.117:8001/g" api.js 3.配置nodejs环境 1.下载node源码 wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz 2.解压缩,由于这是编译好的二进制命令压缩包,直接配置环境变量即可使用 3.配置PATH PATH="/opt/python367/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/opt/tngx232/sbin:/opt/luffys23/node-v8.6.0-linux-x64/bin" 4.读取/etc/profile ,手动生效 5.查看node和npm的版本,是否正常 [root@s23_linux bin]# node -v v8.6.0 [root@s23_linux bin]# npm -v 5.3.0 4.开始安装vue项目所需的node模块,默认找到当前文件夹的package.json文件 ,这里由于网速问题,可以配置淘宝的npm源 npm --registry https://registry.npm.taobao.org install #安装vue的模块 5.编译vue代码,生成dist npm run build 6.此时生成dist文件夹之后,可以丢给nginx去解析了 7.配置nginx.conf如下 #配置第二个虚拟主机,返回路飞的首页内容 server { listen 81; server_name _; #当我访问 192.168.13.117:81的时候,就进入如下的配置 location / { #定义网页根目录 ,填写vue的dist绝对路径 root /opt/luffys23/07-luffy_project_01/dist; index index.html; } #第三个虚拟主机,用于反向代理,请求转发给drf后台 server { listen 8001; server_name _; location / { include uwsgi_params; uwsgi_pass 0.0.0.0:8002; } } 8.配置drf的后台,提供数据支撑 获取后台代码 wget https://files.cnblogs.com/files/pyyu/luffy_boy.zip 创建新的虚拟环境 mkvirtualenv luffys23 解决模块依赖问题 可以进入本地开发环境, pip3 freeze > requirements.txt 然后安装这个文件(这就是个普通文本,可以手动写) touch requirements.txt 添加如下内容 certifi==2018.11.29 chardet==3.0.4 crypto==1.4.1 Django==2.1.4 django-redis==4.10.0 django-rest-framework==0.1.0 djangorestframework==3.9.0 idna==2.8 Naked==0.1.31 pycrypto==2.6.1 pytz==2018.7 PyYAML==3.13 redis==3.0.1 requests==2.21.0 shellescape==3.4.1 urllib3==1.24.1 uWSGI==2.0.17.1 9.安装这个文件 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 10.配置uwsgi和配置文件,启动drf pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi 11.写一个uwsgi.ini配置文件 touch uwsgi.ini [uwsgi] # Django-related settings # the base directory (full path) # 填写路飞项目的绝对路径,第一层 chdir = /opt/luffys23/luffy_boy # Django's wsgi file #填写路飞项目第二层目录中的wsgi文件 module = luffy_boy.wsgi # the virtualenv (full path) #填写解释器的安装绝对路径(虚拟环境) home = /root/Envs/luffys23 # process-related settings # master master = true # maximum number of worker processes #指定uwsgi的多进程数量,指定为cpu的核数即可(填cpu的4倍数量) processes = 4 # the socket (use the full path to be safe #指定crm启动的协议,当你和nginx结合进行反向代理,就用unix-socket协议 ,这种方式无法直接访问,只能通过nginx反代 socket = 0.0.0.0:8002 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true 12.启动drf后端 uwsgi --ini uwsgi.ini 13.登陆路飞 账号密码 alex alex3714 14.安装redis数据库,可以用于购物车功能 yum install redis -y 15.启动redis systemctl start redis 16.验证登陆redis [root@s23_linux ~]# redis-cli 127.0.0.1:6379> ping PONG 17.检查redis的key信息 127.0.0.1:6379> keys * (empty list or set) 18.解决路飞首页刷新404问题的办法 server { listen 81; server_name _; #当我访问 192.168.13.117:81的时候,就进入如下的配置 location / { #定义网页根目录 root /opt/luffys23/07-luffy_project_01/dist; index index.html; try_files $uri $uri/ /index.html; #这个参数是解决vue刷新404问题的参数 } }