Linux-Django发布

linux+python3+virtualenv+uwsgi+supervisor+nginx部署Django web发布环境

django web

一、python3源码包安装

  1. 首先安装一些编译源码需要的依赖文件

    1
    yum -y install gcc make cmake zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel
  2. 安装python3

    1
    2
    3
    4
    5
    6
    cd /usr/local/
    tar -zxvf Python-3.6.5.tgz # 注意版本
    mkdir python3
    cd Python-3.6.5
    ./configure --prefix=/usr/local/python3/
    make && make install

    解压缩python包

    指定编译位置

    编译并安装

    1
    2
    3
    4
    5
    6
    7
    8
    yum install -y vim  # 安装个vim先,vi强化版
    vim /etc/profile # 编辑环境变量文件,添加python3的环境变量

    PATH=$PATH:/usr/local/python3/bin/
    export PATH

    source /etc/profile
    python3

    添加python3环境变量

    完成python3安装

二、virtualenv创建虚拟环境并安装Django

  1. 安装基础环境配置

    1
    yum groupinstall "Development tools"
  2. 安装virtualenv

    1
    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
  3. 创建虚拟环境

    1
    2
    cd /home/
    virtualenv --python=python3 django_env
  4. 进入虚拟环境

    1
    . /home/django_env/bin/activate
  5. 虚拟环境中安装django

    1
    pip install django==2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

    虚拟环境

  6. 创建Django项目

    1
    2
    django-admin startproject mywebsite

  7. 修改配置文件,允许任意主机访问

    1
    2
    vim mywebsite/mywebsite/settings.py

    setting加允许任意主机访问

  8. 可以测试一下

    1
    2
    python3 mywebsite/manage.py runserver 0.0.0.0:8000

    看到报错

    django2.2报错

    1
    2
    3
    不要慌,这是SQLite版本问题,关闭版本检测即可
    vim /home/django_env/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py

    关闭版本检测

    再次运行

    1
    2
    python3 mywebsite/manage.py runserver 0.0.0.0:8000

    在本机输入ip:8000,发现仍无法访问,是因为防火墙的原因,这里先关闭防火墙

    1
    2
    3
    4
    5
    systemctl stop firewalld.service     # 关闭防火墙
    systemctl disable firewalld.service # 设置开机默认关闭

    python3 mywebsite/manage.py runserver 0.0.0.0:8000 # 运行django项目

    success

    恭喜你,项目运行了

三、uwsgi安装

以上的运行方式,实际上调用了py内置的socket模块,单进程单线程,效率比较低

使用uwsgi启动django项目,可以支持多线程,且稳定效率高

1
2
pip3 install uwsgi

创建uwsgi配置文件uwsgi.ini

1
2
vim /home/django_env/bin/uwsgi.ini

basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[uwsgi]

# Django-related settings
# the base directory (full path)
# 项目第一层绝对路径
chdir = /home/mywebsite
# Django's wsgi file
# 项目第二层相对路径
module = mywebsite.wsgi
# the virtualenv (full path)
# 指定虚拟环境位置,写虚拟环境第一层绝对路径
home = /home/django_env/
# process-related settings
# 主进程
master = true
# maximum number of worker processes
# 代表uwsgi运行的多进程数量,官方建议 2*CPU核数+1
processes = 3
# the socket (use the full path to be safe
# 通过什么访问,后边用nginx,打开socket注释
# socket = 0.0.0.0:8000
http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
# 服务停止时,自动清除pid之类的
vacuum = true

通过uwsgi启动项目

1
2
uwsgi --ini /home/django_env/bin/uwsgi.ini

浏览器能够正常访问

success

四、supervisor安装

是一个py开发进程管理工具

作用:可以用它去启动uwsgi,当uwsgi挂掉了,supervisor帮助自动重启,还可以很方便地管理uwsgi进程

  1. 安装

    1
    2
    3
    yum -y install python-setuptools
    pip3 install supervisor

  2. 生成配置文件

    1
    2
    echo_supervisord_conf > /etc/supervisord.conf

  3. 修改生成的配置文件

    1
    2
    vim /etc/supervisord.conf

    文件最后追加如下内容

    basic
    1
    2
    3
    4
    5
    6
    7
    8
    [program:mywebsite]
    command= /home/django_env/bin/uwsgi --ini /home/django_env/bin/uwsgi.ini;
    autostart=true ;
    startsecs=10 ;
    autorestart=true ;
    stopasgroup=true ;
    killasgroup=true ;

    supervis追加

  4. 启动supervisor,同时它会自动把uwsgi启动

    1
    2
    supervisord -c /etc/supervisord.conf

  5. 可以进入supervisor的终端控制台,进行管理来启动或停止你的项目

    1
    2
    supervisorctl -c /etc/supervisord.conf

    supervisor项目管理

五、nginx整合

  1. nginx是什么

    是一个使用c语言开发的高性能的http服务器和反向代理服务器。

  2. nginx的优点

    • 轻量级
    • 在应对高并发情况时,能保持低资源低消耗高性能
    • 高度模块化的设计,配置简洁
    • 官方测试nginx能够支撑5万并发量,并且cpu、内存等资源消耗却非常低,运行非常稳定
  3. nginx的应用场景

    • http服务器:Nginx可以独立提供http服务,可以做网页静态服务器
    • 虚拟主机:可以实现在一台服务器虚拟出多个网站
    • 反向代理,负载均衡
  4. 下载安装

    下载地址:http://nginx.org/en/download.html

    下载之前为保证不报错,做一些准备

    1
    2
    yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel wget

    使用wegt下载,版本自己定

    1
    2
    wget http://nginx.org/download/nginx-1.18.0.tar.gz

    解压nginx

    1
    2
    tar -zxvf nginx-1.18.0.tar.gz 

    解压nginx

    切换到nginx-1.18.0目录

    1
    2
    cd nginx-1.18.0

    切换到nginx目录

    执行configure,生成Makefile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ./configure \
    --prefix=/usr/local/nginx \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi

    编译安装

    1
    2
    make && make install

    创建软链接

    1
    2
    3
    4
    5
    ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
    mkdir -p /var/temp/nginx/
    nginx
    ps aux | grep nginx

    nginx启动

    验证是否成功,nginx默认80端口

    nginx_success

  5. 修改nginx配置

    1
    2
    vim /usr/local/nginx/conf/nginx.conf

    1
    2
    3
    4
    5
    6
    7
    location / {
    # root html;
    # index index.html index.htm;
    uwsgi_pass 0.0.0.0:8000;
    include uwsgi_params;
    }

    nginx_server

    启动后,若修改配置,需要刷新,不需要重启nginx

    1
    2
    nginx -s reload

    此时nginx报error

    nginx_error

  6. 修改uwsgi配置

    不能让用户直接访问项目,要通过nginx跳转过去,利用nginx做反向代理

    1
    2
    vim /home/django_env/bin/uwsgi.ini

    1
    2
    3
    4
    # 通过什么访问,用nginx访问时,打开socket注释
    socket = 0.0.0.0:8000
    # http = 0.0.0.0:8000

    uwsgi_change

    进入supervisor控制台,重新启动项目

    1
    2
    3
    supervisorctl -c /etc/supervisord.conf
    restart mywebsite

    重启项目

    查看项目运行状态,可以看出使用80端口访问到了项目,说明nginx做了反向代理

打完收工补充:关机下次启动是可能会报

1
2
nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)

1
2
3
4
5
6
7
8
9
mkdir -p /var/run/nginx/
touch /var/run/nginx/nginx.pid

# 启动nginx
nginx
# 在虚拟环境里启动项目
. /home/django_env/bin/activate
supervisord -c /etc/supervisord.conf

都看到这里了,不赏点银子吗^v^