引言:web服务器是连接用户浏览器与python服务器端程序的中间节点,在网站建立的过程中起着重要的作用。目前最主流的web服务器包括nginx、apache、lighthttpd、iis等。python服务器端程序在linux平台下使用最广泛的是nginx。
本文将带您学习python程序与web服务器连接的wsgi接口、nginx的安装和配置方法,以及搭建ssl网站的技术。本文选自《python高效开发实战——django、tornado、flask、twisted》一书。
wsgi是将python服务器端程序连接到web服务器的通用协议。由于wsgi的通用性,出现了独立的wsgi程序,例如uwsgi和apache的mod_wsgi。
wsgi的全称为web server gateway interface,也可称作python web server gateway interface,开始于2003年,为python语言定义web服务器和服务器端程序的通用接口规范。因为wsgi在python中的成功,所以其他语言诸如perl和ruby也定义了类似wsgi作用的接口规范。wsgi的作用如图。

从上图中可见wsgi的接口分为两个:一个是与web服务器的接口,另一个是与服务器端程序的接口。wsgi server与web服务器的接口包括uwsgi、fast cgi等,服务器端程序的开发者无须学习这部分的详细内容。服务器端的开发者需要关注的是wsgi与服务器程序的接口。
wsgi的服务器程序的接口非常简单,以下是一个服务器端程序的例子,将该文件保存为webapp.py:
该代码只定义了一个函数app,所有来自web服务器的http请求都会由wsgi服务转换为对该函数的调用。该示例的app函数中没有复杂的处理,只是通过start_response返回了状态码,并通过return返回了一个固定的http消息体。与该服务器端程序相对应的是下面的wsgi server程序:
将该wsgi server的程序保存为wsgi_server.py,通过下面的命令即可启动一个web服务器,该服务器对所有的请求都返回hello world页面:
注意:虽然wsgi的设计目标是连接标准的web服务器(nginx、apache等)与服务器端程序,但wsgi server本身也可以作为web服务器运行。由于性能方面的原因,该服务器一般只做测试使用,不能用于正式运行。
nginx 是由俄罗斯工程师开发的一个高性能htt和反向代理服务器,其第1个公开版本0.1.0于2004年以开源形式发布。自发布后,它以运行稳定、配置简单、资源消耗低而闻名。许多知名网站(百度、新浪、腾讯等)均采用nginx作为web服务器。
因为nginx是python在linux环境下的首选web服务器之一,所以本节以ubuntu linux为例演示nginx的安装及配置方法。
在ubuntu linux中可以通过如下命令安装nginx:
安装结果如下。
安装程序把nginx以服务的形式安装在系统中,相关的程序及文件路径如下。
程序文件:放在/usr/sbin/nginx目录中。
全局配置文件:/etc/nginx/nginx.conf。
访问日志文件:/var/log/nginx/access.log。
错误日志文件:/var/log/nginx/error.log。
站点配置文件:/etc/nginx/sites-enabled/default。
安装好后,可以通过如下命令启动nginx服务器:
停止nginx服务器:
查看nginx服务的状态:
重启nginx服务器:
nginx安装后以默认方式启动,在开发调试的过程中可能需要调整nginx的运行参数,这些运行参数通过全局配置文件(nginx.conf)和站点配置文件(sites-enabled/*)进行设置。对全局配置文件(/etc/nginx/nginx.conf)中的关键可设置参数解析如下:
uwsgi是wsgi在linux中的一种实现,这样开发者就无须自己编写wsgi server了。
使用pip命令可以直接安装uwsgi:
安装完成后即可运行uwsgi命令启动wsgi服务器,uwsgi命令通过启动参数的方式配置可选的运行方式。比如,如下命令可以运行uwsgi,用于加载之前编写的服务器端程序webapp.py:
启动时用--http参数指定了监听端口,用--wsgi-file指定了服务器端的程序名。如上所示,uwsgi在启动的过程中会输出系统的一些环境信息:服务器名、进程数限制、服务器硬件配置、最大文件句柄数等。
除了在uwsgi启动命令行中提供配置参数,uwsgi还允许通过一个配置文件设置这些配置参数,比如可以编写如下配置文件,保存在文件名uwsgi.ini中:
启动uwsgi时直接指定配置文件即可:
此时用浏览器访问服务器的9090端口,效果如下。
除了http和wsgi-file参数,uwsgi还有很多其他参数,常用的如下。
socket:以wsgi的socket方式运行,并指定连接地址和端口。该socket接口是uwsgi与其他web服务器(nginx/apache)等进行对接的方式。
chdir:指定uwsgi启动后的当前目录。
processes:指定启动服务器端程序的进程数。
threads:指定每个服务器端程序的线程数。即服务器端的总线程数为precessesthreads。
uid:指定运行uwsgi的linux用户id。
比如,如下配置文件用于用socket方式启动一个uwsgi服务器,并配置了进程和线程数:、
直接通过在站点配置文件中为location配置uwsgi_pass,即可将nginx与uwsgi集成,建立一个基于nginx+python的正式站点。针对如下uwsgi接口有:
技巧:可以为一个uwsgi配置多个nginx server和location,这样就轻松实现了以多域名访问同一个python程序。
普通http站点的协议与数据以明文方式在网络上传输,而https(hypertext transfer protocol over secure socket layer)是以安全为目标的http通道,即在http下加入ssl层,通过ssl达到数据加密及身份认证的功能。目前几乎所有的银行、证券、公共交通的网站均以https方式搭建。
openssl是一个强大的免费socket层密码库,蕴含了主要的密码算法、常用的密钥和证书封装管理功能及ssl协议。目前大多数网站通过openssl工具包搭建https站点,其步骤如下。
在服务器中安装openssl工具包。
生成ssl密钥和证书。
将证书配置到web服务器。
在客户端安装ca证书。
本节演示在linux ubuntu下openssl的使用方法,以及nginx在linux下的证书配置方式。windows中openssl的使用方式与linux中的完全一致,读者可以自行尝试。
通过如下两条命令安装openssl:
命令运行成功后,openssl命令和配置文件将被安装到linux系统目录中。
openssl命令:/usr/bin/openssl。
配置文件:/usr/lib/ssl/*。
通过如下步骤生成ca证书ca.crt、服务器密钥文件server.key和服务器证书server.crt:
上述命令生成服务器端证书时,必须在common nanme (cn) 字段中如实输入站点的访问地址。即如果站点通过www.mysite.com访问,则必须定义cn=www.mysite.com;如果通过ip地址访问,则需设置cn为具体的ip地址。
在站点配置文件/etc/nginx/sites-enabled/default中添加如下server段,可以定义一个基于https的接口,该接口的服务器端程序仍旧为uwsgi接口127.0.0.1:3011。
其中需要注意的是参数ssl_certificate和ssl_certificate_key需要分别指定生成的服务器证书和服务器密钥的全路径文件名。
至此,我们已经可以使用浏览器访问服务器的443端口进行https加密通信了。
想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。