Nginx 性能优化与安全
系统参数优化
修改说明:
- 文件句柄,Linux一切皆文件,文件句柄可以理解为就是一个索引,文件句柄会随着我们进程的调用频繁增加,系统默认文件句柄是有限制的,不能让一个进程无限的调用,所以我们需要限制每个 进程和每个服务使用多大的文件句柄,文件句柄也是必须要调整的优化参数。
- 在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。 我来解释下这个场景。主动正常关闭TCP连接,都会出现TIMEWAIT。
CPU亲和配置:
cpu的亲和能够使nginx对于不同的work工作进程绑定到不同的cpu上面去。就能够减少在work间不断切换cpu,把进程通常不会在处理器之间频繁迁移,进程迁移的频率小,来减少性能损耗。
优化事件处理模型:
nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。要根据系统类型不同选择不同的事务处理模型,我们使用的是Centos,因此将nginx的事件处理模型调整为epoll模型。
:information_source:说明:在不指定事件处理模型时,nginx默认会自动的选择最佳的事件处理模型服务。
设置work_connections 连接数:
会话保持时间优化:
proxy超时设置:
作为代理服务器优化
通常nginx作为代理服务,负责转发用户的请求,那么在转发的过程中建议开启HTTP长连接,用于减少握手次数,降低服务器损耗。
配置nginx使用长连接示例配置文件:
静态资源优化
静态资源类型 | 种类 |
---|
浏览器端渲染 | HTML、CSS、JS |
图片 | JPEG GIF PNG |
视频 | FLV MPEG |
文件 | TXT 等任意下载文件 |
浏览器缓存过期机制:
- 浏览器发送请求前,根据请求头的expires和cache-control判断是否命中(包括是否过期)强缓存策略,如果命中,直接从缓存获取资源,并不会发送请求。如果没有命中,则进入下一步。
- 没有命中强缓存规则,浏览器会发送请求,根据请求头的last-modified和etag判断是否命中协商缓存,如果命中,直接从缓存获取资源。如果没有命中,则进入下一步。
- 如果前两步都没有命中,则直接从服务端获取资源。
专业术语说明:
Last-Modified
:服务器上文件的最后修改时间
Etag
:文件标识 Expires:本地缓存目录中,文件过期的时间(由服务器指定具体的时间)
Cache-control
:本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间)
示例配置文件:
静态文件读取优化
使用nginx作为静态资源服务时,通过配置sendfile可以有效提高文件读取效率, 设置为on表示启动高效传输文件的模式。sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据。如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到cache,再从cache读取到用户空间的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到tcp socket。开启这个参数后可以让数据不用经过用户buffer。
开启sendfile
功能。sendfile
功能可以提供Nginx
静态资源的托管效率。sendfile
是一个系统调用,直接在内核中完成文件发送,不需要先read
再write
,没有上下文切换的开销。
在sendfile
指令开启的情况下,开启tcp_nopush
。启用了这个指令后,数据包会被累积到一定大小才发送,减少额外的开销,提升了网络效率。
:information_source: 这个指令只有在sendfile
为on
的时候才起作用
这个指令的目的就是尽快发送数据。Nginx
只会针对keep-alive
状态的TCP
连接启用tcp_nodelay
。tcp_nopush
和tcp_nodelay
结合在一起使用的时候,会先填满包,然后再尽快发送。
静态资源压缩
Nginx 将响应报文发送至客户端之前可以启用压缩功能,这能够有效地节约带宽,并提高响应至客户端的速度。但是需要消耗一定的服务器性能。压缩后的资源在客户端浏览器会自动识别并解压。
开启或关闭gzip
在gzip
指令开启的情况下,有很多其它辅助的指令对压缩的特性进行设置。
设置压缩类型
设置压缩比
设置在哪个版本的http协议下才会对资源进行压缩
我们也可以使用http_gzip_static_module
模块来开启预读gzip
数据的功能。这个模块就是在获取资源的时候预先读取被压缩的资源,如果压缩资源存在,直接读取。否则就读取源文件然后压缩返回。
示例配置文件:
防盗链
使用内置模块
防盗链的目的就是防止资源被盗用。防盗链设置思路,主要是针对客户端请求过程中所携带的一些Header信息来验证请求的合法性,比如客户端在请求的过程中都会携带referer
信息。优点是规则简单,配置和使用都很方便,缺点是防盗链所依赖的Referer验证信息是可以伪造的,所以通过referer信息防盗链并非100%可靠(毕竟有能够伪造请求头,例如curl -e "https://www.baidu.com ..."
),但是他能够限制大部分的盗链情况。
示例配置文件:
使用第三方模块
。。。
跨域访问
何为同源策略:
同源策略是一个安全策略。同源,指的是协议,域名,端口相同。浏览器处于安全方面的考虑,只允许本域名下的接口交互,不同源的客户端脚本,在没有明确授权的情况下,不能读写对方的资源。
何为跨域:
CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource sharing)。即从一个域名的网页去请求另一个域名的资源。本质上对于此类请求,只要协议、域名、端口有任何一个的不同,就被当作是跨域,即都被当成不同源。
通常基于安全考虑,Nginx启用了同源策略,即限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。
但若同一个公司内部存在多个不同的子域,子域之间需要互访,此时可通过跨域进行实现。跨域可通过JSONP和CORS进行实现。
那Nginx语序跨站访问与浏览器有什么关系呢,因为浏览器会读取Access-Control-Allow-Origin
的头信息,如果服务端允许,则浏览器不会进行拦截。
示例配置文件:
禁止IP直接访问
关闭空主机头,防止未备案的域名指向。
示例配置文件:
附录:示例完整通用配置
参考链接
文章内容收集于网络。