Django+Daphne+Supervisor+Nginx web项目部署流程案例 内网环境

Django Web项目部署流程

大纲

  1. 环境说明
    1. 系统环境:Debian10
    2. 代码运行环境:Python3.8
    3. 网络服务器:Daphne(支持wsgi和asgi协议)
    4. 反向代理:Nginx
    5. 进程管理:Supervisor
    6. 项目说明:http+websocket,需要用到asgi协议
  2. 部署的流程
    1. 环境准备
    2. 代码git同步
    3. 应用服务化
  3. 特殊的说明

一.环境准备

操作系统:Debian10

  1. 系统自行安装即可

  2. 如果是在内网部署,需要更新源:

   cd etc/apt/
   vi source.list

   # 对内容进行修改,注释原url
   # deb http//deb.debian.org/debian/ buster-updates man contrib
   # deb-src http://deb,debian.org/debian/ buster-updates man contrib
   # 添加内网源url
   deb [trusted=yes] http://192.168.68.192/debian/ buster-updates main contrib
   deb-src [trusted=yes] http://192.168.68.192/debian buster-updates main contrib

   deb [trusted=yes] http://192.168.68.192/debian/ buster main contrib
   deb-src [trusted=yes] http://192.168.68.192/debian buster main contrib

   deb [trusted=yes] http://192.168.68.192/debian/ buster-backports main contrib
   # 然后保存并退出

   # 执行源检查,因为内网源可能会过期等问题,所以我们跳过源验证
   apt update -o Acquire::Check-Valid-Until=false --allow-insecure-repositories
   apt upgrade --allow-unauthenticated
  1. 检查ssh是否正常工作systemctl status sshd
   # 配置ssh,使可以root用户登录
   vi /etc/ssh/sshd_config
   
   将 #PermitRootLogin prohibit-password 更改为 PermitRootLogin yes
   将 #PasswordAuthentication yes 前面的#去掉
   
   # 然后保存文件,重启ssh即可,systemctl restart sshd

项目运行环境:Python3.8

debian10中自带了python2.7和python3.7,但是我们的项目需要运行在python3.8的环境中。此处我们使用源码包编译的方式安装python3.8

  1. 将源码包Python-3.8.10.tar上传至服务器,可使用scp命令:scp 本地路径  user@ip:/绝对路径

  2. 解压源码包:tar xvf Python-3.8.10.tar,如果是.tar.gz结尾的话就用tar zxvf Python-3.8.10.tar命令解压,最终会解压到当前目录下的Python-3.8.10目录中

  3. 准备环境

   # 确保 _ctypes
   apt install libffi-dev
   # 确保 _sqlite3
   apt install libsqlite3-dev
   # 确保 _ssl 这一步可以不先执行,出现 No module named '_ssl'再执行也可
   根据博客:my.oschina.net/u/4050197/blog/5553562 操作即可
  1. 进入Python-3.8.10.tar目录,执行./configure --prefix=/opt/python3.8 ,prefix参数用于指定python安装路径

  2. 编译安装:make && make install

  3. 如果出现找不到gcc或make命令的问题,那么执行

   apt install gcc libc6-dev  # 这一步确保gcc
   apt install automake autoconf libtool make # 这一步确保安装make
  1. 命令行中输入python3.8 --version查看是否安装成功

  2. 确认pip已安装,apt install python3-pip, pip3 --version

网络服务器

Daphne是python的一个库,在后续代码部署时安装即可

反向代理

  1. 安装Nginx:apt install nginx

进程管理

  1. 安装Supervisor:apt install supervisor

二.开始部署

1. 使用git同步代码

  1. git clone 代码地址,如果出现权限问题请检查用户,如果出现ssh问题请检查证书(证书问题请查看其他文档)
  2. 进入项目,切换至目标分支,git checkout 分支名
  3. 配置git,使之不用每次拉代码都要输入用户名和密码(查阅其他文档)

2. 准备python虚拟环境

  1. python3.8 -m venv venv,该命令会在当前目录下创建一个名为venv的目录,里面就是python虚拟环境
  2. source venv/bin/activate, 运行该命令后会进入虚拟环境,此时python命令就能指代python3.8

3. 安装项目

  1. 在进入虚拟环境的前提下进入项目目录,执行pip install -r requirements.txt
  2. 安装项目:python setup.py develop
  3. 测试运行:daphne ly_web_server.asgi:application -b 0.0.0.0 -p 8001 ,如果没报错即可;ctrl+c退出

4. 项目服务化

  1. 配置supervisor
   cd etc/supervisor
   vi  supervisord.conf
   
   查看如下对应信息
   [include]
   files = /xxx/*.ini
   
   也可以自己设定读取路径
   [include]
   files = /etc/supervisor/supervisord.d/*.ini
  1. 配置自己的配置,vi /etc/supervisor/supervisord.d/asgi.ini
   [program:daphne]
   directory=/home/ly_web_server/ly_web_server # 项目路径
   command=/home/ly_web_server/ly_web_server/venv/bin/daphne -b 0.0.0.0 -p 8000 --proxy-headers ly_web_server.asgi:application
   # daphne启动命令 虚拟环境要指定daphne的绝对路径
   autostart=true
   autorestart=true
   stdout_logfile=/opt/websocket.log # 运行日志保存路径
   redirect_stderr=true
  1. 运行服务,supervisord -c /etc/supervisor/supervisord.d/asgi.ini
   supervisorctl status # 查看启动状态
   
   有如下消息说明正常启动
   daphne                           RUNNING   pid 19997, uptime 0:21:53
  1. 服务管理:
   supervisorctl # 进入supervisor环境
   supervisorctl reread # 重载配置
   supervisorctl update # 更新
   supervisorctl start all # 开启
   supervisorctl status # 查看启动状态

6. 配置反向代理

nginx配置如下:

upstream channels-backend {
        server 0.0.0.0:8000; # dephne配置的web服务地址
}
map $http_upgrade $connection_upgrade{
  default upgrade;
  "" close;
}
server {
        listen 80; # 提供客户端访问的端口号
        location / {
                proxy_pass http://channels-backend;

                proxy_http_version 1.1;  # 设置websocket网络协议支持
                proxy_set_header Upgrade $http_upgrade; # 设置websocket网络协议支持
                proxy_set_header Connection "upgrade"; # 设置websocket网络协议支持

                proxy_redirect off; # 是否支持重定向
                proxy_set_header Host $host; # 服务器本身的ip
                proxy_set_header X-Real-IP $remote_addr; # 客户端的ip
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 路由顺序
                proxy_set_header X-Forwarded-Host $server_name;
        }
}

systemctl restart nginxnginx -s reload即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章