Nginx+uwsgi django项目部署

时间:2021-12-02 21:12:27

django 项目部署

0x000

  • 在django开发的过程中我们使用的是django自带的 ‘runserver’服务器进行开发(请允许我这么叫它)。但是在工程项目中是不会使用它的。通常我们会使用 nginx+uwsgi的架构。如下图所示:

Nginx+uwsgi django项目部署

0x001 安装nginx

  • 准备工作:
  • 进行安装

    1. 解压缩 tar -xzvf nginx-1.8.1.tar.gz

    2. 进入 nginx目录中 cd nginx-1.8.1/

    3. 执行以下命令

      sudo ./configure --prefix=/usr/local/nginx/
      sudo ./make
      sudo ./make install 
      
      # 如果你安装中出现错误,不要放弃。在百度和google一定会有解决你问题的方法。有失败才有成长
      
      # 以上就安装完成
      # 配置文件目录为 /usr/local/nginx/conf/nginx.conf
      # 启动nginx sudo /usr/local/nginx/sbin/nginx
      # 停止nginx  ps -aux | grep ngnix 查找出nginx pid 号。 sudo kill -9 pid

0x002 安装uwsgi

  • 重要,在安装uwsgi的时候。电脑上一定不要安装anaconda。不然就会出现各种问题导致安装不上。如果使用环境管理器,请使用 virtualenv.

  • 下面附上安装virtualenv的方法和卸载conda的方法.

    # 在删除之前如果需要保存虚拟环境安装的包可以使用以下命令
    pip freeze > packages.txt
    
    
    # 1. 找到anaconda文件夹
    sudo rm-rd anaconda 
    # 2. 找到环境变量文件 ~/.bashrc
    vim ~/.baserc   # 删除最后跟anaconda环境相关的语句
    # 3. 重启 /.bashrc
    source .bashec
    sudo pip3 install virtualenv # 安装虚拟环境
    sudo pip3 install virtualenvwrapper  #安装虚拟环境的扩展包(可以简化一些操作)
    
    # 编辑家目录下的.bashrc文件.添加下面代码
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
    
    # 常用的命令
    mkvirtualenv  #创建虚拟环境
    # mkvirtualenv -p (Python的版本) (虚拟环境的名称)
    mkvirtualenv -p python3.6 django_1.8
    
    workon 虚拟环境名  # 进入虚拟环境
    workon django_1.8
    
    deactivate  # 退出虚拟环境
    
    rmvirtualenv 虚拟环境名  # 删除虚拟环境
    
    # 安装之前导出的Python包
    pip install -r packages.txt
    
    # 参考文档:https://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html
  • 安装uwsgi

    • 前提: 安装了 gcc编译器和Python.
    • pip install uwsgi 进行安装

0x003 配置uwsgi

  • 在django项目部署之前。首先要吧 settings.py文件下的:

    DEBUG=FALSE   # 调试关闭
    ALLOWED_HOSTS=[‘*’]   # 允许任何ip访问
  • 编写uwsgi的配置文件

    [uwsgi]
    #使用nginx连接时使用
    #socket=127.0.0.1:8080
    
    #直接做web服务器使用
    # http=127.0.0.1:8080
    
    socket=127.0.0.1:8080
    
    #项目目录
    chdir=/home/yangaoteng/桌面/blog
    #项目中wsgi.py文件的目录,相对于项目目录
    wsgi-file=blog/wsgi.py
    # 指定启动的工作进程数(当启动后会发现启动了不止四个.因为有管理的进程)
    processes=4
    # 制定工作进程的线程数
    threads=2
    # 主进程,为True不占用命令台,直接输入到log日志的文件中
    master=True  
    # 保存启动后进程的pid(进程号)
    pidfile=uwsgi.pid
    # 设置uwsgi在后台,保存日志信息
    daemonize=uwsgi.log
    # 设置虚拟环境的路径
    virtualenv= /home/yangaoteng/.virtualenvs/django_1.8
    
    # 参考文档: https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/
  • uwsgi 的启动和停止

    # 启动
    uwsgi --ini 配置文件的路径
    # 停止
    uwsgi --stop uwsgi.pid的路径
  • 如果我们现在把 ini 文件中的 socket=127.0.0.1:8080.改为 http=127.0.0.1:8080,打开网页就会发现网页的样式和js都没有加载出来。这是因为在我们使用uwsgi以后django就不会跟我们管理静态文件。这里我们就需要自己管理静态文件。这是nginx就派上了用场。

0x004 配置nginx

  • 首先设置 nginx 与 uwsgi进行通信

    • 打开 nginx 的配置文件 sudo vim /use/local/nginx/conf/nginx.conf

    • 修改配置文件

             server {
                      listen          80;  # 监听80端口
                      server_name     localhost;  # 公网ip
      
                      location / {
                              # 包含uwsgi的请求参数
                              include uwsgi_params;
                              # 转交给uwsgi ip post
                              uwsgi_pass 127.0.0.1:8080;
                      }
      
      # 因精力有限具体的配置说明请查看 http://www.nginx.cn/doc/ 
    • 这样我们就把所有的信息转交给了uwsgi。接下来我们就要在 nginx 拦截静态文件,让他直接访问 硬盘上的静态文件目录就好.

  • 设置静态文件

    1. 创建文件夹 mkdir /var/www/blog/static

    2. 搜集django的静态文件

      # 在项目文件目录 setting.py 中添加如下设置
      STATIC_ROOT= '/var/www/blog/static'
      
      # 在命令台输入以下命令收集静态文件。收集到上面的目录
      python manage.py collectstatic
    3. 在 nginx配置文件中添加以下配置选项

      location /static {
         alias /var/www/blog/static/;  # 刚设置文件的目录
      }

0x005 nginx实现转发和负载均衡

  • Nginx实现转发另外的地址 (因为我的首页在另外一台静态服务器上,我需要进行转发.)

    # 进行精确匹配
    location = / {  
      proxy_pass http://192.168.1.103:80;
    }
  • 有多台业务处理服务器进行负载均衡

    upstream blog{
      server 192.168.1.104:80;
      server 192.168.1.105:80;
    }
    location / {
        # 包含uwsgi的请求参数
        include uwsgi_params;
        # 转交给uwsgi ip post
        # uwsgi_pass 127.0.0.1:8080;
        uwsgi_pass blog   # 设置的名字为blog
    }