NGINX优化之路(二)WEB安全篇
一、Nginx gzip 压缩的优点
1.提升网站用户体验:由于发给用户的内容小了,用户访问单位大小的页面就快了,用户体验度提升。
2.节约网站带宽成本,由于数据是压缩传输的,此举节省了网站的带宽流量成本,压缩时会稍微消耗一些CPU资源,这个可以抵消。此功能既能让用户体验增强,公司也少花钱。对于几乎所有的Web服务来说,这是一个非常重要的功能,当然Apache服务也有此功能。
3.按照需求进行选择要压缩的对象
1、纯文本内容压缩比很高,因此纯文本内容是最好压缩,例如:html、js、css、xml、shtml等格式的文件
2、被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩可能反而变大。
3、图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多数都是经历压缩的,如果再压缩很坑不会减小或减少很少,或者可能增加。而在压缩时还会消耗大量的CPU、内存资源
gzip on; #开启gzip压缩功能 gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从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,目前大部分浏览器已经支持GZIP压缩,使用默认即可。 gzip_comp_level 2; #压缩比率,用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也消耗CPU资源 gzip_types text/css text/xml application/javascript; #用来指定压缩的类型,“text/html”类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型。 gzip_vary on; #vary hear支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用缓存经过Nginx压缩的数据。 配置在http标签端 http{ gzip on; gzip_min_length 1k; gzip_buffers 4 32k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/css text/xml application/javascript; gzip_vary on; }
二、配置Nginx expires缓存实现性能优化,当然httpd对应也有此功能
根据文件扩展名进行判断,添加expires功能范例。 location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 3650d;
三、业内知名网站缓存时间参考
企业网站缓存日期曾经的案例参考
若企业的业务和访问量不同,那么网站的缓存期时间设置也是不同的,比如:
a.51CTP:1周
b.sina:15天
c.京东:25年
d.淘宝:10年
**当然有些东西是不能缓存的,比如广告,这样就不能实现立体控制了。
Nginx日志相关的,很多公司都有ELK日志分析系统,有完整的一套基于日志做的安全分析、故障展示、告警、审计等ELK—Nginx配置实例
四、Nginx防止盗链
解决方案:
第一,对IDC及CDN带宽做监控报警。
第二,作为高级运维或者运维经理,每天上班的重要任务,就是经常查看网站流量图,关注流量变化,关注异常流量
第三,对访问日志做分析,对于异常流量迅速定位,并制定完善的响应处理机制,基准线等。
五、常见攻击应对方法及流量增大原因
常见问题
IDC带宽被占满的原因很多,常见的有:
a.真实遭受DDOS攻击。
b.内部服务器中毒,大量外发流量。
c.网站元素(如图片)被盗连,在门户页面被推广导致大量流量产生(接警3次以上)
d.合作公司来抓数据,如:对合作单位提供了API数据接口
要想防护好DDOS:
知己知彼,百战不殆,这永远是IT行业的名言
1、要想防护DDOS,就必须要了解DDOS技术
2、对网站进行DDOS压力测试
3、选择大牌国内国外的知名云服务商,例如:阿里、×××、腾讯云、亚马逊等
4、网站架构尽量不能出现单节点,集群架构
5、系统(包括web,db)自身优化及安全配置,不要动不动就配置65535
6、预留服务器空闲出30%-40%以上流量的突发情况的资源
7、网站架构优化、弹性扩展
8、尽量将95%以上的内容放在CDN上
9.智能DNS调度系统,根据监控数据,进行智能的分流
10.waf自动阻断、防火墙、公司有资本的情况下,可以考虑构建安全体系等如主动防御体系和被动防御体系等,主动的、例如主动测试探测器,威胁情报系统、蜜罐系统等
11.保留各种攻击证据,日志,最好有一套完整的审计系统,监控系统敏感文件,基于日志做安全告警及ELK展示,报警,大规模攻击都不是无目的的。
12.当发生DDOS攻击问题时,不要自己死扛,要第一时间主动和领导汇报,寻求更多的资源协助才是道理。
六、防爬虫优化
Robots协议(也成为爬虫协议、机器人协议等)的全称是网络爬虫排除标准(Robots Exclusin Protocol)网站通过Robots协议告诉引擎那个页面可以抓取,那些页面不能抓取。
Nginx防爬虫优化
我们可以根据客户端的user-agents信息,轻松地阻止爬虫取我们的网站防爬虫
范例:阻止下载协议代理
## Block download agents ## if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } 说明:如果用户匹配了if后面的客户端(例如wget)就返回403 范例:添加内容防止N多爬虫代理访问网站 if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot") { return 403; } 测试禁止不同的浏览器软件访问 if ($http_user_agent ~* "Firefox|MSIE") { rewrite ^(.*) http://blog.etiantian.org/$1 permanent; } 如果浏览器为Firefox或者IE就会跳转到http:blog.etiantian.org 提示: 这里主要用了$remote_addr这个函数在记录。 查看更多函数 [root@web02 conf]# cat fastcgi_params fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; 利用Nginx限制HTTP的请求方法 HTTP最常用的方法为GET/POST,我们可以通过Nginx限制http请求的方法来达到提升服务器安全的目的, 例如,让HTTP只能使用GET、HEAD和POST方法配置如下: #Only allow these request methods if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; } #Do not accept DELETE, SEARCH and other methods 设置对应的用户相关权限,这样一旦程序有漏洞,木马就有可能被上传到服务器挂载的对应存储服务器的目录里,虽然我们也做了禁止PHP、SH、PL、PY等扩展名的解析限制,但是还是会遗漏一些我们想不到的可执行文件。对于这种情况,该怎么办捏?事实上,还可以通过限制上传服务器的web服务(可以具体到文件)使用GET方法,来达到防治用户通过上传服务器访问存储内容,让访问存储渠道只能从静态或图片服务器入口进入。例如,在上传服务器上限制HTTP的GET方法的配置如下: ## Only allow GET request methods ## if ($request_method ~* ^(GET)$ ) { return 501; }