本篇文章将会教你如何部署DjangoBlog项目。
请仔细阅读,并和自己的环境做对比。
{% note info %}
DjangoBlog 开源项目下载:
https://gitee.com/lylinux/DjangoBlog
{% endnote %}

环境

* 系统是Debian 10
* 本地使用:使用虚拟机,使用的IP 地址。
* python虚拟环境目录在 ~/python/env
* djangoblog源码位置在 ~/python/DjangoBlog
* 系统的用户是Server
* 编辑器使用vim,你可以使用你喜欢的编辑器。

{% note info %}
可以使用VmWare虚拟机进行实验
{% endnote %}

准备工作

升级系统

首先升级系统到最新版,以Root的账户下的终端下执行:

apt-get update
apt-get upgrade 

系统更新之后,重启下系统,终端下执行:

reboot

重启之后,可以开始安装Myslq及Python环境。

安装Mysql的准备

要将 MySQL APT 存储库添加到系统,请转到存储库下载页面并使用以下 wget 命令下载最新的发行包:
终端下执行:

wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb

下载完成后,以root 的用户执行安装发行:

apt-get insatll install ./mysql-apt-config_0.8.13-1_all.deb -y

您将看到配置菜单,您可以从中选择要安装的 MySQL 版本。
本篇使用的MySQL 8.0
要安装 MySQL 8.0 版。按 Tab 并选择 OK 最后按下 Enter。

安装MySQL

通过运行以下命令更新包列表并安装 MySQL 服务器包:

apt-get update
apt-get install mysql-server -y

安装程序将要求您设置 MySQL root 密码。记录设置的密码,后面会用的到。
安装完成后, MySQL 服务将自动启动,您可以通过键入以下内容来验证它:

systemctl status mysql

输出的结果:


● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-08-15 11:32:25 CST; 10h ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 391 ExecStartPre=/usr/share/mysql-8.0/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 447 (mysqld)
   Status: "Server is operational"
    Tasks: 39 (limit: 2934)
   Memory: 462.4M
   CGroup: /system.slice/mysql.service
           └─447 /usr/sbin/mysqld

Aug 15 11:31:58 debian10-ming systemd[1]: Starting MySQL Community Server...
Aug 15 11:32:25 debian10-ming systemd[1]: Started MySQL Community Server.

安装Django的环境

终端下运行:

apt-get install python3-dev python3-pip python-pip memcached -y
apt-get install supervisor -y
apt-get install nginx -y
apt-get install python-dev default-libmysqlclient-dev

接下来需要设置python的虚拟环境
设置Python的虚拟环境,配置如下:
安装虚拟环境

pip install virtualenvwrapper -i https://pypi.tuna.tsinghua.edu.cn/simple

{% note info %}
让PIP源使用国内镜像,提升下载速度和安装成功率
临时使用:
可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple
例如:pip install virtualenvwrapper -i https://pypi.tuna.tsinghua.edu.cn/simple
{% endnote %}

创建放虚拟环境的文件夹,终端下执行:

mkdir -p python/env && cd python/env

终端下执行

nano ~/.bashrc

安装完成后,在~/.bashrc写入以下内容

export WORKON_HOME=/home/server/python/env
source /usr/local/bin/virtualenvwrapper.sh

{% note info %}
第一行:virtualenvwrapper存放虚拟环境目录
第二行:virtrualenvwrapper会安装到python的bin目录下,所以该路径是python安装目录下bin/virtualenvwrapper.sh
{% endnote %}
读入配置文件,立即生效,终端下执行

source ~/.bashrc
virtualenv -p /usr/bin/python3 djangoblog
workon djangoblog

这样就完成了Python虚拟环境的设置。

下面开始安装djangoblog运行所需要的依赖,终端下执行:

cd ~/python/DjangoBlog
pip install -Ur requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

基本配置及部署

配置mysql数据库

使用root用户登录,这时候就是安装mysql 的时候配置的密码。终端下执行:

mysql -uroot -p
CREATE USER 'djangoblog'@'localhost' IDENTIFIED BY 'DjAnGoBlOg123!@#';
CREATE DATABASE `djangoblog` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
GRANT all ON djangoblog.* TO 'djangoblog'@'localhost';
FLUSH PRIVILEGES;
exit #退出

同样,这里的DjAnGoBlOg123!@#密码也要改成你自己的密码。

修改djangoblog配置

修改DjangoBlog/DjangoBlog/settings.py中的DATABASES配置,如下所示,当然,你也可以将其中的配置写入你的.bashrc中,这样就不需要改这个文件了,我这里只是介绍下如何修改:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangoblog',
        'USER': 'djangoblog',
        'PASSWORD': 'DjAnGoBlOg123!@#',
        'HOST': 'localhost',
        'PORT': 3306,
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

接下来开始执行数据库迁移,终端下执行:

./manage.py makemigrations
./manage.py migrate
./manage.py createsuperuser #创建超级用户
./manage.py collectstatic --no-input
./manage.py compress --force

gunicorn 配置

安装,终端下执行:

source /home/server/python/env/djangoblog/bin/activate
pip install gunicorn -i https://pypi.tuna.tsinghua.edu.cn/simple

配置,终端下执行:

nano /home/server/python/gunicorn_start.sh

贴入如下内容:

#!/bin/bash

NAME="DjangoBlog"
DJANGODIR=/home/server/python/DjangoBlog #Django project directory
USER=server # the user to run as
GROUP=server # the group to run as
NUM_WORKERS=1 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /home/server/python/env/djangoblog/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /home/server/python/env/djangoblog/bin/gunicorn  ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--log-level=debug \
--log-file=-

{% note info %}
注意,将该文件中的server修改成你自己的用户
{% endnote %}
增加可执行权限:

chmod 755 gunicorn_start.sh
./gunicorn_start.sh

nginx配置

终端下执行:

# 删除默认配置
rm /etc/nginx/sites-enabled/default
nano /etc/nginx/sites-enabled/djangoblog.com.conf

贴入如下内容:

server {

    listen 80;
    server_name 192.168.1.100;
    root /home/server/python/DjangoBlog/;

    access_log /var/log/nginx/django_access.log;
    error_log /var/log/nginx/django_error.log;

    location /static/ {
        alias /home/server/python//DjangoBlog/collectedstatic/;
        expires max;
        access_log        off;
        log_not_found     off;
    }
    location /media {
        # 静态文件配置
        alias /home/server/python/DjangoBlog/uploads/;
        expires max;
    }
    location ~ \.py$ {
        return 403;
    }

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1:8000;
            break;
        }
    }

}

{% note info %}
server_name 192.168.1.100;
这是你自己的服务器的IP地址。
{% endnote %}
保存并退出。重启nginx:

/etc/init.d/nginx restart

配置Supervisor

终端下执行:

nano /etc/supervisor/conf.d/djangoblog.conf

贴入如下内容:

[program:djangoblog]
command = /home/server/python/gunicorn_start.sh
user = server
autostart=true
autorestart=true

redirect_stderr = true
stdout_logfile = /var/log/djangoblog.log
stderr_logfile=/var/log/djangoblog.err

同样,需要将server修改成你自己等用户名. 保存成功后继续执行:

supervisorctl update
supervisorctl reload 
/etc/init.d/memcached restart && /etc/init.d/nginx restart

至此,全部完成。你可以通过你的浏览器访问你的服务器IP地址