Nginx相关性能优化

Posted 小白的成功进阶之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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  65535

umilit -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,来获取源IP
			proxy_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相关性能优化的主要内容,如果未能解决你的问题,请参考以下文章

Nginx性能优化

Nginx 性能优化(配置文件详解)

Nginx性能优化技巧

Nginx性能优化

linux学习:Nginx--常见功能配置片段与优化-06

:微信微博等分享,国际化,前端性能优化,nginx服务器部署