杜甫诗云:“读书破万卷,下笔如有神”。开发者多读书、读好书,能打好基础、掌握实践、答疑解惑、拓展视野。正基于此,2021年11月1日起,CSDN、《新程序员》推出“每日一书”栏目,为你推荐精选好书,助力你的开发工作如行云流水。
本文就针对以上问题做简单解答,更详细的内容请阅读《Python高效开发实战――Django、Tornado、Flask、Twisted(第3版)》一书。
HTTP是Web浏览器与Web服务器之间通信的标准协议,是Internet上能够可靠地交换文件的重要基础。HTTP的基本交互流程如图1所示。
每个HTTP站点都有一个服务器进程监听着TCP的HTTP端口,HTTP端口默认为80,也可由服务器进程设置为其他端口。
当服务器发现有客户端建立连接并提交了一个 HTTP 请求(Request)后,就根据请求的内容执行相应的操作,并将结果返回给客户端(Response)。
通常客户在浏览器中发起一次网络访问的步骤如下。
(1)输入网址并按Enter键,比如访问http://mysite:8080/app/index.html。
(2)浏览器通过域名系统查询mysite的真实IP,比如212.34.98.20。
(3)向服务器212.34.98.20的8080端口发起TCP连接请求并建立连接。
(4)发送HTTP请求的内容,包括访问的地址/app/index.html、访问方式GET、浏览器本身的产品名等。
(5)服务器返回/app/index.html中的数据作为Response发送给客户端。如果请求的不是一个文件,则服务器需要执行相应的代码,动态生成且返回给客户端。
(6)浏览器接收到结果后关闭与服务器的TCP连接。
(7)浏览器将接收到的结果呈现在显示器上。
注意:域名解析本身不是HTTP的一部分,客户端应在向服务器建立TCP连接之前就通过DNS服务器完成域名解析工作。
以上是最典型的HTTP流程,当今的HTTP版本还允许客户端在一次HTTP请求完成后不关闭TCP连接,以便第2次发送HTTP请求时复用该连接,从而达到减少系统整体开销的目的,此技术在HTTP中叫作keep-alive。
经过几十年的发展,已经出现几个成熟的处理HTTP的知名Web服务器。
这些Web服务器可以解析(handle)HTTP,当Web服务器接收到一个HTTP请求时,会根据配置的内容返回一个静态HTML页面或者调用某些代码动态生成返回结果。
Web服务器把动态响应(dynamic response)产生的委托(delegate)给其他一些程序,例如Python代码、JSP(JavaServer Pages)脚本、Servlets、ASP(Active Server Pages)脚本等。
无论它们的目的如何,这些服务器端(server-side)的程序通常会产生一个HTTP响应让浏览器浏览。
由于目标操作系统、应用场景及商业目的的不同,当今主流的Web服务器各有特色,将它们的特性简单地概括如下。
当前的主流Web服务器都实现了主流语言的可调用接口标准,这些标准如下。
从客户端浏览器的角度来看,它的每次访问是通过HTTP访问Web服务器从而获得某种服务(下载文件、查看页面、订购商品等)的,但实际上Web服务器仅起到桥梁的作用,即将浏览器的HTTP请求解码,转换成服务器端程序能够识别的接口调用方式,然后将服务器端程序生成的返回封装成HTTP Response,并返回给浏览器。
服务器端程序、Web服务器、客户端之间的关系如图2所示。
最简单的服务器端程序可以是直接读取某文件或返回固定的网页内容;稍复杂一些的服务器端程序需要处理客户端通过HTTP、URL、HTML中传入的参数、动态执行逻辑代码、在数据库或缓存中读写数据等一系列操作,才能最终生成调用结果。
普通HTTP站点的协议与数据以明文方式在网络上传输,而HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)是以安全为目标的HTTP通道,即在HTTP下加入SSL层,通过SSL达到数据加密及身份认证的功能。
目前几乎所有的银行、证券、公共交通的网站均以HTTPS方式搭建。
OpenSSL是一个强大的免费Socket层密码库,蕴含了主要的密码算法、常用的密钥和证书封装管理功能及SSL协议。目前大多数网站通过OpenSSL工具包搭建HTTPS站点,其步骤如下。
本节演示在Linux Ubuntu下OpenSSL的使用方法,以及Nginx在Linux下的证书配置方式。
Windows中OpenSSL的使用方式与Linux中的完全一致,读者可以自行尝试。
1.在服务器中安装OpenSSL工具包
通过如下两条命令安装OpenSSL:
1 # sudo apt-get install openssl
2 # sudo apt-get install libssl-dev
命令运行成功后,OpenSSL命令和配置文件将被安装到Linux系统目录中。
2.生成SSL密钥和证书
通过如下步骤生成CA证书ca.crt、服务器密钥文件server.key和服务器证书server.crt:
// 生成CA 密钥
# openssl genrsa -out ca.key 2048
// 生成CA证书,days参数以天为单位设置证书的有效期。在本过程中会要求输入证书的所在地、公司名、站点名等
# openssl req -x509 -new -nodes -key ca.key -days 365 -out ca.crt
// 生成服务器证书RSA的密钥对
# openssl genrsa -out server.key 2048
// 生成服务器端证书CSR,本过程中会要求输入证书所在地、公司名、站点名等
# openssl req -new -key server.key -out server.csr
// 生成服务器端证书 ca.crt
# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.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_name 0.0.0.0; # 本机上的所有IP地址
ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
location \ {
uwsgi_pass http://127.0.0.1:3011;
}
}
其中需要注意的是参数ssl_certificate和ssl_certificate_key需要分别指定生成的服务器证书和服务器密钥的全路径文件名。
至此,我们已经可以使用浏览器访问服务器的443端口进行HTTPS加密通信了。
再也不用为如何学习Python迷茫了,《Python高效开发实战——Django、Tornado、Flask、Twisted(第3版)》一书本着“纯碎干货,实用至上”的原则,让我们成为真正的全栈开发人才。
本书分为3篇:上篇是Python基础,带领初学者实践Python开发环境,掌握基本语法,同时对网络协议、Web客户端技术、数据库建模等网络编程基础进行深入浅出的学习;中篇是Python框架,学习当前***的Python Web框架,即Django、Tornado、Flask和Twisted,达到对各种Python网络技术融会贯通的目的;下篇是Python框架实战,分别使用4种框架进行项目实践,利用其各自的特点开发适用于不同场景的网络程序。本书内容精练、重点突出、实例丰富、讲解通俗,是广大网络应用设计和开发人员不可多得的一本参考书。
(声明:本文转载自“博文视点Broadview”微信公众号。)