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:\data\db.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

 

posted @ 2019-09-15 17:14  Lowell  阅读(319)  评论(0编辑  收藏  举报