DjangoBlog 部署记录


目录:

前言

本网站就是用 DjangoBlog 部署的,在这里简单记录一下部署过程及碰到的一些坑。

搭建环境

系统环境

服务器:腾讯云 SA2.MEDIUM8

系统:TencentOS Server 3.1 (CentOS 8.x)

mysql 环境

务必先准备好 mysql 环境,否则将无法正确安装 python 依赖

yum 安装 mariadb

yum install mariadb-server mariadb-devel

启动 mariadb 服务

systemctl enable mariadb
systemctl start mariadb

nginx 环境

yum 安装 nginx

yum install nginx

启动 nginx 服务

systemctl enable nginx
systemctl start nginx

python 环境

yum 安装 python38

yum install python38 python38-devel python38-pip

下载 DjangoBlog Release 包并解压

mkdir /var/DjangoBlog/
cd /var/DjangoBlog/

curl "https://codeload.github.com/liangliangyy/DjangoBlog/tar.gz/refs/tags/1.0.0.4" -o DjangoBlog-1.0.0.4.tar.gz
tar -xvf DjangoBlog-1.0.0.4.tar.gz

virtualenv 创建并激活虚拟环境

python3.8 -m virtualenv venv
source venv/bin/activate

pip 安装依赖

pip install -r DjangoBlog-1.0.0.4/requirements.txt

修改配置

配置 djangoblog

修改 settings.py

部分属性可以从环境变量读取,但为保证安全,仍然选择直接修改代码

cd DjangoBlog-1.0.0.4
vim djangoblog/settings.py
SECRET_KEY = 'XXXXXXXXXXXX'  # 务必重新生成一个
DEBUG = False  # 关闭 DEBUG 模式,否则用户访问网页报错时会显示堆栈信息
USE_TZ = False  # 通常需要关闭

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangoblog',
        'USER': 'djangoblog',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'OPTIONS': {
            'charset': 'utf8mb4'
        }
    }
}

配置数据库

进入 mysql 创建数据库和和账号密码

mysql
create user `djangoblog`@`127.0.0.1` identified by 'password';
CREATE DATABASE `djangoblog` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
grant all on `djangoblog`.`*` to `djangoblog`@`127.0.0.1`;

使用 manage.py 生成数据库表及测试数据

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py create_testdata

配置 djangoblog 服务

创建 djangoblog.env,上面的部分参数可以通过环境变量配置。

vim djangoblog.env
DJANGO_DEBUG=False

DJANGO_SECRET_KEY=XXXXXXXXXXXX

DJANGO_MYSQL_USER=djangoblog
DJANGO_MYSQL_PASSWORD=password

PYTHONPATH=/var/DjangoBlog/DjangoBlog-1.0.0.4

创建 djangoblog.service

vim djangoblog.service
[Unit]
Description=DjangoBlog
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/DjangoBlog/DjangoBlog-1.0.0.4/
EnvironmentFile=/var/DjangoBlog/DjangoBlog-1.0.0.4/djangoblog.env
ExecStart=/var/DjangoBlog/venv/bin/python /var/DjangoBlog/DjangoBlog-1.0.0.4/manage.py runserver 127.0.0.1:8080
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target

启动 djangoblog 服务

systemctl link /var/DjangoBlog/DjangoBlog-1.0.0.4/djangoblog.service
systemctl enable djangoblog.service
systemctl start djangoblog.service

配置 nginx

收集静态文件

python manage.py collectstatic --noinput
python manage.py compress --force

编写 server.conf

vim /etc/nginx/conf.d/server.conf
server {
    listen 80;
    server_name example.com 127.0.0.1 XX.XX.XX.XX;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static/ {
        alias /var/DjangoBlog/DjangoBlog-1.0.0.4/collectedstatic/;
    }
}

重启 nginx 服务

nginx -s reload

测试访问

使用 curl 访问

curl "http://127.0.0.1/"

或使用浏览器访问 http://example.com/ (已备案) http://XX.XX.XX.XX/ (未备案)

其他优化

djangoblog 权限

为了约束 djangoblog 的读写权限,防止因为意外的 BUG 导致其他文件被读写,建议采用单独用户启动服务。

创建用户

useradd djangoblog

修改文件夹所有人

chown djangoblog:djangoblog /var/DjangoBlog/DjangoBlog-1.0.0.4/ -R

修改 djangoblog.service

vim djangoblog.service
...
[Service]
User=djangoblog
...

更好的管理日志

默认日志存放在 /var/DjangoBlog/DjangoBlog-1.0.0.4/djangoblog.log,不方便管理,可以迁移到 /var/log/djangoblog/ 下。

mkdir /var/log/djangoblog/
chown djangoblog:djangoblog /var/log/djangoblog/
vim djangoblog/settings.py
LOGGING = {
    ...
    'handlers': {
        'log_file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/var/log/djangoblog/djangoblog.log',
            'maxBytes': 16777216,  # 16 MB
            'formatter': 'verbose'
        }
    }
    ...
}

使用 simpleui 优化 admin 后台的样式

默认的 admin 后台非常丑,simpleui 相对来说好看好看一些,并且使用也很方便。

pip install django-simpleui
vim djangoblog/settings.py
INSTALLED_APPS = [
    'simpleui',
    ...
]

配置邮箱

djangoblog 在新用户注册的时候是需要发送一封激活邮件的,因此如果想要开放注册功能那就必须配置站长邮箱。

vim djangoblog.env
DJANGO_EMAIL_SSL=True
DJANGO_EMAIL_HOST=smtp.example.com
DJANGO_EMAIL_PORT=465
DJANGO_EMAIL_USER=example@example.com
DJANGO_EMAIL_PASSWORD=example

另外,如果要接收告警邮件,还需要配置管理员邮箱。

DJANGO_ADMIN_EMAIL=example@example.com

结语

djangoblog 适合有一定基础并且之后准备做一些二次开发的 python 程序猿建站,毕竟部署起来挺麻烦的,坑也不少。 对于大众来说,还是推荐更加成熟美观的 WordPress,各大云厂商都有现成的镜像可以拿来用,