Nginx相关性能优化

  • 一、考虑方面:
  • 二、压力测试工具 ab ——评估服务能承载的并发
  • 三、系统性能优化
    • 1、文件句柄
    • 2、文件句柄的设置方式:
      • ①、系统全局设置(针对root用户)
      • ②、用户局部修改(针对有所用户)
      • ③、进程局部性修改(核心模块,针对nginx进程:在nginx配置文件中添加[/etc/nginx/nginx.conf])
      • ④、调整内核参数:让time_wait状态重用
  • 四、代理服务优化
    • 1、可加项:
    • 2、Keepalive_requests
    • 3、Keepalive_timeout
  • 五、静态资源优化
    • 5.1、静态资源缓存
      • ①、开启浏览器缓存:
      • ②、关闭浏览器缓存:
    • 5.2、静态资源高效读取
      • ①、sendfile(默认开启)
      • ②、tcp_nopush(默认关闭)
      • ③、提高网络的实时性,需要开启keepalive
    • 5.3、静态资源压缩
    • 5.4、防止资源盗链
    • 5.5、允许跨域访问(多路复用)
      • ①、什么是跨域访问?
      • ②、Nginx允许跨站访问与浏览器的关系:
    • 5.6、CPU亲和配置
  • Nginx安全与优化总结

一、考虑方面:

  • 【1】硬件方面:CPU、磁盘、IO、内存(负载、内存、系统稳定性、使用率、是否有损坏)
  • 【2】网络方面:网络流量是否有延迟、是否丢包
  • 【3】系统方面:文件描述符(文件句柄)【默认读取文件的时候都会占用文件描述符,系统默认是1024个,可进行调整】
  • 【4】应用方面:保持长链接http协议和time_wait
  • 【5】服务方面:静态资源服务优化

二、压力测试工具 ab ——评估服务能承载的并发

ab -n 1000 -c 100 https://www.lucien.com/
-n为指定总共发送多少个请求
-c指定每次发送多少个请求

三、系统性能优化

1、文件句柄

  • linux中一切皆文件,文件句柄就像是数据库中的索引一样,会随着我们进程的调用频繁增加,默认是有上限的,不能让一个进程无限制使用,所以我们需要限制每个进程和服务的最大文件句柄数量。

2、文件句柄的设置方式:

①、系统全局设置(针对root用户)

root  soft  nofile  25535
root  hard  nofile  65535

②、用户局部修改(针对有所用户)

*  soft  nofile  65535
*  hard  nofile  65535

③、进程局部性修改(核心模块,针对nginx进程:在nginx配置文件中添加[/etc/nginx/nginx.conf])

worker_rlimit_nofile  65535ulimit -n 可进行查看文件句柄数 Vim  /etc/security/limits.conf
有个  nofile  -----》即为文件句柄数当文件句柄不足时,系统会进行提示:Too many open files

④、调整内核参数:让time_wait状态重用

vim /etc/sysctl.conf
#如果没有启用,则只有等到time_wait状态端口释放后,才能重新使用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1    (时间戳)[root@node1 ~]# sysctl -p 进行查看我们自己添加的参数
[root@node1 ~]# sysctl -a 查看所有的内核参数

四、代理服务优化

  • 通常nginx作为代理服务,负责转发用户请求,那么在转发的过程中建议开启HTTP长连接,用于减少握手次数,降低服务器消耗。
vim /usr/local/nginx/conf/nginx.conf
http {#配置负载均衡的服务器列表upstream tomcat_server {server 192.168.184.60:8080 ;Keepalive 16;     #长连接}#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理location ~ .*\.jsp$ {proxy_pass http://tomcat_server;#设置后端的Web服务器可以获取远程客户端的真实IP#设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认host的值为proxy_pass指令设置的主机名proxy_set_header HOST $host;#把$remote_addr赋值给X-Real-IP,来获取源IPproxy_set_header X-Real-IP $remote_addr;#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

1、可加项:

#设置连接web超时时间
proxy_connect_timeout 30s;#代理等待web响应超时时间
proxy_read_timeout 30s;#web回传数据至代理超时时间
proxy_send_timeout 30s;#开启代理缓冲区,web回传数据至缓冲区,代理边收边传返回给客户端
proxy_buffering on;#代理接收web响应的头信息的缓冲区大小
proxy_buffer_size 32k;#缓冲代理接收单个长连接内包含的web响应的数量和大小
proxy_buffers  4  128k;

2、Keepalive_requests

  • Keepalive_requests设置通过一个keepalive连接提供的最大请求数,在发出最大请求后,将关闭连接

3、Keepalive_timeout

  • Keepalive_timeout设置超时时间,在此期间与代理服务器的空闲keepalive连接将保持打开状态

五、静态资源优化

  • Nginx作为静态资源web服务器,用于静态资源处理,传输很高效
静态资源类型 种类
浏览器渲染 HTML、CSS、JS
图片文件 JPEG、GIF、PNG
视频文件 FLV、Mp4、AVI
其他文件 TXT、DOC、PDC

5.1、静态资源缓存

①、开启浏览器缓存:

server {Listen 80;
server_name www.lucien.com;
Location ~ .*\.(jpg|gif|png)$ {expires     7d;
}
}

②、关闭浏览器缓存:

Location ~ .*\.(jpg|gif|png)$ {add_header Cache-Control no-store;
add_header Pragma no-cache;
}

5.2、静态资源高效读取

①、sendfile(默认开启)

  • 传统文件读取过程:
    file --> 内核空间调取 --> 应用程序(用户空间) --> 程序用户空间 -->内核空间 --> socket服务
  • Sendfile读取方式:
    file --> 内核空间调取 --> socket服务

②、tcp_nopush(默认关闭)

  • 将多个包一次发送,用于提升网络传输效率,大文件推荐打开,需要开启sendfile才能使用(就像送快递一样,大量的同地区的快递,可进行一起运输,达到高效送货目的)

③、提高网络的实时性,需要开启keepalive

  • 就像宅急送一样,你不能像送其他外卖一样,顺路接了其他单子再送我的外卖,而是拿到我的外卖就直接给我送过来,这就是实时性。

5.3、静态资源压缩

  • Nginx将响应报文发送至客户端之间启用压缩功能,然后进行传输,这能够有效的节约带宽,并提高响应至客户端的速度。

    • ①、gzip传输压缩,传输前压缩,传输后解压
    • ②、gzip压缩哪些类型的文件
      • 可在nginx目录下的mime.types 里查找你需要压缩的类型,然后在nginx.conf配置文件进行添加
    • ③、gzip压缩比率,加快传输,但压缩本身比较耗费服务端性能
    • ④、gzip压缩协议版本,压缩使用在http哪个协议,主流1.1版本

5.4、防止资源盗链

  • 防盗链,指的是防止资源被其他网站恶意盗用。
  • 基础防盗链设置思路:针对客户端请求中携带的header信息来验证请求的合法性,比如客户端请求中携带referer信息。
  • 优点是:规则简单,配置和使用都很方便。
  • 缺点是:防盗链所依赖的referer验证信息是可以伪造的,所以通过referer信息防盗链并非100%可靠,但是能限制大部分盗链情况。

5.5、允许跨域访问(多路复用)

①、什么是跨域访问?

  • 当我们通过浏览器访问a网站时,同时会利用到ajax或其他方式,同时也请求b网站,这样就出现了请求一个界面,使用了2个域名,这种方式对浏览器来说默认是禁止。

②、Nginx允许跨站访问与浏览器的关系:

  • 浏览器会读取Access-Control-Origin的头信息,如果服务端允许,则浏览器不会进行拦截。

5.6、CPU亲和配置

  • CPU亲和:减少进程之间不断的频繁切换,减少性能的损耗,其实现原理是将CPU核心和Nginx工作进程绑定方式,把每个worker进程固定对应的cpu上执行,减少切换cpu的cache miss,获得更好的性能。

    • ①、查看CPU物理状态:lscpu,进行建议查看
    • ②、将Nginx worker进程绑定不同核心(官方建议与cpu核心保持一致)
      • 方式一:
        worker_processes 24;
        worker_cpu_affinity 000000000001 000000000002 000000000003 000000000004;
      • 方式二:(使用较少)
        worker_processes 2;
        worker_cpu_affinity 101010101010 010101010101;
      • 方式三:(最佳绑定方式)
        worker_processes auto;
        worker_cpu_affinity auto;
    • ③、查看nginx worker 进程绑定至对应cpu
      ps -eo pid,args,psr | grep [n]ginx

Nginx安全与优化总结

  • 【1】、cpu亲和、worker进程数、调整每个worker进程打开的文件数
  • 【2】、使用epoll网络模型、调整每个worker进程的最大连接数
  • 【3】、文件的高效读取sendfile、nopush
  • 【4】、文件的传输实时性、nodealy
  • 【5】、开启tcp长连接/以及长连接超时时间keepalived
  • 【6】、开启文件传输压缩
  • 【7】、开启静态文件expires缓存
  • 【8】、隐藏nginx版本号
  • 【9】、禁止通过ip地址访问,禁止恶意域名解析,只允许域名访问
  • 【10】、配置防盗链以及跨域访问
  • 【11】、防DDOS、CC攻击,限制单IP并发连接以及http请求
  • 【12】、优雅限制nginx错误页面
  • 【13】、Nginx加密传输https优化
  • 【14】、Nginx proxy_cache、fastcgi_cache、uwsgi_cache缓存

高并发环境下的Nginx该如何优化,让用户再也不会说卡相关推荐

  1. java支付宝支付_Java 高并发环境下的性能优化,揭秘支付宝技术内幕

    前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等. 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适 ...

  2. 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!...

    写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...

  3. 高并发环境下如何优化Tomcat性能?看完我懂了!

    来自:冰河技术 写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行 ...

  4. 【高并发】在高并发环境下该如何构建应用级缓存?

    来自:冰河技术 写在前面 随着我们的系统负载越来越高,系统的性能就会有所下降,此时,我们可以很自然地想到使用缓存来解决数据读写性能低下的问题.但是,立志成为资深架构师的你,是否能够在高并发环境下合理并 ...

  5. oom 如何避免 高并发_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!...

    [高并发]高并发环境下如何防止Tomcat内存溢出?看完我懂了!! 发布时间:2020-04-19 00:47, 浏览次数:126 , 标签: Tomcat 写在前面 随着系统并发量越来越高,Tomc ...

  6. 高并发环境下,6个构建缓存服务需要注意的问题

    摘要:高并发环境下如何构建缓存服务,你知道吗? 本文分享自华为云社区<[高并发]高并发环境下构建缓存服务需要注意哪些问题?>,作者:冰 河. 缓存特征 (1)命中率:命中数/(命中数+没有 ...

  7. 在高并发环境下该如何构建应用级缓存

    摘要:立志成为资深架构师的你,是否能够在高并发环境下合理并且高效的构建应用级缓存呢? 本文分享自华为云社区<[高并发]在高并发环境下该如何构建应用级缓存?>,作者:冰 河. 随着我们的系统 ...

  8. tomcat 请求超时_高并发环境下如何优化Tomcat性能?看完我懂了!

    来自:冰河技术 写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行 ...

  9. 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!

    写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...

最新文章

  1. 对分组交换(packet switching)高效迅速灵活可靠四个优点的理解
  2. BZOJ2002 [HNOI2010] 弹飞绵羊
  3. 使用append之后数组维度消失_JAVA魅力之神奇的数组带给你不一样的乐趣
  4. c语言判断字符串中是否包含非数字,【新手】【求思路】如何判断用户输入的字符串中是否含有非数字?...
  5. python做视频抽帧图_Python提取视频中图片的示例(按帧、按秒)
  6. 3文字怎么断行_Word闹鬼,行首出现删不掉的空格怎么办?
  7. 消防信号总线原理_消防设施操作员关键技能之八:能通过总线式消防联动控制器启动警报等装置...
  8. C语言 函数指针一(函数指针的定义)
  9. 一起学Android之Intent
  10. html ui 下拉列表,html - 如何给样式Material-ui选择字段下拉菜单?
  11. 软考软件测评师知识点总结
  12. python中3个单引号,Pyhton3中单引号、双引号、三个引号的用法和区别
  13. 数字签名和电子签名有什么不一样?
  14. vue将文件流转成xlsx文件
  15. 1-MATLAB APP Design-图像的输入与输出
  16. 算法与数据结构实验题 10.23 寡人的难题
  17. 如何构建一个基于IEC61499 的“云化PLC“
  18. 如何在 R 中使用 tabulate() 和table() 函数计算整数出现次数
  19. C# 超市管理系统源码
  20. java屏幕锁定_Java android FCM,当应用程序最小化或屏幕锁定时我听不到声音和颤音...

热门文章

  1. 音视频技术开发周刊 70期
  2. Java多线程之CyclicBarrier用法
  3. Java多线程之线程虚假唤醒
  4. ./ffmpeg: error while loading shared libraries: libx264.so.138: cannot open shared object file: No s
  5. Spark没有读取HDFS文件的方法?那textFile是怎么读的?
  6. 绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
  7. 从另一个角度理解分布式系统与CAP定理
  8. leetcode 1306. Jump Game III | 1306. 跳跃游戏 III(BFS)
  9. 数据结构:二叉查找树 BST 平均查找长度 ASL 的计算
  10. CentOS7升级Python2.7.5至2.7.13版本