• Nginx+uWSGI部署django项目


    一、python环境安装

    1.首先解决环境依赖的问题

    1.1 打开阿里云开源镜像站的官网https://opsx.alibaba.com/mirror

    1.2 找到centos,点击帮助,找到对应系统的yum源。

      yum源的工作目录,/etc/yum.repos.d目录下,只要在这个目录下名字叫做repo的文件,都会被yum取读取

      centos7:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    1.3 找到epel,点击帮助,找到对应系统的yum源。

      获取epel的yum源(第三方软件仓库,如nginx,redis等等)

      epel(RHEL 7):wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

    1.4 解决编译过程环境依赖

      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.下载python环境源码安装包

      wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz

    3.解压缩源代码包

      解压xz格式:xz -d

      解压tar:tar -xvf Python-3.6.7.tar -C /xxx   :-C可以指定解压目录,不写默认当前目录

    4.编译

    4.1 切到Python-3.6.7目录下[执行configure脚本文件,指定安装路径] ,释放makefile编译文件 ,让gcc工具去编译的

      [root@wupeiqi Python-3.6.7]#./configure --prefix=/opt/mypy/python36/

    4.2 指定make指令,读取makefile,开始编译

      make

    4.3 执行make install ,开始安装python3,这一步会生成python3解释器

      make install

     注:4.2和4.3合并执行make && make install

    5.环境变量的配置

    5.1 配置path环境变量,让系统可以补全python3的命令

      [root@wupeiqi bin]#echo $PATH

      /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

    5.2 添加python3的环境变量,注意,要添加到开头

      /opt/mypy/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

    5.3 写入到全局变量配置文件中,每次开机都加载/etc/profile中

      vim /etc/profile 到最后一行下面,加入如下配置

      PATH="/opt/mypy/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"

    5.4 修改完毕/etc/profile 必须 source读取一下

      source /etc/profile

    二、虚拟环境安装

    1.安装虚拟环境工具

     pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv 可以更换源

    2.创建虚拟环境

     第三方软件默认装在/opt下,切换到/opt目录下

     virtualenv  --no-site-packages  --python=python3  虚拟环境的名字

          不安装多余的包      指定解释器的python3

     virtualenv  --no-site-packages  --python=python3  myenv

    3.激活虚拟环境

     虚拟环境中安装的东西和系统无关,只能在虚拟环境中使用

     source myenv/bin/activate激活虚拟环境

    4.退出虚拟环境

     deactivate

    三、将项目在linux系统上运行

    1.将项目通过zip压缩后发送到linux系统上

    2.在linux系统上解压

      unzip xxx

    3.激活虚拟环境source myenv/bin/activate

    4.查看项目中是否有requirement.txt文件

     有:安装项目中的模块pip3 install  -i https://pypi.douban.com/simple -r requirements.txt

     无:运行程序,逐一安装

     以Django项目为例:python manager.py runserver  0.0.0.0:9000

     把你当前解释器所有的模块信息,导出到一个文件中
       pip3 freeze > requirement.txt

    5.安装数据库mariadb 

     yum install mariadb-server mariadb -y

    6.启动mariad,通过yum安装的软件,都可以用systemctl管理

     systemctl  start  mariadb

    7.导入数据库

    7.1 一般项目在压缩发送到linux上都会包含数据信息。如果没有单独进行数据的导入

    7.2 先将生产环境中的库导出,然后发送到linux

     在终端直接执行:mysqldump  -uroot  -p123  库名 > C:datadb.sql , 用户名密码以实际开发为主,不要用root。

    7.3 在将数据导入

     方法一,直接在终端执行:mysql -u用户名 -p密码 < 要导入的数据库数据(xx.sql)

     方法二,登录数据库后执行:

       本地创建库:create database db;

       使用已创建的库:use db;

       设置编码:set names utf8

       导入:source /opt/database/db.sql;

    8.对项目配置进行修改,如数据库信息,ALLOW_HOSTS相关的修改

    9.解决完毕问题之后,启动python项目,注意防火墙

      解决防火墙:iptables -F

    10.python manager.py runserver  0.0.0.0:9000 可以运行

    四、Nginx的安装使用

    nginx是个web服务器,常用作静态文件服务器,反向代理服务器,邮件代理服务器,负载均衡服务器

    1.安装淘宝nginx,编代码编译安装,先解决模块依赖

      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 openssl openssl-devel -y

    2.获取淘宝nginx的源代码

         wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz

    3.解压源代码包

      tar  -zxvf  tengine-2.3.2.tar.gz

    4.进入源代码目录开始编译   

    4.1 指定安装路径

       ./configure --prefix=/opt/s21/tngx

    4.2 编译且安装

      make && make install

    5.安装后生成4个目录,目录的含义   

      conf:存放配置文件 , 指定了这个软件各种功能的一个文件而已
      html:存放前端页面
      logs:nginx的运行日志
      sbin:nginx的可执行命令目录

    6.进入sbin目录,启动nginx

      ./nginx :启动nginx
      ./nginx -s stop :停止nginx
      ./nginx -t :检查nginx.conf的语法是否正确,最好每次更改配置文件后都执行一下,看看有无语法错误。
      ./nginx -s reload :不重启nginx,重新加载nginx配置,每次更改配置文件后都执行一次。

    7.Nginx的配置

    7.1 找到nginx.conf,学习语法

      vim nginx.conf

    http {
        include       mime.types;
        default_type  application/octet-stream;
        #日志格式化
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  logs/access.log  main;                                               
        
        
        ....
            #nginx支持多虚拟主机,只需要写入多个server关键字即可
        #虚拟主机1
        
         server {
            #基于端口的虚拟主机区分 
            listen       80;
            #基于域名的虚拟主机区分
            server_name  www.hello.com;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
                
            #这里是nginx的url匹配,如同django的url规则一样
            #当我请求 www.hello.com 的时候,就进入如下location匹配
            #这个是最低级的匹配,只是访问进行静态页面。所有请求都会走到这里
            location / {
                #root关键字定义虚拟主机的根目录, 这里是可以修改的,要访问的文件的根目录,hello下的index.html。
                root   /opt/hello/;
                #必须保证首页文件存在
                index  index.html;
                }
            }
    
            #虚拟主机2 
         server {
            listen       80;
            server_name  www.world.com;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;    
            #这里是nginx的url匹配,如同django的url规则一样
            #当我请求www.world.com 的时候,就进入如下location匹配
            #所有请求都会走到这里,world下的index.html
            location / {
                root   /opt/world/;
                #index参数是定义首页文件的名字的
                index  index.html;
            }
        
        }
        
    }
    View Code

    8.几种location

    # 第一种
    location / {
            #root关键字定义虚拟主机的根目录,会自动跳转到 hello下的index.html,访问的是静态文件
            root   /opt/hello/;
            #index参数是定义首页文件的名字
            index  index.html;
        }
    
    # 第二种
    location / {
        #实现反向代理的功能参数
            #访问域名后,自动跳转到http://192.168.182.131地址
        proxy_pass http://192.168.182.131;                                                         
     }
    View Code

    9.nginx的错误页面 404美化

    server {
            listen 80;
            server_name www.hello.com;   
            #通过这个参数定义即可,
            # 当访问www.hello.com出现错误时,跳转到指定error下的error.html,可以对错误页面进行美化。此代码写在哪个server下,就被哪个地址使用。    
            error_page  404              /404.html;
            location / {
                    root   /opt/error;
                    index error.html;
            }
    
    }  
    View Code

    10.Nginx负载均衡   

    10.1 准备好2台资源服务器,本应该提供一样的数据,进行负载均衡,实验目的,看到不同的页面,所以准备不同的页面数据
      192.168.182.131 资源服务器1 ,返回hello的页面
      192.168.182.132 资源服务器2 ,返回world的页面

    10.2 准备负载均衡服务器,配置如下
      在nginx配置文件中,添加如下配置,定义负载均衡池,写入后端项目地址

    # 默认轮询方式
    upstream myproject  {
        server 192.168.182.131;
        server 192.168.182.132; 
    }
    
    #权重方式
    upstream myproject  {
        server 192.168.182.131    weight=4;
        server 192.168.182.132 weight=1; 
    }
    
    #ip哈希方式,根据用户的来源ip计算出哈希值,永远只指派给一个服务器去解析
    #ip哈希不得与权重共同使用 
    upstream myproject  {
        server 192.168.182.131    ;
        server 192.168.182.132 ; 
        ip_hash;
    }
    
    #虚拟主机配置如下
    server {
        listen 80;
        server_name www.hello.com;
        #charset koi8-r;
        #access_log logs/host.access.log main;
        #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;
        location / {
            # root /opt/xxx/;
            # index index.html index.htm;
            #请求转发给负载均衡池
            proxy_pass http://myproject;
        }
    }    
    View Code

    五、uWSGI

    1.以往的python manage.py runserver 调用wsgiref去启动django,性能很低,单进程web,使用uWSGI启动django,可以支持并发,多进程,以及日志设置,多种功能。

    2.安装uWSGI

      pip3 install -i https://pypi.douban.com/simple  uwsgi

    3.nginx的配置,反向代理uWSGI

    3.1 修改nginx.conf如下

    server {
            listen       80;
            server_name  www.hello.com;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
            location / {
            #转发请求的方式配置在这里
            include    uwsgi_params;
            uwsgi_pass 0.0.0.0:8888;
            }
    } 
    View Code

    4.使用uWSGI的命令,参数形式启动项目

      uwsgi --http :8888  --module myproject.wsgi    

       --http 指定是http协议,去启动项目
       --module 指定django目录下的wsgi文件

    5.uWSGI支持的热加载命令

      uwsgi --http:8888  --module myproject.wsgi  --py-autoreload=1

    6.uWSGI以配置文件的形式启动 ,就是把你的启动参数,写入到一个文件中,然后,执行这个文件即可  

     配置文件名字可以叫做 uwsgi.ini ,内容如下,这个文件是手动生成的
     touch uwsgi.ini ,写入如下内容

    [uwsgi]
    # Django-related settings
    
    # the base directory (full path)填入项目的绝对路径 ,项目的第一层路径
    chdir = /opt/s21/Aida_crm
    
    # Django's wsgi file指定第二层项目下的wsgi文件
    module = Aida_crm.wsgi
    
    # the virtualenv (full path)找到虚拟环境的绝对路径
    home = /opt/s21/s21uwsgi
    
    # process-related settings
    # master
    master = true
    
    # 以cpu核数来填写,uwsgi的工作进程数
    processes = 2
    
    # the socket (use the full path to be safe)
    这是以uwsgi_socket协议启动的项目,无法再去通过浏览器访问,必须通过nginx以uwsgi协议去反向代理
    socket = 0.0.0.0:8888
    
    #也可以使用http协议去启动(仅用作调试使用)
    #http = 0.0.0.0:9000
    
    # ... with appropriate permissions - may be needed
    # chmod-socket = 664
    # clear environment on exit
    vacuum = true
    
    #后台运行参数,将uwsgi运行在后台,并且将django日志输出到uwsgi.log中
    daemonize = uwsgi.log
    View Code

    7.指定配置文件启动django

      uwsgi  --ini  uwsgi.ini 

    8.收集crm的所有静态文件,让nginx去解析

      对django的settings.py配置修改如下

      添加如下参数
      STATIC_ROOT='/opt/mystatic'

      STATIC_URL = '/static/'
      STATICFILES_DIRS = [
          os.path.join(BASE_DIR, 'static')
       ]

      在项目第一层目录下执行收集命令,执行命令,收集django的所有静态文件,系统会自动创建'/opt/mystatic'  这个文件夹

      python manage.py collectstatic

    9.配置nginx,找到crm的这些静态资源

      location / {
        include uwsgi_params;
        uwsgi_pass 0.0.0.0:8888;
         }

      #添加一个location,针对nginx的url进行匹配处理
      #当请求时 www.oldchouhuo.com/static/..... 这样的url的时候,nginx进行别名修改,去/opt/mystatic底下去寻找资源文件 

      location /static {
        alias /opt/mystatic;
       }

    六、前后端分离项目部署

    前言:前后端分离项目流程,通过访问nginx,会跳转到vue访问前端页面,然后前端向后端发请求,获取到后端数据。用户既不接触vue前端服务器的ip,也接触不到后端服务器ip。

    1.前端项目的部署

    1.1 将前端项目传到服务器 

      通过lrzsz,或者xftp传输到linux服务器上,并进行解压缩

    1.2 前端vue

      要在服务器上,编译打包vue项目,必须得有node环境

    1.3 下载node.js

      到网站https://nodejs.org/download/release/找到对应的项目使用版本进行下载,下载node二进制包就不用进行编译了。

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

      解压缩  tar  -zxvf  node-v8.6.0-linux-x64.tar.gz

    1.4 配置环境

      将node命令,添加至linux环境变量,修改/etc/profile,写入下面代码 

      PATH=$PATH:/opt/node-v8.6.0-linux-x64/bin

     1.5 读取文件,生效PATH

      source  /etc/profile

    1.6 测试是否完成

      [root@MiWiFi-R4-srv node-v8.6.0-linux-x64]# node -v

      v8.6.0

    1.7 node环境配置好后,安装模块

     使用npm,npm 是 Node 的模块管理器。npm install 命令用来安装模块到node_modules目录。

    $ npm install <packageName>

    进入vue项目源码目录 cd myvue
    安装vue项目模块,npm install默认去装package.json的模块内容,如果出现模块安装失败,手动再装
    注意,本地写的vue代码,接口文件请求url,很可能连接的服务器地址有问题,注意Axios.POST提交的地址,一定得发送给django应用(如果用了nginx,就发送给nginx的入口端口)
    演示时,将vue项目和django项目放在了一台服务器,通过nginx反向代理功能(8888端口),转发vue请求给django(9999)
    
    准备编译打包vue项目,替换配置文件所有地址,改为服务器地址
    sed -i 's/127.0.0.1:8000/192.168.31.176:8888/g' /opt/myvue/src/restful/api.js

    确保vue的route模式是history
    路径:opt/myvue/src/router/index.js
      export default new Router({
          linkActiveClass:'is-active',
          mode: 'history', //改成history模式
          ......
        })

    1.8 开始编译vue代码,生成dist静态网页文件夹

      npm run build

    1.9 检查dist文件夹

      [root@MiWiFi-R4-srv myvue]#ls dist

      index.html static

    vue代码到此结束。。。配置nginx,让nginx找到vue的index.html文件

    2.0 nginx配置

    server {
        #用户访问域名或者ip,默认是nginx的80端口
    
            listen       80;
            server_name  192.168.31.176;
        #url匹配  /   也就是请求地址是192.168.31.176端口80时,进入此location,返回vue的dist下index.html首页
            location / {
                  root     /opt/myvue/dist;
                  index   index.html;
            }
        }
    View Code

    注:到此访问192.168.31.176就可以访问index.html页面,如果无法访问则是防火墙问题,iptables -F解决防火墙。即可访问

    2.后端项目部署

    nginx的配置

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  192.168.31.176;
            location / {
                  root   /opt/myvue/dist;
                  index  index.html;
    
        #这一条参数确保vue页面刷新时候,不会出现404页面
          try_files $uri $uri/ /index.html;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
               root   html;
            }
        }
      server {
            listen       8000;
            server_name  192.168.31.176;
            location / {
                  include  uwsgi_params;
                   uwsgi_pass 0.0.0.0:9999;
            }
         }
    }  
    View Code
  • 相关阅读:
    进程、线程、协程
    C++内存模型
    动态库dll与静态库lib
    virtual 虚函数表
    C++面试随笔
    alloc()、malloc()、calloc()、realloc()区别及用法
    C/C++ 面试题记录
    VC底层钩子程序在Win7/Vista下无效
    JMeter安装之后修成中文版
    明天开始 新的旅程
  • 原文地址:https://www.cnblogs.com/liuweida/p/11519725.html
Copyright © 2020-2023  润新知