Python网络框架——Web服务器

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Web服务器是连接用户浏览器与Python服务器端程序的中间节点,在网站建立的过程中起着重要的作用。目前最主流的Web服务器包括Nginx、Apache、lighthttpd、IIS等。Python服务器端程序在Linux平台下使用最广泛的是Nginx。

引言:Web服务器是连接用户浏览器与Python服务器端程序的中间节点,在网站建立的过程中起着重要的作用。目前最主流的Web服务器包括Nginx、Apache、lighthttpd、IIS等。Python服务器端程序在Linux平台下使用最广泛的是Nginx。
本文将带您学习Python程序与Web服务器连接的WSGI接口、Nginx的安装和配置方法,以及搭建SSL网站的技术。本文选自《Python高效开发实战——Django、Tornado、Flask、Twisted》一书。

实战演练1:WSGI接口

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:

def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return '<b>Hello, world!</b>'

该代码只定义了一个函数app,所有来自Web服务器的HTTP请求都会由WSGI服务转换为对该函数的调用。该示例的app函数中没有复杂的处理,只是通过start_response返回了状态码,并通过return返回了一个固定的HTTP消息体。与该服务器端程序相对应的是下面的WSGI Server程序:

#引入Python的WSGI包
fromwsgiref.simple_server import make_server
#引入服务器端程序的代码
fromwebapp import application

#实例化一个监听8080端口的服务器
server = make_server('', 8080, application)
# 开始监听HTTP请求:
server.serve_forever()

将该WSGI Server的程序保存为wsgi_server.py,通过下面的命令即可启动一个Web服务器,该服务器对所有的请求都返回Hello World页面:

#python wsgi_server.py

注意:虽然WSGI的设计目标是连接标准的Web服务器(Nginx、Apache等)与服务器端程序,但WSGI Server本身也可以作为Web服务器运行。由于性能方面的原因,该服务器一般只做测试使用,不能用于正式运行。

实战演练2:Linux+Nginx+uWSGI配置

Nginx 是由俄罗斯工程师开发的一个高性能HTT和反向代理服务器,其第1个公开版本0.1.0于2004年以开源形式发布。自发布后,它以运行稳定、配置简单、资源消耗低而闻名。许多知名网站(百度、新浪、腾讯等)均采用Nginx作为Web服务器。
因为Nginx是Python在Linux环境下的首选Web服务器之一,所以本节以Ubuntu Linux为例演示Nginx的安装及配置方法。

1.安装Nginx

在Ubuntu Linux中可以通过如下命令安装Nginx:

#sudo apt-get install 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服务器:

.#sudo service nginx start

停止Nginx服务器:

#sudo service nginx stop

查看Nginx服务的状态:

#sudo service nginx status

重启Nginx服务器:

#sudo service nginx restart

2.Nginx配置文件

Nginx安装后以默认方式启动,在开发调试的过程中可能需要调整Nginx的运行参数,这些运行参数通过全局配置文件(nginx.conf)和站点配置文件(sites-enabled/*)进行设置。对全局配置文件(/etc/nginx/nginx.conf)中的关键可设置参数解析如下:

user www-data;                         ##定义运行Nginx的用户

worker_processes 4;                     ##Nginx进程数,应设置与系统CPU数量相等的数值

worker_rlimit_nofile 65535;             ##每个Nginx进程可以打开的最大文件数

events {                        
    worker_connections 768;             ##每个Nginx进程允许的最大客户端连接数

    #在Nginx接到一个新连接通知后调用accept()来接受尽量多的连接
    multi_accept off;
}

http {

    ##
    # Basic Settings
    ##

sendfile on;                        ##是否允许文件上传
client_header_buffer_size 32k;        ##上传文件大小限制
tcp_nopush on;                            ##防止网络阻塞
tcp_nodelay on;                        ##防止网络阻塞
keepalive_timeout 65;                ##允许的客户端长连接最大秒数

    ##Nginx散列表大小。本值越大,占用的内存空间越大,但路由速度越快
types_hash_max_size 2048;        

access_log /var/log/nginx/access.log;         ##访问日志文件路径名
error_log /var/log/nginx/error.log;             ##错误日志文件路径名

    ## 如下两条用include命令加载站点配置文件
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
在每个Nginx服务器中可以运行多个Web站点,每个站点的配置通过站点配置文件设置。每个站点应该以一个单独的配置文件存放在/etc/nginx/sites-enabled目录中,默认站点的配置文件名为/etc/nginx/sites-enabled/default,对其中关键内容的解析如下:
server {

    ##配置站点监听的端口
    listen 80;            

    root /usr/share/nginx/html;                 ##配置HTTP根页面目录
    index index.html index.htm;                 ##配置HTTP根目录中的默认页面

    #站点监听的IP地址,默认的localhost只可用于本机访问,一般需要将其更改为真实IP
    server_name localhost;

    ##location用于配置URL的转发接口
    location /user/ {
        ##此处配置http://server_name/user/的转发地址
        proxy_pass http://127.0.0.1:8080;
    }

    ##错误页面配置,如下配置定义HTTP 404错误的显示页面为/404.html
    error_page 404 /404.html;
}

3.安装uWSGI及配置

uWSGI是WSGI在Linux中的一种实现,这样开发者就无须自己编写WSGI Server了。
使用pip命令可以直接安装uWSGI:

#pip install uwsgi

安装完成后即可运行uwsgi命令启动WSGI服务器,uwsgi命令通过启动参数的方式配置可选的运行方式。比如,如下命令可以运行uWSGI,用于加载之前编写的服务器端程序webapp.py:

#uwsgi--http:9090--wsgi-file webapp.py
*** Starting uWSGI 2.0.12 (64bit) on [Wed Feb 17 15:27:21 2016] ***
compiled with version: 4.8.2 on 17 February 2016 15:21:40
os: Linux-3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014
nodename: iZ28e3m2w7rZ
machine: x86_64
clock source: unix
pcrejit disabled
detected number of CPU cores: 1
current working directory: /home/lynn/project/my_project
detected binary path: /home/lynn/project/my_project/venv/bin/uwsgi
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 3746
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on 9090 fd 4
spawneduWSGI http 1 (pid: 18669)
uwsgi socket 0 bound to TCP address 127.0.0.1:34755 (port auto-assigned) fd 3
Python version: 2.7.6 (default, Jun 22 2015, 18:01:27)  [GCC 4.8.2]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1ff3b20
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72768 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x1ff3b20 pid: 18668 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawneduWSGI worker 1 (and the only) (pid: 18668, cores: 1)

启动时用--http参数指定了监听端口,用--wsgi-file指定了服务器端的程序名。如上所示,uWSGI在启动的过程中会输出系统的一些环境信息:服务器名、进程数限制、服务器硬件配置、最大文件句柄数等。
除了在uWSGI启动命令行中提供配置参数,uWSGI还允许通过一个配置文件设置这些配置参数,比如可以编写如下配置文件,保存在文件名uwsgi.ini中:

[uwsgi]
http = 9090
wsgi-file = webapp.py

启动uWSGI时直接指定配置文件即可:

#uwsgi uwsgi.ini

此时用浏览器访问服务器的9090端口,效果如下。

除了http和wsgi-file参数,uWSGI还有很多其他参数,常用的如下。
图片描述

  • socket:以WSGI的Socket方式运行,并指定连接地址和端口。该Socket接口是uWSGI与其他Web服务器(Nginx/Apache)等进行对接的方式。
  • chdir:指定uWSGI启动后的当前目录。
  • processes:指定启动服务器端程序的进程数。
  • threads:指定每个服务器端程序的线程数。即服务器端的总线程数为precessesthreads。
  • uid:指定运行uWSGI的Linux用户id。

比如,如下配置文件用于用Socket方式启动一个uWSGI服务器,并配置了进程和线程数:、

uwsgi]
socket = 127.0.0.1: 3011
wsgi-file = webapp.py
processes = 4
threads = 3

4.集成Nginx与uWSGI

直接通过在站点配置文件中为location配置uwsgi_pass,即可将Nginx与uWSGI集成,建立一个基于Nginx+Python的正式站点。针对如下uWSGI接口有:

uwsgi]
socket = 127.0.0.1: 3011
wsgi-file = webapp.py
Nginx的站点配置文件为:
server {
    listen 80;            

##此处改为服务器的真实IP
    server_name121.12.134.11;

    location /{
        ##此处IP与Port配置必须与uwsgi接口中参数相同
        uwsgi_pass http://127.0.0.1:3011;
    }
}

技巧:可以为一个uWSGI配置多个Nginx Server和location,这样就轻松实现了以多域名访问同一个Python程序。

实战演练3:建立安全的HTTPS网站

普通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中的完全一致,读者可以自行尝试。

1.在服务器中安装OpenSSL工具包

通过如下两条命令安装OpenSSL:

#sudo apt-get install openssl
#sudo apt-get install libssl-dev

命令运行成功后,OpenSSL命令和配置文件将被安装到Linux系统目录中。

  • OpenSSL命令:/usr/bin/openssl。
  • 配置文件:/usr/lib/ssl/*。

2.生成SSL密钥和证书

通过如下步骤生成CA证书ca.crt、服务器密钥文件server.key和服务器证书server.crt:

#生成CA 密钥
opensslgenrsa -out ca.key 2048

#生成CA证书,days参数以天为单位设置证书的有效期。在本过程中会要求输入证书的所在地、公司名、站点名等
opensslreq -x509 -new -nodes -key ca.key -days 365 -out ca.crt

#生成服务器证书RSA的密钥对
opensslgenrsa -out server.key 2048

#生成服务器端证书CSR,本过程中会要求输入证书所在地、公司名、站点名等。
opensslreq -new -key server.key -out server.csr

#生成服务器端证书 ca.crt
openssl x509 -req -in server.csr -CA ca.crt -CAkeyca.key -CAcreateserial -out server.crt -days 365

上述命令生成服务器端证书时,必须在Common Nanme (CN) 字段中如实输入站点的访问地址。即如果站点通过www.mysite.com访问,则必须定义CN=www.mysite.com;如果通过IP地址访问,则需设置CN为具体的IP地址。

3.配置Nginx HTTPS服务器

在站点配置文件/etc/nginx/sites-enabled/default中添加如下server段,可以定义一个基于HTTPS的接口,该接口的服务器端程序仍旧为uWSGI接口127.0.0.1:3011。

server {
listen       443;                            #HTTPS服务端口
server_name0.0.0.0;                        #本机上的所有IP地址
ssl                  on;
ssl_certificate    /etc/nginx/ssl/server.crt;
ssl_certificate_key    /etc/nginx/ssl/server.key;

location \ {
    uwsgi_passhttp://127.0.0.1:3011;
}

}

其中需要注意的是参数ssl_certificate和ssl_certificate_key需要分别指定生成的服务器证书和服务器密钥的全路径文件名。
至此,我们已经可以使用浏览器访问服务器的443端口进行HTTPS加密通信了。
想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
图片描述

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3天前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
23 1
|
2天前
|
监控 安全 数据挖掘
网络游戏服务器如何有效防护DDoS与CC攻击
随着网络游戏行业的蓬勃发展,其背后的服务器架构日益复杂,同时也面临着前所未有的网络安全威胁。其中,分布式拒绝服务(DDoS)和CC(Challenge Collapsar,一种针对网页的攻击方式)攻击尤为突出,它们通过大量伪造请求或恶意流量,使服务器资源耗尽,导致服务中断或响应缓慢。因此,保障网络游戏服务器的安全,有效防护DDoS与CC攻击,已成为游戏行业亟待解决的问题。
|
3天前
|
缓存 NoSQL 数据库
高性能Web服务器架构设计
【8月更文第28天】在当今互联网时代,网站的响应速度直接影响用户体验和业务成功率。因此,构建一个高性能的Web服务器架构至关重要。本文将从硬件配置、软件架构以及网络设置三个方面探讨如何提高Web服务器的性能,并提供一些实际的代码示例。
16 0
|
2天前
|
存储 算法 Java
Java中的集合框架深度解析云上守护:云计算与网络安全的协同进化
【8月更文挑战第29天】在Java的世界中,集合框架是数据结构的代言人。它不仅让数据存储变得优雅而高效,还为程序员提供了一套丰富的工具箱。本文将带你深入理解集合框架的设计哲学,探索其背后的原理,并分享一些实用的使用技巧。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
1天前
|
JavaScript 前端开发 UED
服务器端渲染新浪潮:用Vue.js和Nuxt.js构建高性能Web应用
【8月更文挑战第30天】在现代Web开发中,提升应用性能和SEO友好性是前端开发者面临的挑战。服务器端渲染(SSR)能加快页面加载速度并改善搜索引擎优化。Vue.js结合Nuxt.js提供了一个高效框架来创建SSR应用。通过安装`create-nuxt-app`,可以轻松创建新的Nuxt.js项目,并利用其自动路由功能简化页面管理。Nuxt.js默认采用SSR模式,并支持通过`asyncData`方法预取数据,同时提供了静态站点生成和服务器端渲染的部署选项,显著提升用户体验。
|
2天前
|
数据可视化 Python
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
6 0
|
3天前
|
网络协议 API 网络安全
Python远程连接服务器用它就够了
Python远程连接服务器用它就够了
|
15天前
|
机器学习/深度学习 编解码 人工智能
阿里云gpu云服务器租用价格:最新收费标准与活动价格及热门实例解析
随着人工智能、大数据和深度学习等领域的快速发展,GPU服务器的需求日益增长。阿里云的GPU服务器凭借强大的计算能力和灵活的资源配置,成为众多用户的首选。很多用户比较关心gpu云服务器的收费标准与活动价格情况,目前计算型gn6v实例云服务器一周价格为2138.27元/1周起,月付价格为3830.00元/1个月起;计算型gn7i实例云服务器一周价格为1793.30元/1周起,月付价格为3213.99元/1个月起;计算型 gn6i实例云服务器一周价格为942.11元/1周起,月付价格为1694.00元/1个月起。本文为大家整理汇总了gpu云服务器的最新收费标准与活动价格情况,以供参考。
阿里云gpu云服务器租用价格:最新收费标准与活动价格及热门实例解析
|
5天前
|
弹性计算 负载均衡 数据库
阿里云轻量应用服务器全面解析:收费标准、产品优势及适用场景
在云计算领域,阿里云凭借其强大的技术实力和丰富的产品线,为用户提供了一系列高效、便捷的云服务器产品。其中,轻量应用服务器(Simple Application Server)作为面向个人开发者、中小企业等用户的入门级云产品,凭借其易用性、高性价比以及一站式服务体验,受到了广泛的欢迎。本文将全面解析阿里云轻量应用服务器的收费标准、产品优势以及适用场景,帮助用户更好地了解和选择这一产品。
阿里云轻量应用服务器全面解析:收费标准、产品优势及适用场景
|
9天前
|
弹性计算 负载均衡 数据库
阿里云轻量应用服务器收费标准、性能及适用场景全面解析
阿里云轻量应用服务器(Simple Application Server)作为面向个人开发者、中小企业等用户的入门级云产品,凭借其易用性、高性价比以及一站式服务体验,受到了广泛的欢迎。本文将全面解析阿里云轻量应用服务器的收费标准、最新活动价格以及适用场景,帮助用户更好地了解和选择这一产品。
阿里云轻量应用服务器收费标准、性能及适用场景全面解析
下一篇
云函数