深度优化LNMP之Nginx [2]

来源:互联网 发布:素描入门 知乎 编辑:程序博客网 时间:2024/05/21 12:43

配置Nginx gzip 压缩实现性能优化

1.Nginx gzip压缩功能介绍   
    Nginx gzuo压缩模块提供了压缩文件内容的功能,用户请求的内容在发送出用客户端之前,Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快了数据传输效率,提升了用户访问体验。
2.Nginx gzip 压缩的优点
1.提升网站用户体验:由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验提升了,网站口碑就好了。
2.节约网站带宽成本,由于数据是压缩传输的,因此,此举节省了网站的带宽流量成本,不过压缩会稍微消耗一些CPU资源,这个一般可以忽略。此功能既能让用户体验增强,公司也少花钱。对于几乎所有的Web服务来说,这是一个非常重要的功能,Apache服务也由此功能。
3.需要和不需要压缩的对象
1、纯文本内容压缩比很高,因此纯文本内容是最好压缩,例如:html、js、css、xml、shtml等格式的文件
2、被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩可能反而变大。
3、图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多数都是经历压缩的,如果再压缩很坑不会减小或减少很少,或者可能增加。而在压缩时还会消耗大量的CPU、内存资源
4、参数介绍及配置说明
    此压缩功能很类似早起的Apache服务的mod_defalate压缩功能,Nginx的gzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装。
参数说明如下:
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服务器。
并在360|火狐|谷歌  等浏览器中安装插件Firebug和YSlow 进行查看页面压缩率
例如:没有制作压缩图片
 制作后
 

配置Nginx expires 缓存实现性能优化

1.Nginx expires 功能介绍
    简单地说,Nginx expires的功能就是为用户访问的网站内容设定一个国企时间,当用户第一次访问到这些内容时,会把这样内容存储在用户浏览器本地,这样用户第二次及此后继续访问网站,浏览器会检查加载缓存在用户浏览器本地的内容,就不会去服务器下载了。直到缓存的内容过期或被清除为止。
    深入理解,expires的功能就是允许通过Nginx 配置文件控制HTTP的“Expires”和“Cache-Contorl”响应头部内容,告诉客户端刘琦是否缓存和缓存多久以内访问的内容。这个expires模块控制Nginx 服务器应答时Expires头内容和Cache-Control头的max-age指定。
    这些HTTP头向客户端表名了内容的有效性和持久性。如果客户端本地有内容缓存,则内容就可以从缓存(除非已经过期)而不是从服务器读取,然后客户端会检查缓存中的副本。
2.Nginx expires作用介绍
    在网站的开发和运营中,对于图片、视频、css、js等网站元素的更改机会较少,特别是图片,这时可以将图片设置在客户端浏览器本地缓存365天或3650天,而降css、js、html等代码缓存10~30天,这样用户第一次打开页面后,会在本地的浏览器按照过期日期缓存响应的内容,下次用户再打开类似页面,重复的元素就无需下载了,从而加快了用户访问速度,由于用户的访问请求和数据减少了,因此节省了服务器端大量的带宽。此功能和apache的expire相似。
3.Nginx expires 功能优点
1.Expires可以降低网站的带宽,节约成本。
2.加快用户访问网站的速度,提升了用户访问体验。
3.服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低,甚至可以解决人力成本。
    对于几乎所有Web来说,这是非常重要的功能之一,Apache服务也由此功能。
4. Nginx expires 配置详解
1)根据文件扩展名进行判断,添加expires功能范例。
    location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$
       {
          expires 3650d;
      }
该范例的意思是当前用户访问网站URL结尾的文件扩展名为上述指定的各种类型的图片时,设置缓存3650天,即10年。
提示:配置可以放在server标签,也可以放在http标签下配置
 
例如:
[root@web02 /]# curl -I www.jd.com
HTTP/1.1 200 OK
Server: jdws
Date: Mon, 25 Jul 2016 15:15:47 GMT
Content-Type: text/html; charset=gbk
Content-Length: 197220
Connection: keep-alive
Vary: Accept-Encoding
Expires: Mon, 25 Jul 2016 15:15:38 GMT #告诉用户什么时候过期
Cache-Control: max-age=20
ser: 6.158
Via: BJ-M-YZ-NX-74(HIT), http/1.1 BJ-UNI-1-JCS-117 ( [cRs f ])
Age: 16
2)根据URI中的路径(目录)进行判断,添加expires功能范例。
location ~^/(images|javascript|js|css|flash|media|static)/ {
  expires 360d;
}
意思是当用户访问URI中包含上述路径(例:images、js、css,这些在服务端是程序目录)时,把访问的内容设置缓存360天,即1年。如果要想缓存30天,设置30d即可。
HTTP/1.1 200 OK
Server: JDWS
Date: Mon, 25 Jul 2016 16:00:32 GMT
Content-Type: text/html; charset=gbk
Vary: Accept-Encoding
Expires: Mon, 25 Jul 2016 16:00:48 GMT    #<==缓存的过期时间
Cache-Control: max-age=20                      #<==缓存的总时间按秒,单位
ser: 130.29
Via: BJ-Y-NX-104(HIT), http/1.1 HK-1-JCS-70 ( [cRs f ])
Age: 14
Content-Length: 197220
5.Nginx expires功能缺点及解决方法
    当网站被缓存的页面或数据更新了,此时用户看到的可能还是旧的已经缓存的内容,这样会影响用户体验。
    对经常需要变动的图片等文件,可以缩短对象缓存时间,例如:谷歌和百度的首页图片经常根据不同的日期换成一些节日的图,所以这里可以将图片设置为缓存期为1天。
    当网站改版或更新内容时,可以在服务器将缓存的对象改名(网站代码程序)。
1. 对于网站的图片、软件,一般不会被用户直接修改,用户层面上的修改图片,实际上是重新传到服务器,虽然内容一样但是是一个新的图片名了
2.网站改版升级会修改JS、CSS元素,若改版的时候对这些元素该了名,会使得前端的CDN以及用户需要重新缓存内容。
6.企业网站缓存日期曾经的案例参考
    若企业的业务和访问量不同,那么网站的缓存期时间设置也是不同的,比如:
a、51CTP:1周
b、sina:15天
c、京东:25年
d、淘宝:10年
7.企业网站有可能不希望被缓存的内容
1.广告图片,用于广告服务,都缓存了就不好控制展示了。
2.网站流量统计工具(js代码)都缓存了流量统计就不准了
3.更新很频繁的文件(google的logo),如果按天,缓存效果还是显著的。

Nginx日志相关优化与安装

1.编写脚本脚本实现Nginx access日志轮询
    Nginx目前没有类似Apache的通过cronlog或者rotatelog对日志分割处理的能力,但是,运维人员可以通过利用脚本开发、Nginx的信号控制功能或reload重新加载,来实现日志自动切割,轮询。
(1)配置日志切割脚本
[root@web02 /]# mkdir /server/scripts/ -p
[root@web02 /]# cd /server/scripts/
[root@web02 scripts]# cat cut_nginx_log.sh
cd /application/nginx/logs && \
/bin/mv www_access.log www_access_$(data +%F -d -1dy).log  #将日志按日志改成前一天的名称
/application/nginx/sbin/nginx -s reload         #重新加载nginx使得重新生成访问日志文件
提示:实际上脚本的功能很简单,就是改名日志,然后加载nginx,重新生成文件记录日志。
(2)将这段脚本保存后加入到定时任务,设置每天凌晨0点进行切割日志
[root@web02 scripts]# crontab -e
###cut nginx access log
00 00 * * * /bin/sh /server/scripts/cut_nginx.log.sh >/dev/null 2>&1
 解释:每天0点执行cut_nginx_log.sh脚本,将脚本的输出重定向到空。
2.不记录不需要的访问日志
    对于负载均衡器健康检查节点或某些特定文件(比如图片、js、css)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的。而且日志写入频繁会大量消耗磁盘I/O,降低服务的性能。
具体配置如下:
     location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)?$ {
        access_log off; 
}
这里用location标签匹配不记录日志的元素扩展名,然后关掉了日志。
3.访问日志的权限设置
加入日志目录为/app/logs,则授权方法为:
chown -R root.root /app/logs/
chmod -R 700 /app/logs
    不需要在日志目录上给nginx用户读或写的许可。

Nginx站点目录及文件URL访问控制

1.根据扩展名限制程序和文件访问
    Web2.0时代,绝大多数网站都是以用户为中心,例如:BBS、blog、sns产品,这几个产品共同特点就是不但允许用户发布内容到服务器,还允许用户发图片甚至附件到服务器,由于为用户打开了上传的功能,因为给服务器带来了很大的安全风险。
    下面将利用Nginx配置禁止访问上传资源目录下的PHP、shell、perl、Python程序文件,这样用户即使上传了木马文件也没法去执行,从而加强了网站的安全。
配置Nginx,限制禁止解析指定目录下的制定程序。
 location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)
        { 
       deny all; 
        } 
location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)
        { 
           deny all; 
        } 
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)
    { 
        deny all; 
    } 
Nginx下配置禁止访问*.txt文件
location ~*\.(txt|doc)${
    if (-f $request_filename) {
    root /data/www/www;
    #rewrite ....可以重定向某个URL
    break;
  }
}
location ~*\.(txt|doc)${
    root /data/www/www;
    deny all;
}
对上述限制需要卸载php 匹配的前面
 对目录访问进行设置
单目录
 location ~ ^/(static)/ {
        deny all;
}
location ~ ^/static {
        deny all;
}
多目录
 location ~ ^/(static)/ {
        deny all;
}
范例:禁止访问目录并返回指定的http状态码
location /admin/ { return 404; }
0 0
原创粉丝点击