zoukankan      html  css  js  c++  java
  • django + uwsgi + nginx部署(前后端不分离)

    django + uwsgi + nginx部署(前后端不分离)

    一、基础

    • uWSGI
      一个基于自有的uwsgi协议、wsgi协议和http服务协议的web网关

    • nginx
      常用高性能代理服务器

    • wsgi.py
      django项目携带的一个wsgi接口文件
      如果项目名叫destiny的话,此文件就位于[destiny/destiny/wsgi.py],即settings.py相同目录下

    • wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
      利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;

    • uwsgi:同WSGI一样是一种通信协议
      uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。

    • uWSGI :一种python web server或称为Server/Gateway
      uWSGI类似tornado web或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。
      因为apache、nginx等,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。

    • uWSGI实现了wsgi协议、uwsgi协议、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

    二、生产环境下请求流程

    1. 用户浏览器利用HTTP协议向nginx服务其发请求
    2. nginx接收到用户的请求,进行处理
      • 如果是静态文件请求,nginx直接返回静态文件
      • 如果是动态请求,nginx使用socket将请求转发给uWSGI服务器,uWSGI利用wsgi协议将请求转发给正真的应用程序进行处理,结果反方向一次返回给浏览器

    三、开发环境与生产环境区别

    例如:Django

    • 开发环境,即 DEBUG=True

      • 使用 python manage.py runserver 127.0.0.1:8000 启动web,在浏览器中即可通过127.0.0.1:8000进行访问

        • 此时的web服务器使用的是 django框架中内置的 runserver 服务器

        • 开发模式下,访问静态文件,只需在url中配置,runserver 会自动对静态文件进行处理,只在开发环境下生效,在生产环境下不会生效

          from django.conf.urls.static import static
          
          urlpatterns += static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
          
          # 或者
          
          from django.views.static import serve
          
          urlpatterns.append(url(r'^(?P<path>.*)$', serve, {'document_root': '/path/to/my/files/'}))
          
    • 生产环境,即 DEBUG=False

      • 此时,不会在使用django内置的web服务器,需要手动指定,一般python使用uWSGI服务器

      • 但是uWSGI对静态的文件请求不能处理,此时需要使用nginx进行请求的分发,分为静态请求动态请求

      • 如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源;
        如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGIuWSGI 将接收到的包进行处理,并转发给wsgiwsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi
        wsgi将返回值进行打包,转发给uWSGIuWSGI接收后转发给nginxnginx最终将返回值返回给客户端(如浏览器

    四、Nginx与uWSGI作用

    • Nginx
      • nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析
      • nginx上加上安全性或其他的限制,可以达到保护程序的作用
      • nginx来处理静态文件的效率很好
    • uWSGI
      • uWSGI是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡
      • django在debug=False下,uWSGI 对静态文件的处理能力不是很好

    五、安装与配置

    • uwsgi

      • pip3 install uwsgi

      • 测试uWSGI

        # 1.测试文件 test.py
        def application(env, start_response):
            start_response('200 OK', [('Content-Type','text/html')])
            return (b"Hello World")
        
        # 2.运行
        uwsgi --http 0.0.0.0:8000 --wsgi-file test.py
            
        # 3.验证
        浏览器中打开 0.0.0.0:8000, 会返回 “Hello World”
        
      • 如果端口被占用

        # 列出占用端口的程序的pid号
        lsof -i :8000
        
        # kill占用端口程序
        kill -9 <pid>
        
      • 项目目录下建立uwsgi.ini

        socket:使用nginx时用socket,不适用nginx时用http

        chdir:项目的目录

        wsgi-file:项目下wsgi.py的路径,相对与chdir目录

        daemonize:uwsgi日志保存位置,相对于chdir目录或指定绝对路径

        pidfile:记录当前运行的uwsgi进程id

        [uwsgi]
        
        socket = 127.0.0.1:8888
        chdir =/root/semf
        wsgi-file = SeMF/wsgi.py
        master =true
        process = 4
        threads = 2
        daemonize = logs/uwsgi.log
        pidfile = uwsgi.pid
        
    • Nginx

      • sudo apt-get install nginx

      • 确定nginx默认配置文件路径

        # 如果不知道哪里
        nginx -t
        
        # 正常结果
        nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
        nginx: configuration file /etc/nginx/nginx.conf test is successful
        
      • 检查默认配置目录下是否有uwsgi_params文件,必须确保存在此文件

        uwsgi_params文件用于nginxuwsgi 之间的请求格式的转换

        uwsgi_params文件中包含的内容如下:

        各个变量意义,参考文档:https://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/Vars.html

        uwsgi_param  QUERY_STRING       $query_string;
        uwsgi_param  REQUEST_METHOD     $request_method;
        uwsgi_param  CONTENT_TYPE       $content_type;
        uwsgi_param  CONTENT_LENGTH     $content_length;
        
        uwsgi_param  REQUEST_URI        $request_uri;
        uwsgi_param  PATH_INFO          $document_uri;
        uwsgi_param  DOCUMENT_ROOT      $document_root;
        uwsgi_param  SERVER_PROTOCOL    $server_protocol;
        uwsgi_param  REQUEST_SCHEME     $scheme;
        uwsgi_param  HTTPS              $https if_not_empty;
        
        uwsgi_param  REMOTE_ADDR        $remote_addr;
        uwsgi_param  REMOTE_PORT        $remote_port;
        uwsgi_param  SERVER_PORT        $server_port;
        uwsgi_param  SERVER_NAME        $server_name;
        
      • 配置文件设置

        备份复制原/etc/nginx/nginx.conf文件,在项目目录下新建nginx.conf粘贴默认配置文件中内容并新增一下内容(在http字典中)

        listen:nginx监听的端口

        access_log:nginx访问日志保存路径

        error_log:nginx错误日志保存路径

        client_max_body_size:允许上传的文件最大大小

        location /{}:处理动态请求

        location /static{}:处理静态请求

        location /upload:媒体资源,用户上传文件路径

        uwsgi_pass:要和uwsgi.ini中的socket相同

          server {
        
            listen 80;
            server_name localhost;
            charset utf-8;
        	access_log /root/semf/logs/nginx_access.log;
        	error_log /root/semf/logs/nginx_error.log;
        	client_max_body_size 500m;
        
            location / {
              include /etc/nginx/uwsgi_params;
              uwsgi_pass 127.0.0.1:8888;
            }
            location /static {
              alias /root/semf/collectstatic/;
            }
            location /upload {
              alias /root/semf/media/;
        	}
          }
        

    六、启动

    • uwsgi启动

      uwsgi --ini uwsgi.ini
      uwsgi --reload uwsgi.pid   # 前提是在配置文件中配置了pid文件
      uwsgi --stop uwsgi.pid	# # 前提是在配置文件中配置了pid文件
      
      # 或者 ps -aux | grep 'uwsgi' , 然后kill再启动
      
    • nginx启动

      /etc/init.d/nginx start
      /etc/init.d/nginx stop
      /etc/init.d/nginx reload
      

    七、验证

    浏览器中ip:port

  • 相关阅读:
    (转)elasticsearch collapse 折叠字段应用
    java 8 supplier object区别
    搜索 rerank : learn to rank 算法
    Runtime.addShutdownHook用法
    MAT(memory anlayzer tool)使用方法
    win10 打开注册表
    关于svn 更新到本地库 图标不显示问题(二)
    如何重启explorer,不用重启电脑 也能使设置生效
    关于svn 更新到本地库 图标不显示问题(一)
    eclipse 编写完JAVA的代码 ctrl+s保存一下,右下角就有building workspace一直在执行。。特别卡、卡、、
  • 原文地址:https://www.cnblogs.com/linagcheng/p/13719820.html
Copyright © 2011-2022 走看看