欢迎访问的小伙伴! 希望在这里能帮到你。有问题请多多指教~ 点击联系站长

Docker部署django+uwsgi+nginx完整步骤

Django 焦康阳 1评论

你好,我是小焦。好久没发布文章了,最近也是一直搞小程序。昨天刚尝试用docker部署了小程序的后台。今天也是把部署的过程分享一下吧,当然这里是我测试环境下的教程,方法还是一模一样的。因环境不同修改一下就行了。废话不说,上教程。

1.提前下载好自己需要的python版本镜像,这是我写代码时用的python版本,大家更具自己的决定哦

docker pull python:3.8.10

2.提前导出自己的python所需安装包,自己在开发机器上导出txt文件。

pip freeze > requirements.txt

3.在服务器端创建自己的项目目录结构,这里以小焦本次部署为例。在服务器下面创建weitao目录,然后将开发机器上面的requirements.txt文件传到该目录下面.

项目文件目录如下结构
/weitao # 服务器下面主目录,下面皆是其子文件
  - /weitao  # django所在目录文件夹
     - uwsgi.ini # 该文件我们放到weitao目录下,
  - docker-compose.yml # 容器编排文件
  - Dockerfile # django镜像制作文件
  - nginx.conf # nginx配置文件
  - requirements.txt  # python依赖包文件
  - uwsgi.ini # 该文件我们放到weitao目录下,这里只是列举

4.编写Dockerfile文件,制作django容器镜像,在文件中写入如下配置,配置根据个人情况,这里以我本人为例。最后那个安装依赖包我们使用清华源,之前使用阿里源个别包安装不上报错哦。

# 建立python3.8环境
FROM python:3.8.10

# 作者
MAINTAINER JIAOKANGYANG

# 在容器内创建weitao文件夹
RUN mkdir -p /var/www/html/weitao

# 复制当前目录python包文件到容器中
COPY ./requirements.txt /var/www/html/weitao

# 设置容器内工作目录
WORKDIR /var/www/html/weitao

# 安装依赖包
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

5.制作docker镜像,名字根据自己情况写,这里我以weitao_django为名,标签为v3,由于我们dockerfile文件里面有复制操作,所以后面要加上”.”  表示当前目录,该命令要在dockerfile所在目录执行哦。

docker build -t weitao_django:v3 .

6.docker镜像制作已经完成了,这里我们进行docker-compose.yml编排文件以及nginx的配置文件,nginx镜像自己下载.在项目目录下创建docker-compose.yml名字的文件,加入下面内容。由于nginx要做静态文件的代理,所以要和django镜像有公用的文件,来获取项目下的静态文件。配置如下

version: '3'
services:
  weitao:
    image: weitao_django:v3
    volumes:
     - /weitao/weitao:/var/www/html/weitao
    ports:
     - 8080:8080
    command: /bin/bash -c "uwsgi --ini uwsgi.ini"

  nginx:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - /weitao/nginx.conf:/etc/nginx/nginx.conf
      - /weitao/weitao:/urs/share/nginx/html/weitao

7.由于容器中连vi命令都没,所以我们nginx.conf配置在外面编写,挂载到容器中就行。由于我们还没进行https,暂时以下面配置为例,主要部分是添加upstream和server部分。配置如下。


user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

   # include /etc/nginx/conf.d/*.conf;

  # ip写自己服务器上面的,端口是django中uwsgi中相同,根据自己情况
    upstream django {
      server 192.168.31.110:8080; 
  }
  
    server {
        listen 80;
        server_name localhost;
        location / {
            uwsgi_pass django;
            include uwsgi_params;
        }
        # 静态文件反向代理,路径以上面编排文件中nginx挂载的相同,后面多加了静态文件的收集路径
        location /static {
            alias /urs/share/nginx/html/weitao/weitao_static;
        }

    }


}

8.uwsgi.ini文件配置如下,该文件是放到django项目文件中的。容器启动后执行uwsgi命令所需要的。记住这里socket后面ip千万不要写127.0.0.1,不然nginx访问不到。主要是容器的原因,如果正常服务器写127没问题。

[uwsgi]
socket = 0.0.0.0:8080
chdir = /var/www/html/weitao/
wsgi-file = weitaoapp/wsgi.py
processes = 1
threads = 4
master = true

9.经过上面我们需要的东西以及全部搞完,现在只需将我们的项目文件上传到weitao下面的子文件夹weitao中,名字由自己定,到时记得改相应的配置文件就行。所有东西准备完毕,就可以启动编排程序了.用第一个启动命令就行了


# 进入到服务器weitao目录下执行,则会创建容器并启动
docker-compose up

# 停止项目容器
docker-compose stop

# 启动项目容器
docker-compose start

# 停止并删除项目所有容器,一般除非不要该项目才执行此操作
docker-compose down

10.经过上面的部署没有意外的话,已经可以完全正常运行项目了,但是还有几个小细节。静态文件代理,如果我们上传项目文件前没有进行static文件收集,则会导致nginx找不到文件。

提前要在项目下setting文件中设置好STATIC_ROOT的路径,而且该路径必须和django容器中的路径一致,实际真实路径就是weitao项目下的weitao_static文件夹而已。自己根据自己情况命名即可。


STATIC_ROOT = "/var/www/html/weitao/weitao_static"

两种处理方法:

方法一:
 上传项目文件到服务器前进行静态文件收集,提前要在setting文件中设置好STATIC_ROOT的路径
 python manage.py collectstatic
 
方法二:
 如果项目上传前没有收集,那就进入到容器中进行收集了,命令一样

通过上面的步骤,如果没有出现任何意外的话,我们在80端口就可以正常访问django项目了。

    当然实际情况要根据自身项目部署,不要照抄教程中的配置。就拿uwsgi的配置文件上面的socket的端口,网上的教程全是127开头的IP,结果全部502报错,最后小焦查看了nginx的日志才发现它不会自动转换IP,所以要自己调整哦,有啥不懂问题及时私信我哦。

喜欢 (2)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 够详细,谢谢博主
    苏苏2022-07-30 11:29 (5小时前)回复