在宝塔下使用 uwsgi 上线 Django 项目

部署准备

  1. 购买服务器和备案域名(这里以 Cent OS 8.x 为例)
  2. 在服务器上安装宝塔以及 Nginx 等必要软件
  3. 准备要上线的 Django 项目

添加站点

  1. 添加站点

    添加站点

  2. 上传项目

    上传项目-1
    上传项目-2

部署项目

  1. 安装你需要的 Python 和 pip 版本

  2. 修改 settings.py 文件

    1
    2
    3
    4
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = False

    ALLOWED_HOSTS = ['*']
  3. 放行相应端口

    • 放行你需要的端口,如:Django 的 8000 端口、MySQL 的 3306 端口、Redis 的 27017 端口等

      放行端口

    • 放行完毕后可以在项目目录运行 (需要提前安装所需依赖包) python manage.py runserver 0:8000 ,然后在本地使用 ip:8000 来访问网站,如果可以访问,则端口开放正常,如果不能访问则需要去服务器服务商 (如:腾讯、阿里、华为) 后台检查防火墙或者安全组等配置

  4. 添加 uwsgi.ini 配置文件

    • 在项目目录项新建 uwsgi.ini 文件,并在其中写入以下内容

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      [uwsgi]
      socket=0.0.0.0:8000
      # http=0.0.0.0:8000
      chdir=/www/wwwroot/你的域名/你的项目/
      wsgi-file=shop/wsgi.py
      processes=4
      threads=2
      master=True
      pidfile=uwsgi.pid
      daemonize=uwsgi.log
    • 参数说明

      • socket:线上使用 nginx 连接时使用
      • http:直接作为 web 服务器使用
      • chdir:项目目录
      • wsgi-file:项目中 wsgi.py 文件的目录,相对于项目目录
      • processes:启用的进程数目
      • threads:启用的线程数目
      • master:是否启用一个管理者
      • pidfile:uwsgi 运行后其 pid 的存储目录
      • daemonize:以守护进程运行时,日志存放的目录
  5. 添加 uwsgi 控制命令

    • 添加启动命令:项目目录下新建 start.sh 文件,并写入以下内容

      1
      uwsgi -d --ini uwsgi.ini
    • 添加停止命令:项目目录下新建 stop.sh 文件,并写入以下内容

      1
      uwsgi --stop uwsgi.pid
  6. 添加依赖文件

    • 项目目录下新建 requiremens.txt 文件,并写入项目运行中你需要的依赖,如:Django
    • 也可以在本地使用命令 pip freeze > requirements.txt 生成依赖文件
  7. 迁移静态文件

    • settings.py 中做如下修改

      1
      2
      3
      4
      5
      6
      STATIC_URL = '/static/'
      # 添加STATIC_ROOT
      STATIC_ROOT = '/www/wwwroot/你的域名/static/'
      STATICFILES_DIRS = [
      os.path.join(BASE_DIR, 'static'),
      ]
    • 添加迁移命令脚本:项目目录中新建 collectstatic.sh,内容如下

      1
      python manage.py collectstatic
    • 更改脚本权限

      1
      chmod 777 collectstatic.sh
    • 生成迁移静态文件:项目目录中运行以下命令

      1
      ./collectstatic.sh
  8. 配置 Nginx

    • 进入站点配置界面

      进入站点配置界面

    • 配置 Nginx 图示

      配置Nginx

    • 在最上边添加负载均衡模块

      1
      2
      3
      4
      5
      upstream project {
      server 10.11.0.1:8000 down;
      server 10.11.0.2:8000 backup;
      server 你服务器外网ip:8000 weight=1 max_fails=1 fail_timeout=300s;
      }
      • project:指定负载均衡器的名称,这个名称可以任意指定,在后面需要的地方直接调用即可
      • 负载均衡调度算法
        • weight:在轮询调度算法中,请求按顺序循环分配给后端服务器。在加权轮询中,每个服务器都有一个权重,通常是一个整数值。服务器的权重决定了分配给它的请求的数量。权重越高的服务器,分配到的请求越多。这允许管理员根据服务器的性能和负载能力来调整每台服务器的请求负载。
        • ip_hash:IP 哈希算法根据客户端的 IP 地址来选择服务器。这个方法使用一个哈希函数处理客户端 IP 地址,然后根据哈希结果将请求分配给服务器列表中的一个服务器。这种方法的一个优点是来自同一客户端的请求总是被分配给相同的服务器(假设服务器列表没有变化),这可以在服务器间保持会话的持久性。
        • fair:fair 算法是一种第三方模块提供的负载均衡方法。这个算法不是 Nginx 默认提供的,而是需要额外安装的。它的工作原理是根据后端服务器的响应时间来分配请求,确保请求分配尽可能公平,即尝试向每个服务器分配相同数量的请求,并同时考虑服务器的响应时间。在 fair 算法中,如果一个服务器的响应时间较长,它将接收到更少的新请求,直到其响应时间改善。这种方法可以动态地适应后端服务器的实际性能,从而使得负载更加均衡。
        • url_hash:URL 哈希算法根据请求的 URL 来选择服务器。同样使用哈希函数,它处理请求中的 URL(通常是路径或者完整的路径和查询参数),然后根据哈希结果将请求分配给服务器列表中的一个服务器。这样,所有对同一 URL 的请求都会被转发到同一台服务器上,用于缓存优化。
      • down:表示当前的 server 暂时不参与负载均衡
      • backup:预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻
      • max_fails:允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
      • fail_timeout:在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用
      • 注意:当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup
      • 说明:nginx 的 worker_rlimit_nofile 达到上限时,再有客户端链接报 502 错误。用了 log_format 指令设置了日志格式之后,需要用 access_log 指令指定日志文件的存放路径
    • 配置 location

      1
      2
      3
      4
      5
      6
      7
      location / {
      # proxy_pass http://域名:8000;
      # proxy_set_header X-real-ip $remote_addr;
      # proxy_set_header Host $http_host;
      include uwsgi_params;
      uwsgi_pass project;
      }
      • project:跟上前指定的负载均衡器名称一致
    • 配置静态目录

      1
      2
      3
      4
      location /static {
      # 该目录为生成的静态文件目录
      alias /www/wwwroot/你的域名/static/;
      }
    • 注释宝塔 Nginx 配置

      注释宝塔Nginx配置

      注意:修改完记得保存

    • 重载 Nginx 配置

      重载Nginx配置

  9. 添加 SSL

    添加SSL证书

  10. 启动项目

    • 安装依赖包

      1
      pip install -r requiremens.txt
    • 安装 uwsgi

      1
      pip install uwsgi
    • 给启动和停止 uwsgi 文件添加权限

      1
      2
      chmod 777 start.sh
      chmod 777 stop.sh
    • 启动 uwsgi

      1
      ./start.sh
    • 查看 uwsgi 是否启动

      1
      ps -aux | grep uwsgi
  11. 测试项目

    • 在本地访问你的域名即可