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. 百度编辑器(ueditor)@功能之获取坐标
  2. python的官方网站地址是什么-规范化Django/Python中的街道地址
  3. vue-自定义组件传值
  4. mediumtext和string转换_数据类型 - 字符串类型 - 《TiDB v3.0 用户文档》 - 书栈网 · BookStack...
  5. Netbeans搭建Android环境
  6. C++的#include_next
  7. undefined reference to `std::cout'等错误
  8. 用程序解决所有文件的格式转换
  9. oracle jinitiator版本太旧,Oracle Jinitiator 版本太旧或过低怎么办
  10. 使用arguments对象模拟函数重载
  11. leetcode 221. Maximal Square 求一个数组中由1组成的最大的正方形面积 ---------- java...
  12. CS224N刷题——Assignment2.3_RNN:Language Modeling
  13. 计算机怎么新建word文档,右键新建没有word文档怎么办?Win10新建word文档的方法...
  14. jspservlet面试题经典
  15. beanshell字符串替换_Beanshell语法
  16. 通达OA二次开发手册V12
  17. 解决 MDK 5 无法生成 .axf 文件的问题
  18. PT-100系列 铂电阻温度传感器
  19. 练习一万小时;2000-5000 小时计划和建议;现在开始!---读《异类》后刚好遇到的一篇文章
  20. 大数据查询语句SQL

热门文章

  1. Python中的高阶变量
  2. 探索多媒体开发最新最佳实践(内附资料下载)
  3. 万字长文助你上手软件领域驱动设计 DDD
  4. Web内核微信小程序框架实践
  5. 胡珀:从危到机,AI 时代下的安全挑战
  6. va_list/va_start/va_arg/va_end深入分析
  7. 时光机穿梭---工作区和暂存区
  8. 人脸检测与识别年度进展概述
  9. java基础---File类
  10. leetcode 790. Domino and Tromino Tiling | 790. 多米诺和托米诺平铺(暴力递归->DP)