uwsgi - django部署

以一个最基础的初始django 项目为例(不涉及数据库)

  1. 将django项目的环境打包成requirements.txt
  2. 购买一个服务器
  3. 将服务器安全组设置 设置入站规则全开
  4. 配置python环境
    • 本人使用的是ubuntu 20.04 自带python 3.8
    • 首先安装pip - 注:如果E: Package 'python3.10-venv' has no installation candidate说明你应该更新一下系统的可安装软件列表apt-get update
    • 然后安装virtualenv
    • 然后cd到想要的目录下 创建虚拟环境
    • cd到刚创建的虚拟环境目录下的bin文件夹内 source activate启动环境
  5. 配置项目环境
    • cd到项目根目录 执行pip install -r requirements.txt (一定要在上一步启动虚拟环境之后在进行环境配置)
    • 运行结束即可
  6. 安装uwsgi
    • pip install uwsgi即可
  7. 配置uwsgi.ini文件 - 在项目根目录中的同名目录下(就是个默认wsgi.py文件同一个文件夹下)
[uwsgi]
http=0.0.0.0:8000 #设置为0.0.0.0表示外网可以访问 127.0.0.1表示本机访问
chdir=/my/mysite  #项目根目录
wsgi-file=mysite/wsgi.py   #项目根目录里面的同名文件内的wsgi.py文件
process=2 #启动进程数 跟服务器cpu有关
threads=2 #线程数 
pidfile=uwsgi.pid  #储存进程的pid 以便于后面停止运行
daemonize=uwsgi.log #日志文件
master=true  #主进程启动
  1. 然后cd进入到uwsgi.ini同级内
    • 执行uwsgi --ini uwsgi.ini 启动
    • 此时就能通过公网ip+端口访问到djano服务了
  2. 停止服务
    • uwsgi --stop uwsgi.pid进入到uwsgi.ini同级文件夹运行即可
      PS. 使用命令 ps aux|grep 'uwsgi'可以查看服务是否启动,出现如下表示正常:
root       84204  1.0  3.8  47520 36724 ?        S    11:07   0:00 uwsgi --ini uwsgi.ini
root       84206  0.0  3.0 121252 29816 ?        Sl   11:07   0:00 uwsgi --ini uwsgi.ini
root       84207  0.0  2.7  47520 26280 ?        S    11:07   0:00 uwsgi --ini uwsgi.ini
root       84250  0.0  0.0   6432   720 pts/0    S+   11:08   0:00 grep --color=auto uwsgi

10. 彻底关闭uwsgi进程

如果没有设置停止的pid或者启动失败导致pid生成失败,这样就会导致有uwgsi进程挂在后台,因此需要彻底关闭:pkill -f uwsgi -9

PS.

  • 如果uwsgi日志报错:uwsgi invalid request block size: 4937 (max 4096)...skip
    代表请求过大(超过默认4k)因此跳过
    因此只要将请求接收的值方法即可:在uwsgi.ini文件添加buffer-size = 65536 即可。
  • 这样部署之后,网站是请求不到静态文件的(css,js,图片等)所以需要再搭配nginx进行静态文件请求的处理。

uwsgi常见报错

  • 1.启动失败: 端口被占用
    解决方法: 更换端口/停止占用端口的进程
    sudo lsof -i:端口号 - 查看端口 kill -9 端口号 - 停止端口进程

  • 2.停止失败 stop无法关闭uwsgi
    原因: 重复启动uwsgi导致uwsgi.pid中进程号失效
    解决方法 : ps 出uwsgi进程,手动kill

    1. 启动失败 找不到配置文件
      大概率uwsgi.ini中的chdir和wsgi两个参数的地址配置错误
      解决方法:修复即可,注意chdir是项目绝对路径,wsgi是wsgi.py文件的相对于项目根目录的路径
  • 安装uwsgi报错ERROR: Failed building wheel for uwsgi
    搜索解决方法:更新pip即可 - 更新系统依赖 - 安装psycopg2-binary -
    都没有用
    最后:apt-get install build-essential python3-dev然后pip即可
    stackoverflow

    1. 修改项目后再使用uwsgi启动报错
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: The app module <module 'cyanine' (namespace)> has multiple filesystem locations (['/my/imsys/./cyanine', '/my/imsys/cyanine']); you must configure this app with an AppConfig subclass with a 'path' class attribute.

原因:没有正确设置app,因为想要添加一个展示页面作为项目的index,所以就直接将这个html文件以及附带的静态文件一股脑地放在一个文件夹里面然后添加到项目中,还在setting中注册了app名字,但是实际上这个app里面缺少对应的配置文件,这就开发模式下能够凭借文件路径运行正确,但生产模式部署的时候就导致uwgis运行的时候找不到文件路径报错。
因此,对于django的app来说,需要有两个文件:__init.py__apps.py文件,其中apps.py中内容为

from django.apps import AppConfig
class PollsConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "你注册在setting中的app名字"