当前位置:C++技术网 > 精选软件 > 云平台开发架构分析系列:19 Nginx+uWSGI+webpy环境搭建实践1

云平台开发架构分析系列:19 Nginx+uWSGI+webpy环境搭建实践1

更新时间:2017-07-02 02:44:17浏览次数:1+次

        从第7篇到13篇,分别讲解了Nginx的安装和默认配置文件的基本配置项。第14篇到16篇讲解了Nginx+uWSGI+webpy架构的原理。17和18两篇分别讲解了uWSGI和webpy的安装方法。到此,服务器的几个部分都安装上了。对于单个的Nginx配置静态网站也介绍 。现在开始讲解整个服务器架构的环境配置的过程。

        Nginx、uWSGI和webpy三者都是可以直接当做HTTP服务器的,只不过,Nginx效率最高,处理静态网页、负载均衡等都做的很好,在实际的运行中使用。uWSGI主要在动态网站技术处理上表现的很不错,所以才用这个来处理动态请求。虽然webpy可以直接当做http服务器,但是这个http服务器的功能,主要是用于开发调试使用,功能很弱。webpy就是作为web开发框架来提高开发效率的。

        了解了为什么我们要选择三者组合,我们在前面也学习到了三者是如何配合起来工作的,如果将Http请求一步步传递转化为webpy能够处理的样子,最后又返回给Nginx返回给浏览器。但是前面只是从理论上讲了一下。要想让这个组合真正跑起来,我们还要做一些工作。

        到这里,我假定你按照一步步的说明,将这三个东西装好了。下面开始介绍这三个东西具体是如何配合工作的,如何配置使用的。

    第一站:Nginx

        Nginx还是作为Http服务器而存在,用于转发HTTP请求。你可以全部转发,也可以部分转发。如果是部分转发,一般就是将动态的请求转发给uWSGI服务器处理,而静态的页面,则直接由Nginx处理。

        我们前面介绍的nginx默认配置文件,就是配置的静态网站。如果只是用这个配置,Nginx还是单独工作的。所以我们现在就要修改nginx的配置文件,将动态的请求转发给uWSGI。

        我们来看看修改后的关键部分的配置:

server {
    listen       80;
    server_name  localhost;
    location / {
        root   html;
        index  index.html index.htm;
    }
    location /api/student {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:8001;
    }
    location /api {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:8002;
    }
}
     这里就截取了server内的配置,因为其他配置项不需要改动。一个server代表一个独立运行的网站。我们就直接在80端口的网站里做部分HTTP请求的转发。当然,如果你想单独配置一个网站来做转发,也是可以的。你只需要按照默认配置文件里面讲解的那样,配置多个网站出来就行了。然后转发的配置,就看这里的讲解。为了方便理解,我这里就在一个网站里配置了。这样的话,你用80端口既可以正常作为静态网站使用,然后指定不同的路径下的地址作为动态请求,就不必单独开一个端口。非80端口需要在url里面显式加在url里,如:

    http://www.cjjjs.com:8080/index.html

        这样的地址看起来就有点别扭,是吧。如果我们配置在一个网站里,端口为80,这样我们访问静态页面可以这样:

    http://www.cjjjs.com/index.html

        访问动态页面可以这样:

    http://www.cjjjs.com/api/get_name

    http://www.cjjjs.com/api/student/get_name

       这样看起来是不是就很舒服了呢?!没有后面的端口号,因为80是默认的,可以不写。在网上查资料的时候,发现有一个人对这样的配置,竟然搞得很复杂。不管他了,我们就按照这样的配置,简单明了。

        相对于默认的配置文件,我们就只是新增了两个location配置项。其实还可以简化为一个location。我这里是想拿来说明一个问题。

        location后面的地址,是作为识别URL里面的路径的。我们定义多个路径,自然就可以将多个路径引向不同的location,然后不同的location有不同的配置,也就可以执行不同的功能了。所以,location后面的路径不能重复定义。而且,location定义的路径,在location外面是可以被引用的。

        那么像/api和/api/student会不会冲突呢?不会。下面是一个对照:

    http://www.cjjjs.com/api/query     -->  定位到/api这个location

    http://www.cjjjs.com/api/student/query     -->  定位到/api/student这个location

        也就是说,它是通过完整的路径来确定的。所以/api和/api/student是不一样的,要单独定义。看上去我们感觉好像是冲突了,你可以实际测试一下。等我们后面都讲解完了,搭建起来环境了,你可以试试。

        之前在将媒体类型mine.types时,我们提到了include。这里又遇见了。uwsgi_params就是一个参数列表,include也就是将这些参数包含到这个配置里面来。至于参数都是干什么的,稍后再说。

        uwsgi_pass则指定了一个IP地址和端口号。这个配置项是用来指定请求转发的。Nginx接受到HTTP请求后,就按照路径定位到对应的location,然后按照uwsgi_pass指定的IP和端口发送出去。使用127.0.0.1自然就是发到本机咯。

        那么Nginx的http请求数据按照什么样的格式转发呢?这就是用的网关协议WSGI、uwsgi等。我们从配置里看到的uwsgi,自然也就可以想到用的是uwsgi网关协议了。那么uwsgi_params参数实际上相当于将uwsgi协议文本化,让我们更好理解。当然通过参数配置,可以让我们很好的定制传递的参数。我们先知道这么回事就好了。

        那么在Nginx这里,我们配置到这里,就算配置好了。这个配置中,Nginx还是有一个web服务器的,提供静态网页。所以这个是反向代理的设置。

        我们再访问配置的路径,就会被Nginx转发到这里设置的IP的端口号的程序里处理。实际上,这就是我们下一步要配置的uWSGI服务器。