Django项目部署

内文部分内容参考至:https://www.cnblogs.com/mapel1594184/p/13973205.html

方式一:Nginx  +  uWSGI  +  Virtualenv

Nginx :

  Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。

  特点:

      占有内存少,并发能力强

      反向代理,可以拦截一些web攻击,保护后端的web服务器

      负载均衡,根据轮询算法,分配请求到多节点web服务器

      缓存静态资源,加快访问速度,释放web服务器的内存占用 

uWSGI :

  uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
  特点:
      单节点服务器的简易部署 轻量级,好部署
 
  要注意 WSGI / uwsgi / uWSGI 这三个概念的区分:
    WSGI是一种通信协议;
    uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信;
    而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器;
 
  uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
 

Virtualenv:

  第三方库,用来建立一个虚拟的python环境,一个专属于项目的python环境

 

1.请求处理整体流程:

  nginx接收到浏览器发送过来的http请求,将包进行解析,分析url 

    静态文件请求:就直接访问用户给nginx配置的静态文件目录(html/css/js/图片),直接返回用户请求的静态文件。

    动态接口请求: nginx将请求转发给uWSGI服务器,最后到达django处理

  开发服务器与部署在生产服务器后请求与响应的处理方式见下图:

                  

 

  2.各模块作用:

    nginx:是对外的服务器,外部浏览器通过url访问nginx,nginx主要处理静态请求(html/css/js/图片)

    uWSGI:是对内的服务器,主要用来 处理动态请求 。(从mysql、redis、es等中动态查询到的 数据)。

    uwsgi:是一种web协议,接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi。

    wsgi:是python专用的web协议,根据请求调用应用程序(django)的某个文件,某个文件的某个函数。

    django:是真正干活的,查询数据等资源,把处理的结果再次返回给WSGI, WSGI将返回值进行打包,打包成uwsgi能够接收的格式。

    uwsgi:接收wsgi发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

                

 

 

部署步骤:

  部署相关文档:

    https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/uwsgi/

 

1.  安装uwsgi

  pip3 install uwsgi

  安装后须进行测试,具体测试步骤见:https://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

 

2. 安装虚拟环境virtualenv

  pip3 install virtualenv

  创建虚拟环境

    virtualenv --python=python3 虚拟环境名

  启用虚拟环境

    source 虚拟环境名/bin/activate

  虚拟环境python第三方库一键导出与安装

    pip freeze > requirements.txt

    pip install -r requirements.txt

  退出虚拟环境

    deactivate

 

3. nginx安装与配置

  sudo apt-get install nginx

  cd /etc/nginx

    sites-available:可用配置

    sites-enabled:已启用配置

    nginx.conf:配置文件(一般无需修改)

  cd sites-available

  vim 项目名.conf 

  配置项目相关配置:配置详情指导见https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/uwsgi/

  例如:

  server {
    listen 80(端口);
    server_name ××.××.××.××(域名);
    charset utf-8;

    client_max_body_size 75M;

    location /static {
      alias /home/项目名/static;
    }

    location / {
      uwsgi_pass 127.0.0.1:8001(将80端口转发到uwsgi的8001端口);
      include /etc/nginx/uwsgi_params;
    }
  }

 

4. 配置uwsgi

   cd /home

   创建ini文件专属文件夹:

     mkdir /uwsgi_conf

   配置项目专属ini文件:

     vim 项目名称.ini

     例如:

        [uwsgi]
        chdir = /home/项目名
        home = /home/虚拟环境文件夹
        module = 项目名.wsgi:application 

        master = True
        processes = 4
        harakiri = 60
        max-requests = 5000

        socket = 127.0.0.1:8001(与项目名.conf相对应)

        uid = 1000
        gid = 2000

        pidfile = /home/uwsgi_conf/master.pid
        daemonize = /home/uwsgi_conf/master1.log(存储服务log信息)
        vacuum = True

      详细配置参考:https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/uwsgi/

     按配置启动UWSGI:

     uwsgi --ini /home/uwsgi_conf/项目名.ini 

     cd /etc/nginx

   创建软链接,链接sites-available中.conf文件的改动

        ln -s /etc/nginx/sites-available/项目名.conf /etc/nginx/sites-enabled/项目名.conf 

   判断nginx配置是否正确:

        nginx -t

           正常结果:nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

             nginx: configuration file /etc/nginx/nginx.conf test is successful

   重启nginx服务:

        service nginx restart

 

5. 代码提交修改后重启服务生效

    杀死uwsgi

      killall -9 uwsgi

    启动uwsgi(虚拟环境中)

      uwsgi --ini /home/uwsgi_conf/项目名.ini

    重启nginx

      service nginx restart

 

6.注意事项:

    (1)修改 : /home/virtual_env/lib/python3.5/site-packages/django/db/backends/mysql/operations.py(146行),将decode改为encode

    (2)apache2 与 nginx未改变配置(默认监听端口号相同)时不要同时启动,否则会启动报错,安装时最好将先安装的apache2或者nginx服务stop 。

        

posted @ 2021-03-09 14:49  菜鸟小ONE  阅读(105)  评论(0)    收藏  举报