zoukankan      html  css  js  c++  java
  • Nginx+uWSGI启动Django

    在之前的几篇博客中对Django的功能做了初步实践,这里链接贴一下:

    Django的安装和启动

    Django之--网页展示Hello World!

    Django之--通过MVC架构的html模板展示Hello World!

    Django之--MVC的Model

    Django之--POST方法处理表单请求

    Django之--模板加载图片

    到这里基本的测试暂时告一段落,但是在实际开发中是不可能用python manage.py runserver这种方式启动web server的,因此接下来测试如何使用uwsgi+nginx的方式启动Django。

    一、安装uWSGI和Nginx

    pip3.6 install uwsgi
    yum -y install nginx
    

    WSGI / uwsgi / uWSGI 这三个概念的区别:(引用自:http://www.cnblogs.com/alex3714/p/6538374.html) 

    WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。 
    uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。 
    而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。 
    uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

    二、为uWSGI编写配置文件

    vi /etc/uwsgi.ini

    [uwsgi]
    chdir=/root/Django/mysite/  --即网站根目录。
    module=mysite.wsgi:application  --标识app位置。
    static-map=/static=/root/Django/mysite/static  --表示模板引用的静态文件的目录,使用图片时必须设置。
    socket=192.168.1.193:8000  --用于接收nginx请求的socket,可以是文件,而且建议是文件,这里懒的改了。
    master = true    
    vhost = true      
    no-site = true     
    workers = 2         
    reload-mercy = 10     
    vacuum = true        
    max-requests = 1000   
    limit-as = 512
    buffer-size = 30000
    pidfile = /var/run/uwsgi.pid
    daemonize = /tmp/uwsgi.log  --uWSGI日志,安装uwsgi调试时有用。

    三、修改Nginx配置文件

    upstream部分一般用于配置负载均衡,这里就不写了。

    server {
        listen       80 default_server;  --表示监听80端口,我们最后也通过访问此端口来访问网站的。
        listen       [::]:80 default_server;
        server_name  192.168.1.193;  #定义server访问名,表示只处理此访问名的请求,如果不设置会默认当前第一个server域,因此不设置也行。
        access_log /etc/nginx/access.log main; #nginx日志
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / { #默认请求访问
    	include	/etc/nginx/uwsgi_params;
    	uwsgi_pass  192.168.1.193:8000; #请求自动转发给192.168.1.193:8000的uWSGI socket,与上面uWSGI的socket参数要一致。
        index  index.html index.htm;
    	client_max_body_size 35m;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

    四、运行uWSGI和nginx

    启动uwsgi和nginx:

    uwsgi --ini=/etc/uwsgi.ini
    service nginx start
    

    此时你就可以通过你在urls.py定义的网址来访问页面了。但是需要注意的nginx上边我监听的是80端口,因此你只需要访问80端口就好,他会把请求全部转发到8000端口的uwsgi处理。

    显示的页面如下图所示(默认的80端口):

    最后:

    必须要说的是不使用nginx只用uwsgi也可以实现以上的功能,但是此时你需要为uwsgi.ini配置http参数,socket参数可以省略,如果只使用uwsgi那么你可以通过http参数定义的端口访问以上页面。使用nginx的最大好处之一是实现对后端uwsgi的负载均衡,这样可以提升并发量,此外nginx对静态请求的处理能力要强过uwsgi,因此如果静态请求较多,那么可以将这部分内容用nginx处理。

    补充:

    最近在用uwsgi+nginx设置https访问项目时遇到了uwsgi无法启动的问题,网上大多数回答都是要么没装django(我特么智障不装django来问问题??!!)要么用了virtualenv(确实没用这玩意儿),到最后还是在十多个stackoverflow的相似话题里找到了一个合胃口的,具体网页原谅我忘记了隐约记得是非前排的、32个赞的回答。

    uwsgi日志报错如下:

    *** Operational MODE: preforking ***
    Traceback (most recent call last):
      File "./mysite/wsgi.py", line 13, in <module>
        from django.core.wsgi import get_wsgi_application
    ModuleNotFoundError: No module named 'django'
    unable to load app 0 (mountpoint='') (callable not found or import error)
    

    我开始以为是系统默认python命令是python2的缘故,但是改为3也是不行,后来看到那位大佬的回复后隐约找到了这个问题应该是django和uwsgi的版本更新速度不协调的问题,这个不是我自己能解决的,暂时的解决办法就是在项目的主app下的wsgi.py文件里加上如下的语句(事实上你单独import sys,然后看sys.path是包含这个路径的,只是uwsgi不知道):

    import sys
    sys.path.append('/usr/local/lib/python3.6/site-packages')
    

      

  • 相关阅读:
    JDK和TOMCAT环境变量配置
    MEF(Managed Extensibility Framework )的入门介绍
    这样的数据导出你知道?
    ListBox实现拖拽排序功能
    各种技术资源汇总
    大话数据结构-排序
    大话数据结构-查找
    CheckListBox的实现方式分析
    listbox里面添加WrapPanel ,支持自适应换行
    RESTful 接口实现简明指南
  • 原文地址:https://www.cnblogs.com/leohahah/p/9081541.html
Copyright © 2011-2022 走看看