Nginx【反向代理负载均衡动静分离】--下

2023-10-26

Nginx【反向代理负载均衡动静分离】–下

Nginx 工作机制&参数设置

master-worker 机制

示意图

在这里插入图片描述

图解
  1. 一个master 管理多个worker
    在这里插入图片描述

一说master-worker 机制

● 争抢机制示意图

在这里插入图片描述

图解
  1. 一个master Process 管理多个worker process, 也就是说Nginx 采用的是多进程结构, 而不是多线程结构.
  2. 当client 发出请求(任务)时,master Process 会通知管理的worker process
  3. worker process 开始争抢任务, 争抢到的worker process 会开启连接,完成任务
  4. 每个worker 都是一个独立的进程,每个进程里只有一个主线程
  5. Nginx 采用了IO 多路复用机制(需要在Linux 环境), 使用IO 多路复用机制, 是Nginx 在使用为数不多的worker process 就可以实现高并发的关键

二说master-worker 机制

示意图

在这里插入图片描述

对上图说明

● Master-Worker 模式

1、Nginx 在启动后,会有一个master 进程和多个相互独立的worker 进程

2、Master 进程接收来自外界的信号,向各worker 进程发送信号,每个进程都有可能来处理这个连接。

3、Master 进程能监控Worker 进程的运行状态,当worker 进程退出后(异常情况下),会自动启动新的worker 进程。

● accept_mutex 解决"惊群现象"/理论

1、所有子进程都继承了父进程的sockfd,当连接进来时,所有子进程都将收到通知并“争着”与它建立连接,这就叫“惊群现象”。

2、大量的进程被激活又挂起,只有一个进程可以accept() 到这个连接,会消耗系统资源。

3、Nginx 提供了一个accept_mutex ,这是一个加在accept 上的一把共享锁。即每个worker 进程在执行accept 之前都需要先获取锁,获取不到就放弃执行accept()。有了这把锁之后,同一时刻,就只会有一个进程去accpet(),就不会有惊群问题了。

4、当一个worker 进程在accept() 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,完成一个完整的请求。

5、一个请求,完全由worker 进程来处理,而且只能在一个worker 进程中处理。

● 用多进程结构而不用多线程结构的好处/理论

1、节省锁带来的开销, 每个worker 进程都是独立的进程,不共享资源,不需要加锁。在编程以及问题查上时,也会方便很多。

2、独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快重新启动新的worker 进程

● 实现高并发的秘密-IO 多路复用

1、对于Nginx 来讲,一个进程只有一个主线程,那么它是怎么实现高并发的呢?

2、采用了IO 多路复用的原理,通过异步非阻塞的事件处理机制,epoll 模型,实现了轻量级和高并发

3、nginx 是如何具体实现的呢,举例来说:每进来一个request,会有一个worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream 返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个request 才会接着往下走。由于web server 的工作性质决定了每个request 的大部份生命都是在网络传输中,实际上花费在server 机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在

小结

Nginx 的master-worker 工作机制的优势

1、支持nginx -s reload 热部署, 这个特征在前面我们使用过

2、对于每个worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多

3、每个worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式/IO 多路复用来处理请求, 即使是高并发请求也能应对.

4、采用独立的进程,互相之间不会影响,一个worker 进程退出后,其它worker 进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程

5、一个worker 分配一个CPU , 那么worker 的线程可以把一个cpu 的性能发挥到极致

参数设置

worker_processes

● 需要设置多少个worker
  • 每个worker 的线程可以把一个cpu 的性能发挥到极致。所以worker 数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu 频繁切换上下文带来的损耗。
  • 设置worker 数量, Nginx 默认没有开启利用多核cpu,可以通过增加worker_cpu_affinity配置参数来充分利用多核cpu 的性能
#2 核cpu,开启2 个进程
worker_processes 2;
worker_cpu_affinity 01 10;

#2 核cpu,开启4 个进程,
worker_processes 4;
worker_cpu_affinity 01 10 01 10;

#4 核cpu,开启2 个进程,0101 表示开启第一个和第三个内核,1010 表示开启第二个和第四个内核;
worker_processes 2;
worker_cpu_affinity 0101 1010;

#4 个cpu,开启4 个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

#8 核cpu,开启8 个进程
worker_processes  8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

worker_cpu_affinity 理解

在这里插入图片描述

配置实例

在这里插入图片描述

  1. 重新加载nginx/usr/local/nginx/sbin/nginx -s reload
  2. 查看nginx 的worker process 情况

在这里插入图片描述

worker_connection

  1. worker_connection 表示每个worker 进程所能建立连接的最大值,所以,一个nginx 能建立的最大连接数,应该是worker_connections * worker_processes

​ (1)默认:worker_connections: 1024

​ (2)调大:worker_connections: 60000,(调大到6 万连接)

​ (3)同时要根据系统的最大打开文件数来调整.

系统的最大打开文件数>= worker_connections*worker_process 根据系统的最大打开文件数来调整,worker_connections 进程连接数量要小于等于系统的最大打开文件数,worker_connections 进程连接数量真实数量=worker_connections * worker_process

查看系统的最大打开文件数
ulimit -a|grep "open files"
open files (-n) 		65535
  1. 根据最大连接数计算最大并发数:如果是支持http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是HTTP 作为反向代理来说, 最大并发数量应该是worker_connections *worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端
    服务的连接,会占用两个连接,
看一个示意图

在这里插入图片描述

配置Linux 最大打开文件数

  1. 使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
  2. 新装的linux 默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。
  3. 使用ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效ulimit -n 65535,-S 指soft,-H 指hard)
  4. 有如下三种修改方式:
    1. 在/etc/rc.local 中增加一行ulimit -SHn 65535
    2. 在/etc/profile 中增加一行ulimit -SHn 65535
    3. 在/etc/security/limits.conf 最后增加如下两行记录
      1. *soft nofile 65535
      • *hard nofile 65535

在CentOS 中使用第1 种方式无效果,使用第3 种方式有效果,而在Debian 中使用第2 种有效果
5. 参考: https://blog.csdn.net/weixin_43055250/article/details/124980838

搭建高可用集群

Keepalived+Nginx 高可用集群(主从模式)

集群架构图

在这里插入图片描述

解读

1、准备两台nginx 服务器, 一台做主服务器, 一台做备份服务器

2、两台Nginx 服务器的IP 地址, 可以自己配置, 不一定和我的一样(具体可以使用ifconfig 命令)

3、安装keepalived , 保证主从之间的通讯

4、对外提供统一的访问IP(虚拟IP-VIP)

示意图

在这里插入图片描述

具体搭建步骤

搭建高可用集群基础环境

准备两台Linux 服务器192.168.198.130 和192.168.198.131
  1. 可以克隆来完成
  2. 也可以直接拷贝一份
    在这里插入图片描述
在两台Linux 服务器, 安装并配置好Nginx
  1. 安装配置Nginx 步骤前面讲过, 如果你克隆的Linux, 本身就有安装好了Nginx, 直接使用即可.
  2. 验证安装是否成功, 在windows 可以通过IP 访问到Nginx,
  3. 因为我们是拷贝了一份Linux , 而新的Linux 的Ip 已经变化了, 所以需要克隆的Linux的nginx.conf 文件中的IP 地址, 做相应的修改
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在两台Linux 服务器, 安装keepalived
  1. 下载keepalived-2.0.20.tar.gz 源码安装包, https://keepalived.org/download.html

在这里插入图片描述

  1. 上传到两台Linux /root 目录下

在这里插入图片描述

  1. mkdir /root/keepalived
  2. 解压文件到指定目录: tar -zxvf keepalived-2.0.20.tar.gz -C ./keepalived
  3. cd /root/keepalived/keepalived-2.0.20
  4. ./configure --sysconf=/etc --prefix=/usr/local

说明: 将配置文件放在/etc 目录下, 安装路径在/usr/local

  1. make && make install

说明: 编译并安装
8) 如果成功, 就会安装好keepalived 【可以检查一下】

说明: keepalived 的配置目录在/etc/keepalived/keepalived.conf

keepalived 的启动指令在/usr/local/sbin/keepalived

  1. 提示: 两台Linux 都要安装keepalived

完成高可用集群配置

1 、将其中一台Linux( 比如192.168.198.130) 指定为Master : vi/etc/keepalived/keepalived.conf

在这里插入图片描述

在这里插入图片描述

2、将其中一台Linux( 比如192.168.198.131) 指定为Backup( 备份服务器) : vi/etc/keepalived/keepalived.conf

在这里插入图片描述

在这里插入图片描述

3、启动两台Linux 的keepalived 指令: /usr/local/sbin/keepalived

4、观察两台linux 的ens33 是否已经绑定192.168.198.18

在这里插入图片描述

在这里插入图片描述

注意事项和细节

1、keepalived 启动后无法ping 通VIP,提示ping: sendmsg: Operation not permittedhttps://blog.csdn.net/xjuniao/article/details/101793935

2、nginx+keepalived 配置说明和需要避开的坑https://blog.csdn.net/qq_42921396/article/details/123074780

测试

1、首先保证windows 可以连通192.168.198.18 这个虚拟IP
在这里插入图片描述

2、访问nginx 如图

在这里插入图片描述

说明:大家可以看到, 因为192.168.198.130 是Master 他的优先级高, 所以访问的就是192.168.198.130 的Nginx, 同时仍然是支持负载均衡的.

3、停止192.168.198.130 的keepalived 服务, 否则直接关闭192.168.198.130 主机, 再次访问http://192.168.198.18/search/cal.jsp , 这时虚拟IP 绑定发生漂移, 绑定到192.168.198.131 Backup 服务, 访问效果如图
这里直接关闭192.168.198.130 Master 的keepalived 来测试

在这里插入图片描述

在这里插入图片描述

自动检测Nginx 异常, 终止keepalived

实现步骤

1、编写shell 脚本: vi /etc/keepalived/ch_nginx.sh简单说明: 下面的脚本就是去统计ps -C nginx --no-header 的行数, 如果为0 , 说明nginx已经异常终止了, 就执行killall keepalived

#!/bin/bash
        num=`ps -C nginx --no-header | wc -l`
        if [ $num -eq 0 ];then
        killall keepalived
fi

修改ch_nginx.sh 权限

chmod 755 ch_nginx.sh

修改192.168.198.130 主Master 配置文件

指令: vi /etc/keepalived/keepalived.conf

在这里插入图片描述

4、重新启动192.168.198.130 Master 的keepalived , 这时因为Master 的优先级高,会争夺到VIP 优先绑定.

在这里插入图片描述

在这里插入图片描述

5、手动关闭192.168.198.130 Master 的Nginx

在这里插入图片描述

注意观察keepalived 也终止了

在这里插入图片描述

6、再次访问nginx , 发现192.168.198.18 这个虚拟IP 又和192.168.198.131 备份服务器绑定了.

在这里插入图片描述

注意事项

keepalived vrrp_script 脚本不执行解决办法

-打开日志观察

tail -f /var/log/messages

-重启keepalived

systemctl restart keepalived.service

–说明一下,曾经出现过文件找不到可以修改执行脚本文件名,不要有_就OK
  1. 如果配置有定时检查Nginx 异常的脚本, 需要先启动nginx ,在启动keepalived ,否则keepalived 一起动就被killall 了
  2. 提醒: 小伙伴们配置时,会遇到各种各样问题,有针对性解决即可

配置文件keepalived.conf 详解

#这里只注释要修改的地方
global_defs {
    notification_email {
    	test@foxmail.com  #接收通知的邮件地址
        }
        notification_email_from Alexandre.Cassen@firewall.loc #发送邮件的邮箱

        smtp_server 192.168.200.1 #smtp server 地址
        smtp_connect_timeout 30

        router_id Node132 #Node132 为主机标识
       vrrp_skip_check_adv_addr

        #vrrp_strict 	#这里需要注释,避免虚拟ip 无法ping 通
        
        vrrp_garp_interval 0
        vrrp_gna_interval 0
    }
    vrrp_instance VI_1 {
    
        state MASTER #主节点MASTER 备用节点为BACKUP
        
        interface ens33 #网卡名称
        
        virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,指明属于同一VRRP 组
        
        priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
        

         advert_int 1 #组播信息发送间隔,两个节点设置必须一样

            authentication { #设置验证信息,两个节点必须一致
                auth_type PASS
                auth_pass 1111
            }
            virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样

                192.168.200.16
            }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx【反向代理负载均衡动静分离】--下 的相关文章

  • 如何在 nginx.conf 中引用操作系统环境变量

    在 nginx conf 中 设置变量后set name value 我可以像这样参考它 name 但是当我导出操作系统环境变量时 经过env name from env like https nginx org en docs ngx c
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • airflow webserver 命令失败并显示 {filesystemcache.py:224} 错误 - 不允许操作

    我正在 Cent OS 7 上安装 Airflow 我已经配置了 Airflow db init 并检查了 nginx 服务器的状态及其工作正常 但是当我运行airflow webserver命令时 我收到下面提到的错误 2021 03 2
  • 验证来自两个不同 URL 的 Keycloak 令牌

    我有一个Docker compose具有后端和前端组件的基于系统 后端写的是Python Flask并在多个 docker 容器中运行 前端编写为TypeScript with Angular 前端通过Restful API与后端进行通信
  • 为什么在生产中得到空 CSS 文件?

    我在文件中放入了很多css文件active admin css scss Active Admin s got SASS import active admin mixins import active admin base import
  • 使用 client_body_in_file_only 进行 nginx 文件上传

    晚上好 我需要将静态内容上传到 nginx 服务器 1 9 因此上传模块不适用于此版本 我读过这篇文章 Nginx 直接文件上传 无需通过后端传递 https coderwall com p swgfvw nginx direct file
  • Docker 与 nginx 组合不断显示欢迎页面

    我是新来的docker并尝试使用最简单的 docker compose yml 显示一个 hello world 页面 并在此基础上构建最终完整的LEMP堆栈它将与我的服务器具有相同的配置 然而大多数教程已经过时 并且有很多使用方法dock
  • 为什么 nginx 接受 Host 标头与 server_name 不匹配的请求?

    我有一个这样设置的站点 nginx 作为代理服务器 通过 UNIX 套接字代理为 Django 站点提供服务的 Gunicorn 实例的请求 这是我的 nginx 配置 server listen 80 server name api my
  • NGINX 与 Tomcat 配置

    我是 Nginx 新手 我需要你的帮助 根据很多论坛我了解到我们所有的静态页面都存储在Nginx中 当有请求到来时 我必须将该请求传递给 tomcat 获取数据 并在 tomcat 生成响应后生成响应 目前 我刚刚做到了 我将请求直接传递给
  • 上传大文件(几 GB)时,nginx 返回内部服务器错误

    我在 nginx 后面有一个 Artifactory 上传大于 4 GB 的文件失败 我相当确定这是 nginx 的错误 因为如果文件从本地主机上传 上传到本地主机 则不会出现问题 nginx 设置为client max body size
  • Node + Express + Nginx 未设置 Cookie

    我有一个使用 Express 的 Node 应用程序 我尝试为我的客户端设置 cookie 它在本地环境 http 上运行良好 但是一旦我投入生产 https 我就很好地收到了cookie 我可以在响应中看到它 但它没有设置 任何想法 Ng
  • NGinx 域名重定向

    假设我有一个名为 xyz co 的网站 我还有其他具有相同前缀的域名 例如 xyz com xyz it xyz co it 现在 nginx 与端口 80 的 nginx conf 中的 server name xyz co 配合得很好
  • kubernetes nginx ingress 无法将 HTTP 重定向到 HTTPS

    我有一个托管在 Google Cloud 平台中的网络应用程序 该应用程序位于负载均衡器后面 而负载均衡器本身位于入口后面 入口设置了 SSL 证书 并按预期接受 HTTPS 连接 但有一个问题 我无法让它将非 HTTPS 连接重定向到 H
  • 使用 Nginx 或 Apache 来提供动态内容? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • nginx 匹配位置中的特定单词

    我在匹配 nginx request body 变量中的特定单词时遇到问题 如果正文请求中有特殊单词 我想代理传递 所以我的方法是这样的 location php if request body proxy pass http test p
  • 如何在运行 NGINX Docker 容器的 AWS EC2 上启用 HTTPS?

    我在 AWS 上有一个运行 Amazon Linux 2 的 EC2 实例 在上面 我安装了 Git docker 和 docker compose 完成后 我克隆了我的存储库并运行docker compose up让我的生产环境启动 我访
  • nginx位置正则表达式,匹配多次

    如何在 nginx 位置正则表达式中多次匹配 看来 x x 语法永远不起作用 例如 location abc w 1 3 从来不工作 您必须引用包含以下内容的位置 or 人物 location abc w 1 3 否则 nginx 将其解析
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • Docker 中的 NGINX 缓存 IP 地址并提供错误的 Content-Type

    Summary 我想让NGINX 不是NGINX Plus 通过使用变量从DNS名称重新解析IP地址proxy pass 如建议的这篇 Nginx 官方文章 在变量中设置域名 部分 https www nginx com blog dns
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访

随机推荐

  • Anaconda/jupyter notebook修改虚拟环境名称

    1 找到用户文件夹下的txt文件 比如C Users your username conda environments txt windows平台 找到当前主用户文件夹 有一个 conda文件夹 里面有一个environments txt文
  • 我的2012移动开发年度总结——革命的一年

    2012年 是我在移动行业畅游的一年 这一年发生了很多事 人生三大事之一结婚 评选csdn专家荣誉称号 坚持写博客写了一年 对手机这个行业总算有了个大体的认识 但是还有一些不顺人意的事 这里就不说了 但有一件事不得不说 在这家公司上班以来
  • QWidget尺寸限定

    1 控件只能在最小和最大之间进行调整 不能超过范围 直接宽高同时设置 window setMinimumSize 200 200 window setMaximumSize 500 500 app QApplication sys argv
  • unity3D游戏开发十之粒子系统

    Shuriken粒子系统是Unity3 5版本新推出的粒子系统 它采用模块化管理 个性化的粒子模块配合粒子曲线编辑器使用户更容易创作出各种缤纷复杂的粒子效果 依次打开菜单栏中的GameObject gt Greate Other gt Pa
  • win10 python如何安装requests———超详细教程

    第一步 先检查你的python安装路径下的Scripts文件里有没有东西 我一开始查看时发现竟然是空白的 去搜寻了答案 python安装文件中 Scripts文件夹中没有文件目录 空白 注 我只是操作了该教程中的第二步 在cmd中输入pyt
  • 区块链的核心:共识机制

    我在上一篇 区块链到底是怎么运行的 一文中 提到了 打包交易 和 广播交易 这两个概念 其实 以上谈到的两个内容正是区块链最核心的技术内容之一 共识机制 在今天的文章中 我们就展开聊一聊区块链共识机制到底是什么 以及区块链的共识过程到底是怎
  • 几种排序算法比较

    前言 排序是按照关键字的非递减或非递增顺序对一组记录重新进行排列的操作 是对无规律的一组序列转化为递增或递减的操作 排序的稳定性 当排序记录中的关键字都部相同时 则任何一个记录的无序序列经过排序后得到的结果都唯一 反之 若存在两个或多个关键
  • 如何进行测试微服务?

    在许多方面 测试微服务应用程序与测试使用任何其他体系结构构建的应用程序没有什么不同 微服务面临的独特挑战是组成应用程序的服务数量之多 以及服务之间的依赖关系数量 作为用于构建复杂系统的体系结构 微服务在开发社区中获得了巨大的关注 尽管人们开
  • 论文理解【IL - IRL】 —— Deep Reinforcement Learning from Human Preferences

    标题 Deep Reinforcement Learning from Human Preferences 文章链接 Deep Reinforcement Learning from Human Preferences blogpost L
  • 基于A*算法自动引导车的路径规划(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 动汽车动力系统复杂 行驶工况多变 能耗管理是其研
  • ajax aftersuccess,Ajax jquery success scope

    问题 I have this ajax call to a doop php function doop var old this siblings old html var new this siblings new val ajax u
  • Java 的 Class 文件格式——解析魔数和版本号

    解析 Java 的 Class 文件格式 解析魔数和版本号 作者 陈跃峰 出自 http blog csdn net mailbomb 熟悉 Java 语言有好几年了 技术也学了一些 现在主要从事 J2ME 技术方面的工作 最近工作不是很忙
  • 小学老师工资多少一个月_教师一个月工资是多少? 全国各地教师工资一览

    教师 被誉为人类灵魂的工程师 一直以来教师工资改革都是民生很关注的问题 据获悉 目前中小学教师基本工资都将得到相应的提高 那么 教师一个月工资是多少呢 下面我们来看看全国各地教师工资一览表 教师一个月工资是多少 教师一个月工资是多少呢 全国
  • Python究竟是个啥?为什么985的学生都在学它?早就该曝光了

    现在网上一搜学Python能做什么 无一例外地全跳出来一堆的专业名词 看的时候虎躯一震 看完之后 依然不知道学会了能干啥 不知道大家是不是也有同样的感受 为了解决大家这种困惑 我今天特意花时间总结了一些学完Python能做的工作 力求用最通
  • 【算法】希尔排序C语言实现

    上一篇文章我们一起学习了直接插入排序 它的原理就是把前i个长度的序列变成有序序列 然后循环迭代 直至整个序列都变为有序的 但是说来说去它还是一个时间复杂度为 n 2 的算法 难道就不能再进一步把时间复杂度降低一阶么 可能有很多同学说快速排序
  • linux笔记-awk详解

    简介 awk是一个强大的文本分析工具 相对于grep的查找 sed的编辑 awk在其对数据分析并生成报告时 显得尤为强大 简单来说awk就是把文件逐行的读入 以空格为默认分隔符将每行切片 切开的部分再进行各种分析处理 awk有3个不同版本
  • 以太坊蜜罐智能合约分析

    0 00 前言 在学习区块链相关知识的过程中 拜读过一篇很好的文章 The phenomenon of smart contract honeypots 作者详细分析了他遇到的三种蜜罐智能合约 并将相关智能合约整理收集到Github项目sm
  • 0402自学web后端之——使用flask-mail发送邮件

    安装 gt gt gt pip3 install flask mail 设置环境变量 gt gt gt export MAIL USERNAME 发件邮箱地址 163 com gt gt gt export MAIL PASSWORD 发件
  • java项目利用launch4j生成可执行exe文件

    一 项目结构说明 参见文章 java项目打成可运行jar包 http mp blog csdn net postedit 79194671 二 操作流程 1 右键项目 gt export gt Runnable JAR File gt Ne
  • Nginx【反向代理负载均衡动静分离】--下

    Nginx 反向代理负载均衡动静分离 下 Nginx 工作机制 参数设置 master worker 机制 示意图 图解 一个master 管理多个worker 一说master worker 机制 争抢机制示意图 图解 一个master