2019独角兽企业重金招聘Python工程师标准>>>
1、防刷/限流:nginx + lua 用于对于撞库、刷单进行IP的拦截,定义频次,白名单
2、配置优化
worker process:不能超过CPU的核数,一般2-4个,默认为4,过多会导致CPU使用过高。如果有阻塞的IO,可以适当增加数量,提高处理效率。
worker connections:每个worker维护的连接数,当你使用的端口即将耗尽,可以适当增加连接数,默认1024,一般情况下打开2个连接获取网站资源,也就最多处理512个用户并发。 默认的keepalive-timeout是65 。
CPU优先级: 操作系统的 CPU 调度器处理负载均衡的能力要远远超过 ,如果负载均衡有问题,可以使用调度器工具。
Keep alive: 允许客户端维护与服务器已经创建的连接进行一批请求的处理直到指定的超时时间到达 。 Nginx能够很好的处理空闲的连接 , Nginx的作者声称10,000个空闲的连接智慧使用2.5兆内存(unbelievable), 为什么keep alive有着如此巨大的影响, 应该是显而易见的, 那就是你避免为所有的HTTP请求创建各自的连接, 这是非常低效的. 也许你不需要把keepalive-timeout设置为65, 但是10-20应该是比较通用的选择,正如上面一段所说, Nginx会很好的处理这方面。
硬件限制: 服务器主要还有3个方面的瓶颈. CPU,内存和IO ,CPU,内存非常高,IO是弊端。 为了避免IO瓶颈, 我们需要大量的减少nginx对硬盘驱动器的读写, 通过修改Nginx的行为,以减少磁盘写操作,以及确保对nginx的内存限制,允许它避免磁盘访问 。
Access Log:如果不对这些日志进行统计,可以关闭,避免对磁盘进行操作,如果要访问,可以考虑存在内存,减少IO操作。
Error Log:对问题的定位,需要保持一致打开。
Buffers:设置缓存大小, 如果缓存大小设置的太小, Nginx将不得不把上游(用英文upsteams会更好)的相应结果存放到临时的缓存文件里面,这将会同时增加IO的读写操作, 而且流量越大问题越多。client_body_buffer_size指令用来指定处理客户端请求的缓冲区大小,?这个代表了访问请求的body. 这是用来处理POST的数据,也就是通过提交表单,文件上传等请求的数据. 如果你需要处理很多大的POST请求的,你必须确保缓存区要设置的足够大.
彻底移除磁盘IO:减少磁盘IO无意是不适用磁盘。如果数据量少,可以完全放在内存,避免因为IO差生阻塞。对于数据量大的,会缓存频繁访问的磁盘扇区,更大的内存可以降低IO的使用,意味着可以通过增大内存解决IO的问题。
网络IO:
假设你有了足够大的内存来缓存你的所有数据. 这意味着理论上你的IO读速度达到了3-6gbps. 但是你没有那么快的网络通道. 不幸的是,我们可以优化的网络IO是有限的,我们要通过网络传输数据,所以还将受制于网络IO. 唯一真正有效的方法是尽量减少数据量或压缩。
幸运的是Nginx提供了gzip模块, 它可以使我们在将数据传输给客户端之前压缩它, 这将大大减少数据的大小. 一般来说 gzip_comp_level的值不会在性能方面有多大的差别,设为为4-5即可. 一味的增加它是没有意义的只是浪费的CPU的周期.