使用容器,OpenResty服务部署Django项目到Linux服务器上
前言
最近闲来无事,想到之前笔者重装系统导致丢失了大量数据和自己珍藏的一些应用,于是突发奇想要部署一个自己的小工具箱到服务器上
这样不就可以不用担心自己的珍藏丢失了吗?说干就干,于是笔者很快的用 Django 创建了一个自己的工具箱项目
(PS:不过说到底,还是做好本地备份比较重要,大家不要过度相信服务器的作用,数据在手里最靠谱;笔者是因为没办法,制作了一份数据备份,手头也没有其他的存储介质,再加上误操作才导致笔者的数据不幸丧生)
闲话少说,笔者的环境是 OpenResty 在容器内,同时笔者的服务器也安装了 1Panel 面板,所以这大概算是踩得坑比较多的一回,平时大家有问题可以问 ChatGPT ,这种文档少的其实很难找…
开始部署
上传 Django 项目到服务器上前,一定要创建一个 requirements.txt 便于后续下载必要的依赖
1
| pip freeze > requirements.txt
|
在目录创建 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"; }
|
当这一切都完成了之后,笔者想您也许可以试着访问您的网站了,相信静态文件会成功的显示在您的页面上
后记
怎么说呢,写这个东西看起来轻松,实际上折腾了笔者一天多的时间,大部分时间花在了踩坑上面,希望看到这篇文章的人可以少走一些类似的弯路