ithuang
ithuang
发布于 2025-06-08 / 4 阅读
0

DjangoBlog部署教程

DjangoBlog部署教程

本篇文章将会手把手教你如何部署DjangoBlog项目,首先介绍下我这里的基本环境,请大家仔细阅读此部分,下面的教程都会使用这些约定来介绍:

  • 系统是 CentOS Stream 9
  • 假设你的域名是www.djangoblog.com。
  • python虚拟环境目录在 ~/python/env
  • djangoblog源码位置在 ~/python/djangoblog
  • 登入用户server
  • 编辑器使用vim,你可以使用你喜欢的编辑器。

另外请注意,尽量不要使用root用户来部署,如果要使用root用户的话,需要使collectedstatic目录所有用户都有读权限。

准备工作

升级系统

首先需要升级系统到最新版,终端下执行:

dnf update
dnf upgrade -y

待完成更新之后,建议重新启动下系统,再进行后面的操作。终端下执行:

reboot

待系统启动后,可以开始安装依赖的mysql以及python环境了。

安装依赖

终端下执行:

dnf install mysql-server -y #安装mysql
dnf install -y python3-devel python3-pip memcached #安装pip和memcached
pip3 install virtualenv
dnf install -y supervisor nginx
install -y dnf-plugins-core
dnf config-manager --set-enabled crb
dnf install -y python3-devel mariadb-devel #安装mysqlclient依赖

接下来需要设置python的虚拟环境,终端下执行:

cd ~
mkdir -p  python/env && cd python/env
virtualenv -p /usr/bin/python3 djangoblog
source djangoblog/bin/activate

在执行完上述命令之后,你的终端应该看起来是类似于下面的样子:img更多关于python的虚拟环境介绍请参考Python虚拟环境设置 这篇文章。

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

source ~/python/env/djangoblog/bin/activate
cd ~/python/DjangoBlog
pip install -Ur requirements.txt
# 环境退出
deactivate

基本配置及部署

配置mysql数据库

终端下执行:

mysql_secure_installation

类似下图,需要输入的地方我都用红色箭头标注了出来,需要注意,root密码一定要牢记,后面会用到。

img使用root用户登录:

mysql -uroot -p

如果无法登录,可以使用如下步骤,请注意,我这里的密码只是示例,请修改成你自己的密码.:

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Q1W2E3R4T5#$%qwe';
FLUSH PRIVILEGES;
exit

如果提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,则说明你的密码强度不够,需要提供更复杂的密码,如下所示:img修改mysql默认字符集,使用你喜欢的编辑器,如vim或者nano,打开/etc/mysql/conf.d/mysql.cnf,配置文件,注意,需要使用root权限,如vim:

sudo vim /etc/mysql/conf.d/mysql.cnf

删除该文件的[mysql]行并贴入如下内容:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

退出并保存,重启mysql服务,终端下执行:

sudo /etc/init.d/mysql restart

接下来就可以登录mysql数据库并创建用户和数据了,终端下执行:

mysql -uroot -p #进入mysql终端
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/settings.py中的DATABASES配置,如下所示,当然,你也可以将其中的配置写入你的.bashrc中,这样就不需要改这个文件了,我这里只是介绍下如何修改:

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

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

再/root/python/DjangoBlog中执行
source /root/python/env/djangoblog/bin/activate
pip install -r requirements.txt
# 如果报错
# 用 vi 或 nano 编辑 requirements.txt
vi requirements.txt
# 把 Django==5.2.9 这一行改成 Django>=5.2.8,<5.3
# 然后重新执行安装
pip install -r requirements.txt

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

如遇报错
# 找到配置文件
vim djangoblog/settings.py
# 找到
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
# 替换为
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

再次执行
./manage.py collectstatic --no-input

./manage.py compress --force

下面可以尝试启动网站,终端下执行:

./manage.py runserver

# 若是外网访问执行
python manage.py runserver 0.0.0.0:8000

看到如下所示,则说明启动成功了:img接下来你就可以使用浏览器打开http://127.0.0.1:8000/ 来查看了。你需要访问http://127.0.0.1:8000/admin/ 在站点中,将默认的example.com修改成你自己的,如www.djangoblog.com。

gunicorn 配置

安装,终端下执行:

source ~/python/env/djangoblog/bin/activate
pip install gunicorn

配置,终端下执行:

vim ~/python/gunicorn_start.sh

贴入如下内容:

#!/bin/bash

NAME="djangoblog"
DJANGODIR=/root/python/DjangoBlog #Django project directory
USER=root # the user to run as
GROUP=root # 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 /root/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 /root/python/env/djangoblog/bin/gunicorn  ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--log-level=debug \
--log-file=-

注意,将该文件中的server修改成你自己的用户,如果是root用户的话,也要将/home/server修改为/root。同时,将djangoblog/settings.py中的DEBUG = True修改为DEBUG = False。 增加可执行权限:

chmod +x ~/python/gunicorn_start.sh

执行:

cd ..
./gunicorn_start.sh

如果看到类似下面的输出,则说明成功了。img然后使用Ctrl+c来终止。

nginx配置

终端下执行:

# 创建 Nginx 配置文件
vi /etc/nginx/conf.d/djangoblog.conf

贴入如下内容:

upstream djangoblog_app {
    # Gunicorn 监听的地址
    server 127.0.0.1:8000 fail_timeout=0;
}

server {
    listen 80;
    server_name 你的域名或服务器IP;  # 改成你的域名或公网IP

    # 日志文件
    access_log /var/log/nginx/djangoblog_access.log;
    error_log /var/log/nginx/djangoblog_error.log;

    # 静态文件直接由 Nginx 处理
    location /static/ {
        alias /root/python/DjangoBlog/collectedstatic/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 用户上传的媒体文件
    location /media/ {
        alias /root/python/DjangoBlog/uploads/;
        expires 30d;
    }

    # 其他所有请求转发给 Gunicorn
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://djangoblog_app;
    }

    # 文件上传大小限制(根据需要调整)
    client_max_body_size 100M;
}

创建媒体文件目录

mkdir -p /root/python/DjangoBlog/uploads

检查并启动 Nginx:

# 测试配置文件是否正确
nginx -t

# 如果测试通过,启动 Nginx
systemctl start nginx
systemctl enable nginx  # 开机自启

# 如果之前已经启动过,重新加载配置
nginx -s reload

修改 Django 设置

vi /root/python/DjangoBlog/djangoblog/settings.py

# 关闭 DEBUG 模式
DEBUG = False

# 允许你的域名或IP访问
ALLOWED_HOSTS = ['你的域名', '你的公网IP', 'localhost', '127.0.0.1']

# 静态文件根目录
STATIC_ROOT = '/root/python/DjangoBlog/collectedstatic/'
STATIC_URL = '/static/'

# 媒体文件配置
MEDIA_ROOT = '/root/python/DjangoBlog/uploads/'
MEDIA_URL = '/media/'

给nginx授权,只给 nginx 用户访问项目目录的权限,不影响其他文件

setfacl -R -m u:nginx:rx /root/python/DjangoBlog
setfacl -R -m u:nginx:rx /root/python

# 确保 nginx 能进入 /root 目录
setfacl -m u:nginx:rx /root

# 重载 Nginx
nginx -s reload

重启 Gunicorn 使设置生效

cd /root/python/DjangoBlog
gunicorn djangoblog.wsgi:application --bind 127.0.0.1:8000 --daemon

配置Supervisor

终端下执行:

vi /etc/supervisord.d/djangoblog.ini

贴入如下内容:

[program:djangoblog]
command=/root/python/env/djangoblog/bin/gunicorn djangoblog.wsgi:application --bind 127.0.0.1:8000 --workers 3
directory=/root/python/DjangoBlog
user=root
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/djangoblog.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stderr_logfile=/var/log/djangoblog_error.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8

先停掉当前手动启动的 Gunicorn

pkill -f "gunicorn.*djangoblog"

启动 Supervisor 并管理 Gunicorn

# 启动 Supervisor 服务
systemctl start supervisord
systemctl enable supervisord

# 加载新的配置文件
supervisorctl reread
supervisorctl update

# 启动 djangoblog
supervisorctl start djangoblog

# 查看状态
supervisorctl status djangoblog

现在你的博客部署已经完成

服务架构总结:

  1. Supervisor → 管理 Gunicorn 进程(自动启动、自动重启)
  2. Gunicorn → WSGI 服务器(监听 127.0.0.1:8000)
  3. Nginx → 反向代理 + 静态文件服务(监听 80 端口)

后续常用命令

source ~/python/env/djangoblog/bin/activate
# 重启博客(修改代码后)
sudo supervisorctl restart djangoblog

# 查看博客状态
sudo supervisorctl status djangoblog

# 查看 Gunicorn 日志
sudo supervisorctl tail -f djangoblog

# 重启 Nginx(修改 Nginx 配置后)
sudo systemctl restart nginx

django安全配置

必须修改的安全配置

1. SECRET_KEY 保护

vi /root/python/DjangoBlog/djangoblog/settings.py

检查:SECRET_KEY 是否硬编码在 settings.py 里?如果是,建议移到环境变量:

# 在 settings.py 中
import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'fallback-key-for-dev')

然后在 Supervisor 配置中添加环境变量:

sudo vi /etc/supervisord.d/djangoblog.ini

在 enviroment 行添加:

environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8,DJANGO_SECRET_KEY="你的密钥"

2. ALLOWED_HOSTS

ALLOWED_HOSTS = ['你的域名', '你的公网IP']
# 不要用 ['*'],有安全隐患

3. DEBUG 模式

DEBUG = False  # 生产环境必须关闭

推荐的优化配置

4. 数据库连接池

pip install django-db-connection-pool

在 settings.py 中:

DATABASES = {
    'default': {
        'ENGINE': 'dj_db_conn_pool.backends.mysql',
        'NAME': 'djangoblog',
        'USER': 'root',
        'PASSWORD': '你的密码',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'POOL_OPTIONS': {
            'POOL_SIZE': 10,
            'MAX_OVERFLOW': 20,
            'RECYCLE': 3600,
        }
    }
}

5. 安全中间件

在 MIDDLEWARE 中添加:

MIDDLEWARE = [
    # ... 其他中间件
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'csp.middleware.CSPMiddleware',  # 需要 pip install django-csp
]

6. HTTPS 和安全头

# 如果你配置了 SSL 证书
SECURE_SSL_REDIRECT = True  # HTTP 自动跳转 HTTPS
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'

7. 缓存配置(提升性能)

pip install django-redis
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

8. 日志配置

在 settings.py 末尾添加:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'WARNING',
            'class': 'logging.FileHandler',
            'filename': '/var/log/django/djangoblog.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'WARNING',
            'propagate': True,
        },
    },
}

重启生效

# 创建日志目录
sudo mkdir -p /var/log/django

# 重启服务
sudo supervisorctl restart djangoblog

至此,全部完成。你可以通过你的浏览器访问http://www.djangoblog.com了。 更多配置相关可以参考: https://github.com/liangliangyy/djangoblog/blob/master/docs/config.md