1 系统性能定时监控
1.1 系统监控概述
用Python
来编写脚本简化日常的运维工作是Python
的一个重要用途,在Linux
下,有许多系统命令可以时刻监控系统运行的状态;
1.2 psutil
**psutil
是python system and process utilities
缩写,python的系统监控及过程管理的工具,是一个功能强大的跨平台系统管理库。**可以实现命令行中类似ps,top,lsof,netstat,ifconfig,who,df,kill
free,nice,ionice,iostant,iotop
等等命令的功能,并且以python内置的数据结构形式返回;
1.3 常见功能
1.3.1 获取CPU信息
1.3.2 获取内存信息
1.3.3 磁盘信息
- 使用
psutil
类似于linux
下的fdisk
命令,磁盘的利用率以及I/O信息还有分区信息等
1.3.4 网络信息
1.3.5 获得开机时间
1.3.6 小结
1.4 系统性能定时监控
- 功能描述(基础版)
1、显示当前服务器CPU的使用率;
2、显示当前服务器内存的使用率;
3、显示当前服务器硬盘的使用率;
4、显示当前服务器网络的收发情况;
5、显示CPU总核心数、总内存、总硬盘;
6、保存日志信息到log.txt文件中;
7、能够直接执行脚本,查看信息;
- 功能描述(升级版)
1、能够定时显示监控数据
- 如果是模块单独运行,就是
__ name __== "__ __ main__"
- 如果是被当做模块导入,就不能执行
main()
1.4.1 yagmail模块发送邮件
- yamail模块使用
实现自动发邮件功能
-
(3)空行
- 用来分离请求头和请求数据,请求头到此结束!!的标志!!
-
(4)请求数据
- 只有post方式提交的时候,才有请求数据!
- 只有post方式提交的时候,才有请求数据!
-
2、请求报文格式总结
-
3、通过网络调试助手模拟TCP服务器,接收request请求
-
4、小结
- 请求报文格式
- (1)请求行
- 请求方式 资源路径 协议及版本
- (2)请求头
- 协议项
- 协议名:协议值
- (3)请求空行
- 分割请求头和请求的主体
- (4)请求主体
- 浏览器要发给服务端的内容
- GET方式没有请求体,POST方式有请求体
- (1)请求行
- 请求报文格式
3 基于TCP的Web服务器
3.1模拟浏览器实现
- 模拟浏览器请求web服务器的网页过程,使用TCP实现HTTP协议(请求报文格式和响应报文格式);
- 返回的数据如下:(二进制)
- 使用decode()解码后,内容如下:
- 小结
3.2 模拟Web服务器:返回固定数据
-
目标
- 实现简单的Web服务器并返回固定数据给浏览器;
- 实现简单的Web服务器并返回固定数据给浏览器;
-
整体功能:
-
1、Web服务器能够绑定固定端口;
2、Web服务器能够接收浏览器请求;
3、Web服务器遵守HTTP协议,并返回“Hello World"字符串给浏览器;
4、当浏览器关闭后,Web服务器能够显示断开连接;
5、Web服务器短时间内重启,不会提示address already in use错误;
-
-
实现步骤
-
1、导入socket模块;
2、创建tcp套接字;
3、设置地址重用;
4、绑定端口bind;
5、设置监听listen,最大允许客户端连接数128(套接字由主动变为被动);
6、等待客户端连接(能够接收多个客户端连接);
7、定义函数,实现客户端信息接收和响应;
8、接收浏览器请求,并判断请求是否为空;
9、拼接响应报文;
10、定义变量保存响应报文内容;
11、发送响应报文给客户端浏览器;
12、关闭此次连接的套接字;
-
-
代码实现:
-
小结
- 1、导入模块;
- 2、创建套接字;
- 3、设置地址重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
- 4、绑定端口和IP;
- 5、设置套接字为被动状态,listen;
- 6、开始接收客户端连接;
while True: new_client_socket,ip_port=tcp_server_socket.accept() request_handler(new_client_socket,ip_port)
- 7、接收客户端发送的请求协议;
- 8、判断客户端是否已经下线;
- 9、拼接响应报文(响应行+响应头+响应空行+响应主体);
- 10、发送响应报文;
- 10、关闭和当前客户端连接;
3.3 模拟Web服务器:返回固定页面
- 目标
- 实现返回一个固定的html页面给浏览器的Web服务器;
- 实现返回一个固定的html页面给浏览器的Web服务器;
- 功能分析
1、Web服务器能够绑定固定端口;
2、Web服务器能够接收浏览器请求;
3、Web服务器遵守HTTP协议,并返回网页index.html的内容给浏览器;
4、当浏览器关闭后,Web服务器能够显示断开连接;
5、Web服务器短时间内重启,不会提示address already in use错误;
- 实现步骤
1、导入socket模块;
2、创建套接字;
3、设置地址重用;
4、绑定端口IP(服务器必须要做的);
5、设置监听模式,最大允许客户端连接数128,套接字有主动变为被动;
6、等待客户端连接(能够接收多个客户端连接)
7、定义函数,实现客户端信息接收和响应;
8、接收浏览器请求,并判断请求是否为空;
9、拼接响应报文;
10、定义变量保存响应报文内容;
11、打开Index.html文件,并且读取其内容返回给客户端;
12、发送响应报文给客户端浏览器(注意转码问题);
13、关闭此次连接的套接字;
- 代码实现
3.4 模拟Web服务器:返回指定页面
- 目标
- 实现根据浏览器不同请求,返回对应网页资源的Web服务器
*
- 实现根据浏览器不同请求,返回对应网页资源的Web服务器
- 功能分析
1、Web服务器能够绑定固定端口;
2、Web服务器端能够接收浏览器请求;
3、Web服务器遵守HTTP协议,根据请求返回指定的html内容给浏览器;
4、当浏览器关闭后,Web服务器能够显示断开连接;
5、Web服务器短时间内重启,不会提示address already in use错误;
- 实现思路
1、导入socket模块;
2、创建tcp套接字;
3、设置地址重用;
4、绑定端口ip地址;
5、设置监听,最大允许客户端连接数128(套接字主动变被动);
6、等待客户端连接(能够接收多个客户端连接);
7、定义函数,实现客户端信息接收和响应;
8、接收浏览器请求,并判断请求是否为空;
9、拼接响应报文;
10、定义变量保存响应报文内容;
11、获取浏览器发送的请求头信息,分析得到请求html文件路径;
12、根据路径信息,打开指定html文件,并返回内容给客户端浏览器;
13、发送响应报文给客户端浏览器,注意转码问题;
14、关闭此次连接的套接字;
- 代码实现
- 默认首页判断
3.5 模拟Web服务器:返回指定页面存在的问题
- 目标
- 解决资源访问过程中存在的问题
- 1、如果访问的页面不存在怎么办?
- 2、默认首页判断
- 小结
3.6 面向对象封装
-
目标
- 使用面向对象思想,对Web服务器进行封装
-
功能分析
1、使用面向对象思想进行封装;
2、通过对象方法.start()启动web服务器;
- 实现思路
1、创建HttpServer类;
2、创建HttpServer类的构造方法,并在构造方法中对tcp_server_socket创建初始化;
3、创建start()方法,用来web服务器启动;
- 代码实现
3.7 服务端基础架构构建-1
-
目标
- 优化代码,分模块开发
-
1、整体功能
1、创建框架构建相关的文件夹;
2、创建app模块文件;
3、在app模块文件中创建application函数(用于处理请求);
4、将request_handler()中的处理逻辑交由app模块的application函数完成;
5、app模块的application函数返回响应报文;
- 逻辑关系
- 文件目录
- 2、代码实现
- 小结
3.8 服务端基础框架构建-2
- 目标
- 优化代码,分模块开发
- 1、整体功能
1、创建框架构建相关的文件夹;
2、创建app模块文件;
3、在app模块文件中创建application函数(用于处理请求);
4、将request_handler()中的处理逻辑交由app模块的application函数完成;
5、app模块的application函数响应数据;
6、创建utils模块,并且在该模块中创建create_http_response()函数,专门用来拼接响应报文;
7、在app模块的application函数中调用utils模块中的create_http_response()函数,得到完整的响应报文;
- 小结
3.9 使用终端中启动Web服务器
-
目标
- 能够通过终端指定端口并启动Web服务器
- 服务器没有pycharm,终端启动很重要!!!
-
1、功能分析
-
2、实现思路
1、导入sys模块;
2、通过sys.argv获取参数列表;
3、判断列表长度是否为2,如果不等于2要给出提示,Web服务器启动失败;
4、取出第二个参数,判断是否是一个数字,如果不是一个数组,给出提示,Web服务器启动失败;
5、接收启动参数端口号;
6、修改类构造方法,使用提供的端口号启动Web服务器;
- 3、准备工作
- 小结
3.10 案例:网游服务器
- 目标
- 利用Web服务器选择发布Web项目
- 1、功能分析
1、使用浏览器打开指定地址;
2、游戏运行方启动服务器,选择要发布的游戏
3、客户端刷新浏览器即可畅玩新的游戏;
- 2、实现思路
1、定义初始化项目的方法;
2、定义字典保存项目路径 字典格式:key=项目名称 value=路径
3、循环获取字典中的所有Key;
4、根据Key获取游戏的主目录;
5、设置实例属性,保存主目录;
6、修改Web服务器的目录为实例属性保存的主目录;
-
3、核心代码
-
enumerate会将列表变成一个带索引的元组数组
-
4、代码实现
-
小结