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

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

更新时间:2017-07-03 09:13:14浏览次数:1+次

        在文章《云平台开发架构分析系列19:Nginx+uWSGI+webpy环境搭建实践1》中,我们讲述了Nginx配置转发HTTP请求给uWSGI。不过还没有让大家看看uwsgi这个配置文件的情况。下面将几个网关协议的配置文件放在一起比较:

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

       从名称可以看得出来,从上到下分别是uwsgi、scgi、fastcgi三种网关协议的配置。总体一看,他们还真相似。他们本来就是一类东西,自然也就相似了。

        这都有些什么呢?无非就是HTTP请求的相关信息,包括请求的参数、请求的客户端的IP等信息。Nginx自然是第一手得到请求的信息,然后这些信息必然要传递给uWSGI服务器,所以通过网关协议传递。这里的参数就是一种格式定义,可以反映出这几种网关协议的差别。不过具体是什么我倒是不必太在意,这都是固定的。我们知道是怎么回事就行了。

         那么现在需要做的就是让uWSGI服务器跑起来。uWSGI安装后,可执行程序为uwsgi。我们直接执行uwsgi程序就可以启动uWSGI服务器了。然而,就直接启动吗?那到底启动了什么呢?你需要弄清楚这个过程。

        uWSGI于Nginx配合,当做是web服务器。既然是web服务器,自然需要有web应用程序。不然启动一个空的web服务器有什么意义呢?而我们前面都安装好webpy框架了,我们还需要准备几个文件,也就是能够运行起来的web应用程序。

        在准备web应用程序之前,我们先来看看uWSGI服务器如何启动,如何关闭的。安装好uWSGI后,我们直接敲uwsgi就可以启动uWSGI服务器。不过不输入任何命令选项,也没有什么意义。我们可以通过一系列的命令选项,给uwsgi传入必要的参数。但是用参数传递似乎有点麻烦,所以我们一般还是用配置文件来存储这些参数。然后以后就直接将配置文件交给uwsgi,让它自己从配置文件里面读取相关参数。

        不过说起配置文件,格式倒是有不少,有ini、xml、json等等。不过就几个参数,用ini就很好了,简单明了。其他格式大家可以网上搜一下,很多。

        在具体说这个配置之前,我们先来了解一下,大概都有些什么配置呢?

        Nginx在转发请求的时候,指定了一个端口号。那么也就是说,uWSGI必然需要监听这个指定的端口号,这样nginx转发过来的请求就可以收到。所以端口号是第一个重要参数。另外,IP地址也是nginx指定的那个,本地的话,都是127.0.0.1.这个和nginx的配置是相互呼应的。有了这两个参数,就可以顺利接收到Nginx转发过来的请求了。

        那么要处理这个请求,uWSGI就要将这个请求交给webpy框架下的python脚本文件即作为web应用程序来处理。那么我们需要指定,这个脚本文件的位置和文件名称吧。

        这样,接过来请求,找到了处理请求的,这样uWSGI的任务也就完成了一半。另外一半就是当webpy处理完请求后,将结果返回给uWSGI。然后uWSGI再将结果返回给Nginx,Nginx返回给浏览器。

        下面我们来看看uWSGI的配置文件内容:

[uwsgi]
socket=127.0.0.1:8001
module=main
chdir=/data/test
processes=4
master=true
daemonize=/data/test/log/uwsgi.log
harakiri=50
socket-timeout=30
listen=100
buffer-size=65535
    前面三个就是我们前面说的基础而又重要的三个参数。不写不行,不然就无法向后传递。那么后面的一系列的参数,和nginx的配置有点像。

    processes:表示使用多少个工作进程。

    master:用true或false表示是否启用主进程。

    daemonize:使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

    harakiri:这个选项会设置harakiri超时时间(可以看wiki首页的相关内容)。如果一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)。

    socket-timeout:连接超时时间。

    listen:设置socket的监听队列大小(默认:100)。每一个socket都有一个相关联的队列,请求会被放入其中等待进程来处理。当这个队列慢的时候,新来的请求就会被拒绝。队列大小的最大值依赖于系统内核。

    buffer-size:设置用于uwsgi包解析的内部缓存区大小。默认是4k。如果你打算接受一个拥有很多请求头的大请求,你可以增加这个值到64k。

        将这个配置文件命名为后缀为ini的文件,存储在一个位置,位置随便你定,比如我们将文件命名为uwsgi.ini,存储在/etc下。然后我们来启动uWSGI:

uwsgi --ini /etc/uwsgi.ini
    这样就可以启动uWSGI服务器了。uWSGI会将Nginx发过来的请求,交给ini文件中chdir所指定的目录下的,参数module指定文件处理。我们这里是/data/test目录下的main.py文件。配置文件里不要写py后缀。如果我们在这个目录下面没有这个文件,自然加载不成功。不过uWSGI服务器还是会启动,只是没有应用程序来处理请求而已。

        那如何关闭uWSGI服务器呢?我们只要找到uWSGI服务器程序的PID就行了。可以这样:

    

netstat -ltxpn | grep uwsgi | grep 8001

    

        这样就可以将uWSGI监听的端口先列举出来,然后根据uwsgi名称来过滤,再根据端口号来过滤,我们只看到了一条数据,如:

    tcp        0      0 127.0.0.1:8001              0.0.0.0:*                   LISTEN      9782/uwsgi 

        最后一列的9782就是PID了。我们只要kill掉这个进程,uWSGI就关闭了。当然,这只是其中一种方法,还有很多方法可以获取,你可以自由发挥了。

        uWSGI服务器配置就这么简单。下一篇我们介绍webpy,再看看uWSGI如何和webpy串联起来,最后三者一起跑起来,就很爽了。每一步只要好好做好,后面就不会有什么问题。主要是先要将这些基本流程搞熟悉,不能蒙。只有清楚每一个流程,配置起来时才会如鱼得水。遇到一些问题才会迎刃而解。