您的当前位置:首页正文

nginx+uwsgi部署django及问题记录

2024-11-25 来源:个人技术集锦

step1:原理介绍

从上图可以看出,浏览器发出一个HTTP请求到nginx之后,由nginx通过uwsgi协议(这里存疑,也有人说是通过socket套接字进行通信)转发给uWSGI,uWSGI转发给后台的django服务,由此实现通过nginx代理uWSGI服务。

step2:环境准备&部署

  1. 基础环境:Ubuntu 20.04 server 64bit (64-bit) + python3
  2. 安装django:pip3 install django
  3. cd /home
  4. 在home目录下创建一个django项目:django-admin startproject djangoProject
  5. 进入到项目根目录下,执行python3 manage.py runserver 0.0.0.0:8000
    如果没有报错,一般可以通过你本地的localhost:8000来访问。也可以通过命令行:curl localhost:8000。如果是通过阿里云或华为云租赁的服务器部署的django,本地想要访问的时候,需要先修改django的setting.py文件,修改ALLOWED_HOSTS参数为:ALLOWED_HOSTS = [‘*’] # 允许全部地址访问django。也可以只允许你自己可以访问。
    这时候你已经拥有了一个可以正常启动的django项目。
  6. 安装uwsgi:pip3 install uwsgi。我用的ubuntu可以正常安装,没有报错。之前用的centos8,安装uwsgi的时候各种问题,后面再说。
  7. 测试uwsgi的启动,命令行启动:
uwsgi --http 0.0.0.0:8002 --chdir /home/djangoProject/ --wsgi-file djangoProject/wsgi.py --static-map=/static=static --master --processes 4 --threads 2    
[uwsgi]
#项目目录
chdir=/home/djangoProject
#指定项目application 项目下同名目录下的wsgi.py文件
module=djangoProject.wsgi
#指定sock的文件路径(nginx转发http的目的端口)
socket=0.0.0.0:8000
# 指定IP端口,web访问入口
http=0.0.0.0:8010
# 进程个数
processess = 2
# 线程数
theads = 2
#指定启动时的pid文件路径
pidfile=/home/djangoProject/script/uwsgi.pid
#指定ip及端口(配置nginx就不需要单独启动uwsgi需要填写)
#http=0.0.0.0:8000
#启动uwsgi的用户名和用户组
#uid=root
#gid=root
#启用主进程
master=true
# 启用线程
enable-threads=true
#自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
#设置日志目录
daemonize=/home/djangoProject/script/uwsgi.log
# 日志文件的权限权限不能太低,那样的话就无法写入了。
logfile-chmod = 666
#不记录信息日志,只记录错误以及uwsgi内部消息
disable-logging=true
#buffer-size=65536

  1. 现在我们可以通过配置文件启动uwsgi了:uwsgi --ini uwsgi.ini
  2. 安装nginx:apt-get install nginx # 有的可能需要root权限,由于我是root直接登录的,所以直接执行安装
    正确安装如下:
  3. 进入nginx安装路径:cd /etc/nginx/
  4. 将原配置文件备份一下:mv nginx.conf nginx.conf.bak,然后新建一个nginx.conf配置文件,内容如下:
worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    upstream django {
        server 你的ip:8000;  # 该端口号一定要和之前uwsgi的那个文件里的socket对应的端口一致。
    }
    server {
        listen 80;
        server_name 你的ip:80;  # 这儿如果你有域名的话,就将127.0.0.1:80换成你的域名,没有的话就用这个。
        charset utf-8;
        location /static {
        alias /home/djangoProject/static;  #  静态文件的路径(注意,这儿的allstatic是执行了python manage.py collectstatic之后,自动产生的一个目录,该目录下收集了你>项目中所有的静态文件。其实就是将你的静态文件复制了一遍过来)
        }
        location / {
         # nginx转发动态请求到uWSGI
        include /etc/nginx/uwsgi_params;
        uwsgi_connect_timeout 20;
        uwsgi_pass 你的ip:8000;
       }
    }
}

  1. nginx常用命令:
./nginx				# 启动
./nginx -s reload	# 重载
./nginx -s stop		# 停止
  1. 到这时候,你的nginx+uwsgi+django项目已经基本部署成功了,可以通过页面ip:80端口来访问,同时查看对应的日志,可以看到访问的记录。
    nginx日志路径:/var/log/nginx
    uwsgi日志路径:/home/djangoProject/script

step3:问题及使用到的小知识记录

  1. 端口占用情况
    1.1 根据端口号查询:lsof -i:端口号
    1.2 根据程序查询:netstat -ap|grep 程序名
  2. 安装uwsgi出错:
    2.1 一开始用的是centos8,自带python3,但是缺少python依赖,解决如下:https:///weixin_45503064/article/details/123974713?spm=1001.2014.3001.5502
    2.2 centos6/7,由于是python2的环境,想切换成python3的环境,弄了挺久的,但是失败了。
    2.3 由于centos已经停止维护了,在时候centos8的时候真的是各种问题,包括yum源,切换阿里云镜像找不到对应的镜像地址报404。。层出不穷。最后不得不切换成ubuntu20。
  3. 找不到nginx路径的时候,可以:whereis nginx,每个目录下找找就找到了。
  4. 查看日志:tail -f access.log
  5. uwsgi报异常:invalid request block size: 21573 (max 4096)…skip
    原因:uwsgi启动的时候默认分配一个小的buffer(约4k),可以在配置文件里进行添加参数:buffer-size=65536
显示全文