django项目+nginx+uwsgi部署

时间:2024-10-22 14:22:49

简介

本博客记录了我在部署Django项目时遇到的问题及其解决方法,包括如何使用uWSGI启动项目以及通过uWSGI协议与Nginx进行通信。

问题描述以及如何解决

首先遇到的问题是在部署Django项目时,WSGI报告了错误:‘no python application found, check your startup logs for errors’。这个问题是由于在初始化uWSGI的配置文件uwsgi.ini时,指定了错误的目录路径来指向项目的wsgi.py文件。因此,也导致了Django项目的初始化失败。简而言之,就是我设置的Django项目路径不正确。
错误配置如下:

# 项目根目录的路径
chdir = /home/ubuntu/StudentCodeRater/studentcoderater/student_management_system
# Django 的 wsgi 文件
wsgi-file = student_management_system/wsgi.py

不要直接指定wsgi.py路径
正确配置如下:

# 项目根目录的路径
chdir = /home/ubuntu/StudentCodeRater/studentcoderater
# Django 的 wsgi 文件
wsgi-file = student_management_system/wsgi.py

接着,我遇到了一个错误信息:‘invalid request block size: 21573 (max 4096)…skip’。这个问题通常发生在uWSGI为每个请求头分配的默认缓存大小(4096字节)不足以处理某些请求头时。如果请求头的大小超过了这个限制,uWSGI就会认为这个请求是无效的。这可能是因为应用生成了过大的请求头,或者是因为请求错误地发送到了使用uWSGI协议的端口,而不是预期的HTTP协议。

为了解决这个问题,我通过增加uWSGI的缓存大小来处理更大的请求头。具体来说,我设置了buffer-size选项,将其增加到65536字节(64KB),这是一个接近uWSGI最大值65535的安全数值。我在uWSGI的配置文件中添加了以下行来实现这一设置

buffer-size = 65536

最终,我的uWSGI配置如下所示:

[uwsgi]
# Django 项目相关设置
# 项目根目录的路径
chdir = /home/ubuntu/StudentCodeRater/studentcoderater
# Django 的 wsgi 文件
wsgi-file = student_management_system/wsgi.py
#pythonpath = /home/ubuntu/StudentCodeRater/studentcoderater
# uwsgi 服务器的角色
master = true
# 进程数
processes = 4
# 线程数
threads = 2
# 存放进程编号的文件
pidfile = uwsgi.pid
# 使用 socket 监听(使用绝对路径更安全)
socket = 0.0.0.0:8081
#http = 0.0.0.0:8081
buffer-size = 65536
# 访问统计,如果需要可以取消注释
# stats = 127.0.0.1:9191
# 清除环境在退出时
vacuum = true
# 日志文件,因为 uWSGI 可以脱离终端在后台运行
daemonize = uwsgi.log
# 虚拟环境的目录
virtualenv = /home/ubuntu/anaconda3/ls/envs/django5

nginx的配置

server {
    listen 端口;
    server_name 公用IP地址;

    location / {
        root 前端项目路径;
        index index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    location /api {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8081;
    }

    location /static {
            # 静态文件目录
            alias /var/www/horse_new/horse_shibie/static;
            #
        }
      error_page   500 502 503 504  /50x.html;
      location =/usr/share/nginx/html/50x.html {
           root   html;
          }
}