django-idcops 部署线上生成环境

django-idcops是一个完完全全的django应用,所以,使用django官方的部署教程也是可以的。django官网好像提供了多种部署方式,其中有:

  • Gunicorn 托管 Django (一个纯python的应用容器服务器)
  • uWSGI 托管 Django (uWSGI 是一个快速的,自我驱动的,对开发者和系统管理员友好的应用容器服务器,完全由 C 编写)

上面两个托管方式各有优缺点,Gunicorn安装和使用都简单,uWSGI性能优越,可以根据具体情况来选择,我这边选uwsgi来部署。

本例中在CentOS 7.x 中部署django-idcops需要的系统组件:

  • Nginx: 是一款轻量级的Web服务器、反向代理服务器
  • MySQL: 关系型数据库
  • Python3:Python 是一种跨平台的计算机程序设计语言
  • uWSGI:uWSGI 是一个快速的,自我驱动的,对开发者和系统管理员友好的应用容器服务器

项目目录在 /data/django-idcops,以下大部分操作都在该目录或该目录的子目录下执行。代码块中:

  • `$` 表示指令
  • `#` 表示注释
  • 什么都没有表示配置文件的内容(注意缩进)


1、安装Nginx、MySQL、Python3.x

# 编译或者直接从仓库获取都可以,请自行安装,本例采用Python3.6.8

2、获取 django-idcops 源代码

$ [ ! -d /data ] && mkdir -p /data # 没有/data 目录就新建
$ cd /data
$ git clone https://gitee.com/wenvki/django-idcops.git
$ cd django-idcops
$ PROJ_DIR=/data/django-idcops


3、给项目目录分配权限

$ cd $PROJ_DIR
$ chown nginx.nginx . -R /data/django-idcops
# 这里我统一用nginx这个用户,安装nginx的时候可以新建这个用户,centos yum install nginx 默认会创建这个用户


4、创建并激活 py3 虚拟环境

$ cd $PROJ_DIR # 项目目录为 /data/django-idcops
$ python3 -m venv env # 创建python3 虚拟环境,本例为 python 3.6.8
$ source env/bin/activate # 激活python3 虚拟环境

5、安装 requirements.txt 中的依赖

$ cd $PROJ_DIR
$ python -m pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
# -i 参数表示采用阿里云pypi镜像站的pypi包源
$ python -m pip install -r requirements-prod.txt -i https://mirrors.aliyun.com/pypi/simple
# Linux下安装uwsgi,Windows下请各位自行从搜索引擎解决(不建议生产环境部署到Windows系统)
# 要在激活python3 虚拟环境的情况下执行, 如果遇到报错一般是依赖包没装全, 可以QQ群:185964462里面咨询


6、修改配置文件

$ cd $PROJ_DIR
$ vim /data/django-idcops/idcops_proj/settings.py 
# 按照安装的MySQL相关账户信息修改 DATABASES 配置 (python代码,注意配置文件有缩进要求):

import pymysql
pymysql.install_as_MySQLdb()

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'charset': 'utf8mb4'
        },
        'NAME': 'db_name', # django_idcops 替换成你的数据库名称
        'USER': 'db_user', # idcops_db_user 替换成你的数据库连接用户名
        'PASSWORD': 'db_pass', # idcops_db_password 数据库用户名密码
        'HOST': '',
    }
}
$ CREATE DATABASE IF NOT EXISTS django_idcops default charset utf8mb4 COLLATE utf8mb4_general_ci;
# 上面语句在msyql命令行里面执行sql创建一个`django_idcops`的数据库
# 修改后的配置如下图,注意代码有缩进:


7、测试数据库连接

$ cd $PROJ_DIR
$ source /data/django-idcops/env/bin/activate
$ python manage.py dbshell
# 如果可以进入数据库表示数据库连接没有问题,如下图:


8、迁移数据库

$ cd $PROJ_DIR
$ source /data/django-idcops/env/bin/activate
$ python manage.py migrate


9、迁移静态文件和新建 media 目录

$ cd $PROJ_DIR
$ source /data/django-idcops/env/bin/activate
$ python manage.py collectstatic --noinput # --noinput 表示无须回车确认
$ mkdir /data/django-idcops/media
$ chown nginx.nginx -R /data/django-idcops/media
# 需要分配权限,否则用户无法上传图片或文件



10、创建超级用户

$ cd $PROJ_DIR
$ source /data/django-idcops/env/bin/activate
$ python manage.py createsuperuser
# 见下图:


11、配置uwsgi 并启动uwsgi

$ cd $PROJ_DIR
$ source /data/django-idcops/env/bin/activate
$ cd config
$ cp uwsgi.ini.example uwsgi.ini
$ cat uwsgi.ini
[uwsgi]
PROJ_DIR = /data/django-idcops # 根据项目位置修改
vacuum = true
py-autoreload = 3
master = true
virtualenv = %(PROJ_DIR)/env
env = LANG=en_US.UTF-8
env DJANGO_SETTINGS_MODULE=idcops_proj.settings 
chdir = %(PROJ_DIR)
wsgi-file = %(PROJ_DIR)/idcops_proj/wsgi.py
touch-reload = %(PROJ_DIR)/requirements.txt
pidfile = %(PROJ_DIR)/run/uwsgi.pid
socket = %(PROJ_DIR)/run/uwsgi.sock
daemonize = %(PROJ_DIR)/logs/uwsgi.log
chmod-socket = 664
max-requests = 4096
processes = 5
die-on-term = true
uid = nginx # 这里是以nginx这个用户启动uwsgi
gid = nginx # uwsgi属组
thunder-lock = true
stats = 127.0.0.1:8090
emperor-tyrant = true
cap = setgid,setuid
$ #启动uwsgi
$ whereis uwsgi # 找到当前项目安装的uwsgi在哪里
$ /data/django-idcops/env/bin/uwsgi --ini /data/django-idcops/config/uwsgi.ini
# 上面是完整的路径启动uwsgi,整个流程见下面图片:



12、配置nginx虚拟主机

# idcops_nginx.conf
server {
    listen 80;
    server_name django-idcops.iloxp.com;
    root /data/django-idcops/;

    # include idcops_ssl.conf;

    location / {
      include uwsgi_params;
      uwsgi_pass unix:///data/django-idcops/run/uwsgi.sock;
    }

    location /static {
      alias /data/django-idcops/static;
      expires      7h;
      access_log off;
    }
        
    location /media {
      alias /data/django-idcops/media;
      expires      7h;
      access_log off;
    }

    access_log /data/django-idcops/logs/nginx_access.log;
    error_log /data/django-idcops/logs/nginx_error.log;
    
    location ~ /\.ht {
      deny  all;
    }

}

13、nginx ssl配置(可选配置)

# idcops_ssl.conf
    listen 443 ssl http2;
    
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }

    if ( $host != 'django-idcops.iloxp.com' ) {
        rewrite ^(.*)$ https://www.iloxp.com$1 permanent;
    }
    #HTTP_TO_HTTPS_END

    ssl_certificate /etc/nginx/cert/idcops.iloxp.com/idcops.iloxp.com_chain.crt; # managed by Certbot
    ssl_certificate_key /etc/nginx/cert/idcops.iloxp.com/idcops.iloxp.com_key.key; # managed by Certbot
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5';
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }


14、初始化项目



到此,django-idcops 部署线上生成环境便完成了。

相关阅读RelatedRead

Django利用xlrd将excel表格数据导入到model数据库中

Django个人博客教程-1:开发环境之编译安装python3.7

Django个人博客教程-1:开发环境

Django个人博客教程:开篇

本博启用灰色调 2020年4月4日举行全国性哀悼活动

Django 让用户自动登录

Django博客archives归档页面查询优化

暂无评论添加评论