1

前言

浏览器上网的过程简单来说即是浏览器从服务器中获取网站信息,经过渲染后将效果呈现给用户。这里侧重介绍下在幕后默默工作着的服务器。
Web服务器是运行在物理服务器上的一个程序,永久地等待客户端(主要是浏览器,比如Chrome,Firefox等)发送请求。Web服务器通过HTTP协议与客户端通信,当收到请求之后,如果是静态文件的话Web服务器可直接返回,如果不是静态文件的话需要有一个Web应用服务器根据不同的请求处理对应的业务逻辑生成相应的响应,如下图所示。

图片描述

目前在UNIX和LINUX平台下使用最广泛的免费Web服务器有Apache和Nginx。Nginx是高效的Web服务器和反向代理服务器,可以用作负载均衡,与Apache相比,Nginx支持高并发,可以支持百万级的TCP连接,十万级别的并发连接,部署简单,内存消耗少,成本低,虽然动态请求处理没有Apache丰富,但Nginx支持uWSGI的uwsgi协议,可将动态请求传递至uWSGI处理。

这里选择使用Nginx和uWSGI相结合的应用,由于Nginx是反向代理服务器,因此需要网络上的Web应用服务器uWSGI负责具体的应用逻辑处理,虽然uWSGI也可以作为Web服务器应用在小规模网站,但配合Nginx使用可以更好的利用Nginx在缓存、并发处理,安全防护,日志等方面的强大功能。
图片描述

下面就来介绍下如何搭建Nginx+uWSGI环境来运行Python应用。


Nginx服务器部署

下载源码库。Nginx服务器的安装依托于openssl、zlib、pcre库的支持,在安装Nginx之前需要对这三个库进行安装,以下提供各个源码库的下载地址:
(1)openssl-fips-2.0.2.tar.gz(安全通讯库)https://www.openssl.org/source/
(2)zlib-1.2.7.tar.gz(数据压缩库)http://www.zlib.net/
(3)pcre-8.21.tar.gz(正则表达式库)http://www.pcre.org
(4)nginx-1.2.6.tar.gz http://nginx.org/en/download....

安装源码库。在Shell终端界面中输入Linux命令执行安装。涉及到普通用户执行root命令时权限不足的问题,可在命令前增加sudo指令解决。执行安装分为以下几步:
(1)解压文件。tar zxvf openssl-fips-2.0.2.tar.gz
(2)进入至存储的文件夹路径。cd openssl-fips-2.0.2
(3)运行shell配置脚本检测运行环境,生成makefile文件。./configure(Nginx的配置脚本需要结合依托库运行:./configure --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-fips-2.0.2)

若运行环境不满足,如运行pcre配置文件时提示“configure: error: You need a C++ compiler for C++ support”,即缺少C++编译器,那么需要安装C++编译器“sudo apt-get install g++”

(4)编译源码库:make
(5)安装源码库:make instal

执行测试命令:./nginx -t(在/usr/local/nginx/sbin路径下执行),出现如下提示表示已经安装成功

图片描述

启动/停止服务器

(1)执行启动命令:./nginx。启动后在浏览器输入http://localhost:80监听本机80端口,出现如下图所示内容,表示已经成功启动nginx服务器
图片描述

(2)执行查看端口命令:netstat -ntlp
图片描述

(3)筛选出nginx进程并打印:ps -ef|grep nginx
图片描述

(4)Kill进程ID方式退出nginx进程:kill -QUIT
图片描述


uWSGI服务器部署

在介绍uWSGI服务器部署前,先梳理uwsgi、uWSGI、WSGI的区别:

WSGI(Web Server Gateway Interface)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口协议,只要web服务器和 web应用都遵守WSGI协议,那么两者之间就可以任意组合。
uwsgi是基于二进制的线路协议,与WSGI协议作用相同,但属于uWSGI服务器自有协议
uWSGI是Web服务器,它实现了WSGI协议、uwsgi、http等协议

安装uWSGI。此处通过pip安装,也可以下载源码进行安装。

pip install uwsgi

Python编写应用程序server.py,在网页上显示“Hello World”,代码如下:

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

启动uWSGI服务器。可通过命令方式启动uWSGI,也可以将参数写在配置文件中(inixmljsonyaml),指定配置文件来启动uWSGI(命令“uwsgi myapp.ini”)。

sudo uwsgi --http-socket :8001 --plugin python --wsgi-file server.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
--http-socket参数指定了HTTP监听地址和端口,
--wsgi-file参数指定了WSGI应用程序入口,uWSGI会自动搜寻名为”application”的应用对象并调用它。
--plugin python参数指定uWSGI 使用 python 插件去解析文件
--master 参数配置主进程
--processes 参数配置多进程
--threads参数配置多线程
--stats 参数配置在指定地址访问状态信息,如下图在”127.0.0.1:9191″获取JSON格式的运行信息
图片描述


配置文件内容如下:
[uwsgi]
http-socket=:8001
plugins = python
wsgi-file=server.py
master=true
processes=4
threads=2
stats=127.0.0.1:9191

浏览器URL输入”http://localhost:8001″,可以访问到server.py执行的结果”Hello World!”

图片描述

更多关于uWSGI的介绍可参考官网文档:http://uwsgi-docs.readthedocs...

Nginx+uWSGI反向代理

Ngx_http_uwsgi_module模块起到Nginx服务器与uWSGI服务器交互作用,通过对uwsgi_pass设置服务器地址和协议,可将动态内容传递至uWSGI处理。

配置uWSGI。将uWSGI的HTTP端口监听改为socket端口监听,即配置文件中的“http-socket”项改为“socket”项。

[uwsgi]
socket=127.0.0.1:3031
plugins = python
wsgi-file=server.py
master=true
processes=4
threads=2
stats=127.0.0.1:9191

配置Nginx。打开Nginx的配置文件nginx.conf(Ubuntu上路径“/usr/local/nginx/conf”),需要执行“sudo chmod -R 777 nginx.conf”降低配置文件权限才可对服务器相关属性进行配置

配置代码如下:
    server {  
        listen       80;  
        server_name  localhost;  
        location / {  
    #root   html;
    #index  index.html index.htm;
        include uwsgi_params;#加载uWSGI配置参数
        uwsgi_pass 127.0.0.1:3031;#请求转发至”127.0.0.1:3031″端口上,即uWSGI服务器
               }  
        }  

启动uWSGI服务器和nginx服务器,再次访问”http://localhost:80”时会看到python应用程序返回“Hello World!”,表示已经完成nginx服务器对uWSGI服务器的反向代理功能。

 sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
 sudo service nginx restart$ uwsgi myapp.ini

元宵大师
140 声望130 粉丝

Python资深数据分析师、高级项目管理师,致力于推动人工智能、大数据分析在金融量化交易领域中的应用。