初识Nginx的性能安全优化
发表于 2019-06-20 19:35
最近,我的项目已经上线了官方网站。与大多数Web服务网站一样,我的项目的网站使用了LNMP (Linux、Nginx、Mysql、PHP)架构。Nginx的作用是将静态资源解析返回给用户;动态资源通过FastCGI接口发送到PHP引擎服务,PHP进行读库解析,并最终让Nginx服务把获取的数据返给用户。
由于本网站的主要作用是帮助运营商推广产品,除了最基本的网站页面测试外,对网站页面的性能和合理的服务器资源配置也是重要的要求。一方面,我们可以通过优化浏览器渲染、HTML文件格式、文本资源压缩等来提高页面性能。另一方面,我们可以考虑优化Nginx配置,以增强其传输和并发支持能力。
方案一:配置Nginx gzip压缩提升性能
Nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到客户端之前,Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。
Nginx gzip压缩特点
提升网站用户体验:发送给用户的内容小了,用户访问单位大小的页面就加快了,用户体验也就随之提升。
节约网站带宽成本:数据是压缩传输的,因此节省了网站的带宽流量成本,不过压缩时会稍微消耗一些CPU资源,这个一般可以忽略。
对应的参数配置解释如下:
gzip on;
开启gzip压缩功能。
gzip_min_length lk;
设置允许压缩的页面最小字节数,页面字节数从 header头的 Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K,
如果小于1K可能会越压越大。
gzip_buffers 4 16k;
压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1;
压缩版本(默认1.1,前端为 squid2.5时使用1.0),用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持G2IP解压,使用默认即可。
gzip_comp_level 2;
压缩比率。用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml applicat ion/xml+rss;
用来指定压缩的类型,除了“ text/html” 之外,还允许对指定的MIME类型进行gzipping响应。特殊值“*”匹配任何MIME类型(0.8.29)。
text/html始终压缩具有“ ”类型的响应。
gzip_vary on;
vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用Squid缓存经过 Nginx压缩的数据。
实际参数优化配置如下:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_comp_level 5;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
gzip_vary on;
方案二:开启高效文件传输模式
Nginx实际上有一个有效的模式。像显卡和cpu一样,我们可以使用超频来榨干它们的性能。我们也可以打开一些隐藏模式来提升Nginx的工作效率。
sendfile参数用于启用有效的文件传输。同时,将tcp_nopush和tcp_nodelay两个命令设置为on,可以防止网络和磁盘IO阻塞,实际提高性能。
sendfile on ;
tcp_nopush on;
tcp_nodelay on;
tcp_nopush 参数用于激活 Linux 上的 TCP_CORK socket 选项,此选项仅仅当开启 sendfile 时才生效,tcp_nopush 参数可以允许把 http response header 和文件的开始部分放在一个文件里发布,以减少网络报文段的数量
方案三:控制Nginx并发连接数量
我们可以通过限制每个key值的连接数,尤其是控制单个IP可连接数。此方法在服务器下载,限制每次访问下载目录的连接数尤其有效。对应配置为nginx_http_limit_conn_module
。
实际配置文件如下:
[root@Nginx conf]# cat nginx.conf
worker_processes 4;
events {
worker_connections 20480;
}
http {
include mime.types;
server_tokens on;
sendfile on;
keepalive_timeout 65;
default_type application/octet-stream;
limit_conn_zone $binary_remove_addr zone=addr:10m; # 添加limit_conn_zone参数
server {
listen 80;
servername www.sogou.com;
location / {
root html;
index index.html index.htm;
limit_conn addr 1; # 设置单IP连接数为1
}
}
}
在客户端使用ab测试工具进行测试:
ab -c 2 -n 10 http://127.0.0.1/
模拟并发连接2,访问服务器10次,可看到状态码200和503间隔是1:1 说明nginx已经做了并发连接的限制,对超时连接做出了503响应。
结束语:
在保证基本功能的前提下,优化前后端性能具有重要意义;产品的基础是用户体验。如果脱离了快速高效的用户体验,设计一个漂亮的界面是没有意义的。因此,当我们在做需求时,除了基本的“测试保证”之外,我们还需要了解架构实现细节,优化安全性和效率,有效地度量一个可用的、稳定的、高效的在线产品。
评论 (0人参与)
最新评论