前言
本网站就是用 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,各大云厂商都有现成的镜像可以拿来用,