使用容器,OpenResty服务部署Django项目到Linux服务器上

今時 ナツサ

前言

最近闲来无事,想到之前笔者重装系统导致丢失了大量数据和自己珍藏的一些应用,于是突发奇想要部署一个自己的小工具箱到服务器上
这样不就可以不用担心自己的珍藏丢失了吗?说干就干,于是笔者很快的用 Django 创建了一个自己的工具箱项目
(PS:不过说到底,还是做好本地备份比较重要,大家不要过度相信服务器的作用,数据在手里最靠谱;笔者是因为没办法,制作了一份数据备份,手头也没有其他的存储介质,再加上误操作才导致笔者的数据不幸丧生)
闲话少说,笔者的环境是 OpenResty 在容器内,同时笔者的服务器也安装了 1Panel 面板,所以这大概算是踩得坑比较多的一回,平时大家有问题可以问 ChatGPT ,这种文档少的其实很难找…

开始部署

上传 Django 项目到服务器上前,一定要创建一个 requirements.txt 便于后续下载必要的依赖

1
pip freeze > requirements.txt

在目录创建 Django 文件夹,然后上传到该文件夹

1
2
mkdir Django
cd Django

容器创建

进入自己的项目,在 manage.py 同级路径创建 Dockerfile 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 这里是选择了python官方镜像3.12-slim版本,相对于3.12更加轻便
FROM python:3.12-slim

# 设置环境变量,优化运行环境
ENV PYTHONDONTWRITEBYTECODE 1 # 不生成.pyc文件,减少内存占用
ENV PYTHONUNBUFFERED 1 # 实时显示python输出,不经过缓冲

# 设置容器内 Django 的工作目录
WORKDIR /app

# 下载容器需要的依赖
#这里的 mysqlclient 是因为笔者使用了 mysql 服务,同时这里的坑很多,笔者装了好几次
RUN apt-get update \
&& apt-get install -y \
pkg-config \
default-libmysqlclient-dev \
build-essential \
&& rm -rf /var/lib/apt/lists/*

# 下载 Python 需要的依赖
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# 复制当前目录下所有内容到容器的工作目录
COPY . /app/

# 迁移和收集 Django 需要的静态文件
RUN python manage.py migrate
RUN python manage.py collectstatic --noinput

# 暴露端口和指定容器启动时的命令
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "toolsite.wsgi:application"]

请注意,一定要在确保创建了 requirements.txt ,不然会报错

之后同级目录下创建 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
web:
build: .
command: gunicorn toolsite.wsgi:application --bind 0.0.0.0:8000
volumes:
- .:/app
# 注意这里是重中之重,不创建的话你就需要自己手动迁移静态/动态文件到 OpenResty 的存放路径进行内容的更新
- /opt/1panel/apps/openresty/openresty/www/sites/your.domain.site/index/mediafiles:/app/mediafiles
- /opt/1panel/apps/openresty/openresty/www/sites/your.domain.site/index/staticfiles:/app/staticfiles
# - 添加更多你的路径映射,格式是主机目录:容器内目录
# 主机端口映射
ports:
- "8000:8000"

由于笔者的工具箱是需要后台更新内容的,相信各位选择 Django 肯定也不只是单纯使用静态文件来部署网页,所以笔者们可以提前配置好需要的映射路径

在安装时最好加上一个 .dockerignore 文件来避免引入不必要的文件,比如本地创建的 .pyc 文件等,大家按需要来更改内容,避免不必要的文件丢失

1
2
3
4
5
6
7
8
9
10
__pycache__
.dockerignore
Dockerfile
docker-compose.yml
*.pyc
*.pyo
*.pyd
.Python
env/
venv/

那么到这里就可以开始尝试构建镜像并启动容器了

1
docker-compose up --build

Django 配置修改

在您的 Django 项目中的 settings.py 中,您还应当配置好以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 关闭 debug
DEBUG = False

# 添加允许的 IP 和域名(注意这里填的是您服务器的 IP 和域名
ALLOWED_HOSTS = ['your.server.ip','your.domain.site']

# 修改默认语言和时区
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

# 设置静态文件和媒体文件的URL和相对存储地址,为容器内的地址,与之前的映射对应
STATIC_URL = '/static/'
STATIC_ROOT = '/app/staticfiles/'

MEDIA_URL = '/media/'
MEDIA_ROOT = '/app/mediafiles/'

# 设置 CSRF 信任的站点域名,确保您可以在登录 admin 界面
CSRF_TRUSTED_ORIGINS = ['https://your.domain.site']

注意,您要是使用了数据库服务记得对 settings.py 目录进行更改

1
2
3
4
5
6
7
8
9
10
11
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
# 从这里开始,要仔细检查要改的部分
'NAME': 'mydatabase',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'db',
'PORT': '5432',
}
}

OpenResty 部分

首先您应当在反向代理中创建好您的域名反代理,然后点击您的网站进入配置界面,然后修改您网站的配置文件,在其中添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Static files
location /static/ {
alias /www/sites/your.domain.site/index/staticfiles/;
}

# Media files
location /media/ {
alias /www/sites/your.domain.site/index/mediafiles/;
}

# Proxy settings
location / {
proxy_pass http://容器 IP :8000; # Django容器的IP和端口
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

当这一切都完成了之后,笔者想您也许可以试着访问您的网站了,相信静态文件会成功的显示在您的页面上

后记

怎么说呢,写这个东西看起来轻松,实际上折腾了笔者一天多的时间,大部分时间花在了踩坑上面,希望看到这篇文章的人可以少走一些类似的弯路

  • 标题: 使用容器,OpenResty服务部署Django项目到Linux服务器上
  • 作者: 今時 ナツサ
  • 创建于 : 2024-08-15 01:33:58
  • 更新于 : 2024-08-18 19:52:29
  • 链接: https://imadokinatsusa.github.io/使用容器、OpenResty服务部署Django项目到linux服务器上/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
使用容器,OpenResty服务部署Django项目到Linux服务器上