[杂记]2023-4-9 flask......nginx......

FLASK写个接口对各种包的版本要求高啊,有点无奈诶,动不动就降低版本.(我想接触最新的东西!!!)

GET和POST有什么区别?

GET和POST是HTTP协议中常见的两种请求方法,它们的区别如下:

  1. GET请求会把请求的参数放在URL中,而POST请求会把请求的参数放在请求体中。

  2. GET请求的URL长度有限制,通常为2048个字符,而POST请求没有限制。

  3. GET请求会被浏览器缓存,POST请求不会被缓存。

  4. GET请求不安全,因为参数会被放在URL中,容易被截获,POST请求相对安全,因为参数放在请求体中。

  5. GET请求只能进行简单的数据查询和传输,而POST请求可以进行复杂的数据操作,如上传文件等。

总之,GET请求适合于简单的数据查询和传输,而POST请求适合于复杂的数据操作和安全性要求较高的场景。

写一个远程过程调用,形式不限,可以用FLASK,2个要求:异常标准化,标准化返回。该怎么写?

思路:

1.使用Flask框架搭建一个简单的HTTP服务器,监听某个端口,等待客户端的请求。

2.定义一个远程过程调用的函数,函数接收客户端传入的参数,执行相应的操作,最后返回结果。

3.在函数中使用try…except语句捕获可能出现的异常,并将异常信息标准化,例如将异常信息转换为一个字典,包括异常的类型、错误信息、堆栈信息等。

4.在函数中使用一个字典记录返回的结果,字典包括一个布尔值表示是否成功执行,以及相应的返回值或者异常信息。

5.将字典转换为JSON格式,作为HTTP响应返回给客户端。

代码实现:

from flask import Flask, request, jsonify

app = Flask(__name__)

def remote_call(param1, param2):
    try:
        # 执行相应的操作
        result = param1 + param2
        # 将结果封装为字典
        res = {'success': True, 'result': result}
    except Exception as e:
        # 将异常信息标准化为一个字典
        err = {'type': type(e).__name__, 'message': str(e), 'stacktrace': traceback.format_exc()}
        # 将异常信息封装为字典
        res = {'success': False, 'error': err}
    # 将字典转换为JSON格式
    return jsonify(res)

@app.route('/rpc', methods=['POST'])
def rpc():
    # 从HTTP请求中获取参数
    param1 = request.json.get('param1')
    param2 = request.json.get('param2')
    # 调用远程过程调用函数
    res = remote_call(param1, param2)
    # 返回JSON格式的结果
    return res

if __name__ == '__main__':
    app.run()

客户端调用:

import requests

url = 'http://localhost:5000/rpc'
params = {'param1': 1, 'param2': 2}
res = requests.post(url, json=params).json()
if res['success']:
    print(res['result'])
else:
    print(res['error'])

以上是一个简单的远程过程调用的实现,可以根据具体需求进行修改和扩展。

为什么尽量不用外键?

实际上,外键是非常有用的数据库设计工具,因为它们可以确保数据的完整性和一致性。然而,有时候在特定的情况下,可能会尽量避免使用外键。

原因可能有以下几点:

  1. 性能问题:使用外键可能会影响数据库的性能。在大型数据库中,外键关系可能会导致性能下降,因为每次插入、更新或删除数据时,都需要检查外键关系。此外,在高并发的情况下,外键可能会导致锁定冲突,从而降低性能。

  2. 数据库设计:有时候,数据库设计可能不需要外键。如果数据库中只有一些简单的表,而且数据之间的关系不是很复杂,那么使用外键可能会增加复杂性。

  3. 数据库迁移:在迁移数据库时,外键可能会成为问题。如果在迁移期间没有正确处理外键关系,可能会导致数据丢失或不一致。

  4. 数据库维护:在维护数据库时,外键可能会成为问题。如果在处理数据时没有正确处理外键关系,可能会导致数据不一致或损坏。

总之,尽管外键是一个有用的数据库设计工具,但在特定情况下,可能会尽量避免使用它们,以避免性能问题、复杂性、迁移问题和维护问题。

闭包函数?装饰器?

闭包函数是指在一个函数内部定义另一个函数,并且内部函数可以使用外部函数中的变量,即使外部函数已经执行完毕,内部函数仍然可以访问外部函数中的变量。闭包函数常用于保持变量的状态或者实现函数式编程。

装饰器是指在不改变函数代码的情况下,通过添加额外的代码对函数进行扩展或修改。装饰器本质上是一个函数,它接收一个函数作为参数,然后返回一个新的函数。装饰器可以用于添加日志、权限验证、性能分析等功能,可以提高代码的可读性和可维护性。

flask中的数据序列化

Flask中的数据序列化是将Python对象转换为可在网络上传输的格式的过程,例如JSON或XML。这在Web应用程序中非常有用,因为它允许应用程序将数据发送给客户端或从客户端接收数据。通过数据序列化,Flask应用程序可以轻松地将Python对象转换为JSON或XML数据格式,以便与其他应用程序进行交互。Flask中常用的数据序列化库包括JSON、YAML和XML。

硬件层面的高可用

硬件层面的高可用性是指通过将多个硬件设备组合成一个可靠的系统,以确保在设备故障或其他问题发生时,系统仍能够正常运行并提供服务。这种高可用性通常通过以下方式实现:

  1. 冗余:在系统中使用多个相同或类似的硬件设备,以确保在一个设备出现故障时,其他设备可以接管其工作。例如,在服务器集群中,可以使用多个服务器来处理请求,如果其中一个服务器出现问题,其他服务器可以继续提供服务。

  2. 负载均衡:在系统中使用多个硬件设备来平衡工作负载,以确保每个设备都能够处理其分配的任务。例如,在Web服务器集群中,可以使用负载均衡器来将请求分发到不同的服务器上,以确保每个服务器都能够平衡工作负载。

  3. 自动故障转移:在系统中使用自动故障转移技术,以确保在一个设备出现故障时,其他设备可以自动接管其工作。例如,在存储系统中,可以使用自动故障转移技术来确保在一个硬盘故障时,数据可以自动转移到其他硬盘上。

  4. 监控和报警:在系统中使用监控和报警技术,以便及时发现设备故障或其他问题,并采取措施解决问题。例如,在服务器集群中,可以使用监控软件来监测服务器的运行状态,并在出现问题时发送警报。

301永久重定向,302临时重定向

301永久重定向是指服务器告诉浏览器这个页面已经永久移动到了一个新的地址,搜索引擎会把原来的页面的权重全部传递到新的页面上,以后就不会再访问原来的地址了。

302临时重定向是指服务器告诉浏览器这个页面只是暂时移动到了一个新的地址,搜索引擎会继续抓取原来的页面,以后还可能访问原来的地址。

简单来说,301永久重定向是告诉浏览器和搜索引擎这个页面已经永久移动到了新的地址,以后都访问新的地址;302临时重定向是告诉浏览器和搜索引擎这个页面只是暂时移动到了新的地址,以后可能还会访问原来的地址。

rewrite ~^(.*).html$ $1.php;

$1 表示正则表达式中第一个括号匹配的内容,也称为捕获组。在这个例子中,(.*) 匹配任意字符(除了换行符)0 次或多次,将其保存在第一个捕获组中,所以 $1 表示第一个捕获组中的内容。因此,这个重写规则将请求中以 .html 结尾的 URL 转换为以 .php 结尾的 URL,同时保留 URL 中的其他部分。例如,将 /example.html 重写为 /example.php。

反向代理

反向代理可以用于以下情况:

  1. 负载均衡:反向代理可以根据不同的负载情况,将请求分发到不同的服务器,从而实现负载均衡,提高网站的性能和可用性。

  2. 安全性:反向代理可以隐藏后端服务器的真实 IP 地址,防止攻击者直接访问后端服务器,提高网站的安全性。

  3. 缓存:反向代理可以缓存静态资源,如图片、CSS、JavaScript 等,减少后端服务器的压力,提高网站的访问速度。

  4. SSL 加密:反向代理可以对外提供 SSL 加密服务,将加密和解密工作交给反向代理服务器处理,减轻后端服务器的负担。

  5. 统一入口:反向代理可以作为网站的统一入口,将请求分发到不同的后端服务器,实现网站的分布式部署。

OSPF

OSPF的负载均衡架构仍然是一个有效的解决方案,但在某些情况下,可能会被其他技术所取代。例如,BGP在大型企业网络中更常用,因为它可以提供更细粒度的路由控制和更大的可扩展性。但是,在小型网络中,OSPF仍然是一种可靠的负载均衡架构。此外,OSPF也可以与其他技术(如ECMP)结合使用,以提供更好的负载均衡和可靠性。因此,可以说,OSPF的负载均衡架构并没有被淘汰,它仍然是一个有用的解决方案,尤其是在小型网络中。

ospf和nginx的负载均衡有什么区别

OSPF是一种路由协议,用于在网络中传输数据包。它通过计算最短路径来确定数据包应该走哪条路线,从而实现负载均衡。

Nginx是一种反向代理服务器,用于将客户端请求转发到多个服务器上进行处理,以实现负载均衡。Nginx可以根据不同的负载均衡算法(如轮询、IP哈希、最小连接数等)将请求分配到不同的服务器上,从而实现更加灵活的负载均衡。

因此,OSPF和Nginx的负载均衡有很大的区别。OSPF是一种路由协议,主要用于网络中数据包的传输,而Nginx则是一种反向代理服务器,主要用于将客户端请求转发到多个服务器上进行处理。同时,Nginx还提供了更加灵活的负载均衡算法,能够更好地适应不同的负载均衡需求。

HTTP/2.0和HTTPS/2.0

HTTP/2.0是HTTP协议的新版本,它是HTTP/1.1的升级版,旨在提高网页加载速度和性能。HTTP/2.0使用二进制格式传输数据,支持多路复用,头部压缩以及服务器推送等新特性。

HTTPS/2.0是HTTPS协议的新版本,它是HTTP/2.0在TLS/SSL加密层上的实现。HTTPS/2.0提供更好的安全性和加密性能,同时也支持HTTP/2.0的新特性。

因此,HTTP/2.0和HTTPS/2.0都是值得推广和使用的技术,它们可以共同提高网站的性能和安全性。

useradd -s /sbin/nologin jiangda

-s 参数表示用户登录时所使用的 shell,/sbin/nologin 是一种特殊的 shell,它不允许用户登录系统,只允许通过其他方式(如 SSH)访问系统。在创建用户时,如果没有指定该参数,则默认使用系统的默认 shell。接 s 表示指定的是 /sbin/nologin。

nginx的多进程

nginx采用多进程模型,即一个master进程和多个worker进程。

master进程主要负责管理worker进程,包括启动、停止、重启、平滑升级等操作。同时,master进程也负责监听端口,接收来自客户端的请求,并将请求分发给worker进程处理。

worker进程主要负责处理客户端的请求,包括解析请求、处理请求、返回响应等操作。每个worker进程都是独立的,互相之间不会干扰。

nginx的多进程模型具有以下优点:

  1. 提高了并发处理能力。每个worker进程都能独立处理请求,可以同时处理多个请求,提高了服务器的并发处理能力。

  2. 提高了稳定性和可靠性。如果某个worker进程出现问题,不会影响其他进程的正常运行,从而提高了服务器的稳定性和可靠性。

  3. 提高了性能。多进程模型可以充分利用多核CPU的优势,提高了服务器的性能。同时,nginx的事件驱动模型也可以提高服务器的性能。

总之,nginx的多进程模型是一种高效、稳定、可靠的服务器模型,适合处理高并发的网络请求。

理解多进程模型可以充分利用多核CPU

多进程模型是指在一个应用程序中同时运行多个独立的进程,每个进程都有自己的内存空间和处理器时间。这种模型可以充分利用多核CPU的优势,因为每个进程都可以在不同的核心上运行,从而实现并行处理。

举个例子,如果一个应用程序需要同时处理多个任务,那么使用多进程模型可以将每个任务分配给不同的进程,在不同的核心上并行执行,从而提高执行效率。如果只使用单进程模型,则只能在一个核心上执行,无法充分利用多核CPU的优势。

因此,多进程模型可以更好地利用多核CPU的性能,提高应用程序的执行效率和响应速度。

nginx.pid里的pid指的是主进程(也称为父进程)的pid。

nginx如何控制多进程的平衡

nginx通过使用upstream模块来控制多进程的负载均衡。upstream模块可以将请求分配给多个后端服务器,并提供一系列负载均衡算法,例如轮询、IP哈希、最小连接数等。在配置文件中,可以通过upstream指令定义一个后端服务器池,并指定每个服务器的地址和端口号。然后,在location指令中,使用proxy_pass指令将请求转发给后端服务器池,nginx会自动根据负载均衡算法将请求分配给其中的一个服务器。通过这种方式,nginx可以实现多进程的负载均衡,提高系统的性能和可靠性。

nginx的指令你能说出哪些?

  1. worker_processes:设置工作进程的数量。
  2. worker_connections:设置每个工作进程的最大连接数。
  3. error_log:设置错误日志文件的路径和级别。
  4. access_log:设置访问日志文件的路径和格式。
  5. server:定义虚拟主机的配置。
  6. location:定义请求的URI和如何处理该请求的配置。
  7. listen:设置监听的IP地址和端口号。
  8. root:设置服务器的根目录。
  9. index:设置默认的主页文件。
  10. proxy_pass:设置反向代理的目标服务器地址。
  11. rewrite:设置URL重写规则。
  12. gzip:启用或禁用gzip压缩。
  13. keepalive_timeout:设置客户端与服务器之间的连接超时时间。
  14. ssl_certificate:设置SSL证书的路径和文件名。
  15. ssl_certificate_key:设置SSL证书的私钥的路径和文件名。

nginx的location动态分离原理

nginx的location可以实现动静分离,原理是根据请求的URI(Uniform Resource Identifier)进行匹配,并将请求转发到不同的后端服务。具体可以通过以下步骤实现:

  1. 在nginx配置文件中定义不同的location块,分别用于处理静态资源和动态请求。

  2. 静态资源的location块可以使用try_files指令,将请求转发到本地文件系统中的静态资源,例如图片、CSS、JS等。

  3. 动态请求的location块可以使用proxy_pass指令,将请求转发到后端应用服务器中进行处理,例如PHP、Java等。

  4. 根据不同的请求路径,将请求分发到不同的location块中进行处理,实现动静分离。

通过这种方式,可以将静态资源和动态请求分别处理,提高网站的访问速度和性能。同时也可以避免动态请求的处理过程中对静态资源的频繁读取,减轻后端服务器的负担。

iptables

iptables是Linux系统上的一个防火墙工具,可以用来控制网络流量,实现网络安全控制。以下是iptables的基本概念和操作:

  1. 防火墙规则:iptables的主要功能是创建和管理防火墙规则,这些规则定义了允许或拒绝哪些网络流量。规则由链和规则条目组成。

  2. 链:iptables中的链是规则的集合,用于过滤入站和出站流量。常用的链包括INPUT、OUTPUT和FORWARD。

  3. 规则条目:规则条目定义了流量的匹配条件和处理方式。常用的规则条目包括ACCEPT、DROP和REJECT。

  4. iptables命令:iptables命令用于创建、修改和删除防火墙规则。常用的命令包括iptables、iptables-save和iptables-restore。

  5. iptables配置文件:iptables的配置文件是/etc/sysconfig/iptables,其中存储了当前的防火墙规则。可以使用iptables-save命令将当前规则保存到该文件中,使用iptables-restore命令从该文件中恢复规则。

  6. iptables选项:iptables命令有很多选项,包括-A(添加规则)、-D(删除规则)、-P(设置默认策略)、-I(插入规则)、-L(列出规则)等。

  7. iptables规则:iptables规则由匹配条件和处理方式组成。匹配条件可以基于源IP地址、目标IP地址、协议类型、端口号等。处理方式可以是ACCEPT(允许通过)、DROP(丢弃)、REJECT(拒绝)等。

需要注意的是,iptables的规则是按照顺序执行的,因此规则的顺序非常重要。一般来说,应该将最常用的规则放在前面,以提高效率。

以上是iptables的基本概念和操作,希望对你有所帮助。

你可能感兴趣的:(flask,nginx,python)