nginx优化详解(2)

1、http主体优化

1.1、开启高效传输模式

 [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

 http {
     include       mime.types;        #媒体类型(主配置文件加载从。。)
     default_type  application/octet-stream;  #默认媒体类型足够
     sendfile        on;
     tcp_nopush     on;           #这一行取消注释即可

           sendfile        on; 

开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。

tcp_nopush     on;

必须在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量

连接超时时间

 [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

     keepalive_timeout  65;   #找到这一行
     tcp_nodelay on;          #添加以下4行
     client_header_timeout 15;
     client_body_timeout 15;
     send_timeout 15;

keepalived_timeout : 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接

tcp_nodelay:也是防止网络阻塞,不过要包涵在keepalived参数才有效

client_header_timeout : 客户端请求头读取超时时间,如果超过设个时间没有发送任何数据,nginx将返回request time out的错误

client_body_timeout : 客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错误提示

send_timeout  响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接

 1.2、文件上传大小限制

nginx可以修改上传文件大小限制

 [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

  client_max_body_size 10m;

1.3、 gzip调优

使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点

Nginx启用压缩功能需要你来ngx_http_gzip_module模块,apache使用的是mod_deflate

一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!

 [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

     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;	

参数解释:

gzip on;        #开启压缩功能

gzip_min_length  1k;    #设置允许压缩的页面最小字节数,页面字节数从header头Content-Length(内容长度)中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。

gzip_buffers     4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。

gzip_http_version 1.1; #压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可

gzip_comp_level 9;  #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。

gzip_types  text/css text/xml application/javascript;   #用来指定压缩的类型,‘text/html’类型总是会被压缩。

gzip_vary on;   #vary header支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据

1.4、ServerName和 location匹配

1.4.1、ServerName匹配

1:精确匹配:www.test.com
2:左侧通配符匹配:*.test.com
3:右侧通配符匹配:www.test.*
4:正则表达式:~ ^.*\.test\.com$
5:default_server
6、服务IP地址

1.4.2、 location匹配

Nginx的location通过指定模式来与客户端请求的URI相匹配,location可以把网站的不同部分,定位到不同的处理方式上,基本语法如下:

location [=|~|~*|^~] pattern {

……

}  

注:中括号中为修饰符,即指令模式。Pattern为url匹配模式

= 表示做精确匹配,即要求请求的地址和匹配路径完全相同

~:正则匹配,区分大小写

~*:正则匹配”不区分大小写

注:nginx支持正则匹配,波浪号(~)表示匹配路径是正则表达式,加上*变成~*后表示大小写不敏感

^~:指令用于字符前缀匹配。例如:location ^~ /images/ {…}

 1.4.3、精确匹配

= 用于精确字符匹配(模式),不能使用正则,区分大小写。

例1:

精准匹配,浏览器输入ip地址/text.html,定位到服务器/var/www/html/text.html文件

location =/  {

  root /var/www/html;  

  index text.html;

}

例2:

 匹配命中的location,使用rewrite指令,用于转发。可以理解命中了就重定向到rewrite后面的url即可。

 location = /demo {   

     rewrite ^ http://www.baidu.com;

 }

 上述的配置表示只有访问 http://ip地址/demo 这样的url,才能跳转到baidu的页面。除此之外的任何地址都无法访问,那怕是访问http://IP/demo/这个地址也不行。因为url匹配模式是/demo。

 1.4.4、前缀匹配

^~指令用于字符前缀匹配,和=精确匹配一样,也是用于字符确定的匹配,不能使用正则且区分大小写。和=不同的在于,^~指令下,访问的url无需url匹配模式一模一样,只需要其开头前缀和url匹配模式一样即可。

location ^~ /demo {   

    rewrite ^ http://baidu.com;

}

对于该模式(/demo),访问下列的地址都能匹配:

http://ip/demo

http://ip/demo/

http://ip/demo/aaa

http://ip/demo/aaa/bbb

http://ip/demo/AAA

http://ip/demoaaa

http://ip/demo.aaa

只需要以/demo为前缀开头的url都能匹配。与该模式后的是否大小写无关。

^~不支持正则。模式/demo$中的$并不代表字符模式结束,而是一个是实实在在的$,只有访问/demo$开头的url才能匹配,http://ip/demo则不再匹配。

模式/[0-9]emo也不代表正则中的http://ip/0emo、http://ip/5emo之类,只有访问以 /[0-9]emo开头url才行,例如http://ip/[0-9]emo或http://ip/[0-9]emo/aaa

前缀匹配通常用于匹配文件夹,如配置静态文件。

location ^~ /images/ {

}

1.4.5、正则匹配

nginx支持正则匹配。所使用的指令是~和~*,前者表示使用正则,区分大小写,后者表示使用正则,不区分大小写。

例1:匹配任何以 gif、jpg 或 jpeg 结尾的请求。

location ~* \.(gif|jpg|swf)$ {

}

例2:

location ~ /[0-9]emo {   

    rewrite ^ http://baidu.com;

}

对于上述的模式,可以匹配的url如下:

    http://192.168.33.10/5emo

    http://192.168.33.10/9emo

    http://192.168.33.10/5emo/aaa

    http://192.168.33.10/5emo/AAA

    http://192.168.33.10/5emoaaa

只要是以正则表达式/[0-9]emo匹配的字符开头的url,都能匹配。

使用~*则不区分大小写

1.4.6、正常匹配

正常匹配的指令为空,即没有指定匹配指令的即为正常匹配。其形式类似 /XXX/YYY.ZZZ正常匹配中的url匹配模式可以使用正则,不区分大小写。

location /demo {   

    rewrite ^ http://baidu.com;

}

上述模式指的是匹配/demo的url,下面的都能匹配 :

    http://192.168.11.22/demo

    http://192.168.11.22/demo/

    http://192.168.11.22/demo/aaa

    http://192.168.11.22/demo/aaa/bbb

    http://192.168.11.22/demo/AAA

    http://192.168.11.22/demoaaa

    http://192.168.11.22/demo.aaa

正常匹配和前缀匹配的差别在于优先级。前缀的优先级高于正常匹配。

1.4.7、 全匹配

全匹配与正常匹配一样,没有匹配指令,匹配的url模式仅一个斜杠/

location / {   

    rewrite ^ http://baidu.com;

}

匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和一些较长的字符串将被优先查询匹配。

 1.4.8、命名匹配

命名匹配指的是使用@绑定一个模式,类似变量替换的用法。

error_page 404 = @not_found;

location @not_found {     

    rewrite ^ http://baidu.com;

}

上述的作用是如果访问没有匹配的url会触发404指令,然后就匹配到@not_found 这个 location上。

1.4.9、匹配优先级 

nginx的匹配优先级遵循一个大原则一个小细节

大原则是关于匹配模式的优先级:

精确匹配  >  前缀匹配  >  正则匹配  > 正常匹配  > 全匹配

小细节则是同级的优先级:

面对一个location,先判断是否是正则匹配,如果是正则匹配,遇到匹配的模式,则命中。如果不是正则,则把匹配的模式放到一边,继续往下阅读配置,阅读完毕所有的匹配模式,查看哪一种的匹配模式更长,则是最终命中的模式。

同级的匹配需要注意两个关键细节,是否是正则匹配,是否是最长匹配

1.5、 expires缓存调优

 缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在客户浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的扩展名列出来!Expires缓存配置在server字段里面。

1.5.1、expire功能优点

(1)expires可以降低网站购买的带宽,节约成本

(2)同时提升用户访问体验

(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。

1.5.2、 expire功能缺点

被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。

解决办法: 

第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天

第二个 对缓存的对象改名

a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已

b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。

网站不希望被缓存的内容

1)广告图片

2)网站流量统计工具

3)更新频繁的文件(baidu的logo)

 1.5.3、以扩展名区分

 [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
               {
               expires      365d;
               }
        location ~ .*\.(js|css)?$
               {
               expires      30d;
               }

1.5.4、 对目录及其进行判断

        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
              expires 360d;
              }
        location ~ (robots.txt) {
              expires 7d;
              break;
              }

 注:break用于中断当前相同作用域中的Nginx配置,和循环语句中的break语法类似,可以在server块和location以及if块中使用。

 1.6、Fastcgi调优

Cache:写入缓存区

Buffer:读取缓存区

Fastcgi是静态服务和动态服务的一个接口

 fastcgi参数解释:

fastcgi_connect_timeout 300;    #指定连接到后端FastCGI的超时时间。

fastcgi_send_timeout 300;       #向FastCGI传送请求的超时时间。

fastcgi_read_timeout 300;       #指定接收FastCGI应答的超时时间。

fastcgi_buffer_size 64k;        #指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。

fastcgi_buffers 4 64k;  #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“8 32K”、“4 64k”等。

fastcgi_busy_buffers_size 128k; #建议设置为fastcgi_buffer的两倍,繁忙时候的buffer

fastcgi_temp_file_write_size 128k;  #在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502 Bad Gateway

fastcgi_temp_path #缓存临时目录

fastcgi_cache ngx_fcgi_cache; #表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误发生,但是开启缓存也可能会引起其他问题,要很据具体情况选择

fastcgi_cache_valid 200 302 1h; #用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合使用

fastcgi_cache_valid 301 1d;     #将301应答缓存一天

fastcgi_cache_valid any 1m;     #将其他应答缓存为1分钟

fastcgi_cache_min_uses 1;      #该指令用于设置经过多少次请求的相同URL将被缓存。

fastcgi_cache_key http://$host$request_uri; #该指令用来设置web缓存的Key值,nginx根据Key值md5哈希存储.一般根据$host(域名)、$request_uri(请求的路径)等变量组合成proxy_cache_key 。

fastcgi_pass #指定FastCGI服务器监听端口与地址。

fastcgi_cache_path            #定义缓存的路径

 2、日志切割优化

2.1、创建日志切割脚本

[root@cjq11 ~]# cd /usr/local/nginx/logs/

[root@cjq11 logs]# vim cut_nginx_log.sh  #日志切割脚本

#!/bin/bash
date=$(date +%F -d -1day)
cd /usr/local/nginx/logs
if [ ! -d cut ] ; then
        mkdir cut
fi
mv access.log cut/access_$(date +%F -d -1day).log
mv error.log cut/error_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
tar -jcvf cut/$date.tar.bz2 cut/*
rm -rf cut/access* && rm -rf cut/error*
find -type f -mtime +10 | xargs rm -rf

[root@cjq11 logs]# crontab -e

0 0 * * * /bin/sh /usr/local/nginx/logs/cut_nginx_log.sh >/dev/null 2>&1

[root@cjq11 logs]# chmod +x cut_nginx_log.sh  #添加可执行

2.2、 去掉不需要的日志统计

 健康检查的日志,不用输入到log中,因为这些日志没有意义,我们分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态码,在SEO中很重要,而且我们统计PV是页面计算,这些都没有意义,反而消耗了磁盘IO,降低了服务器性能,我们可以屏蔽这些如图片,js,css这些不宜变化的内容

 [root@cjq11 logs]# vim /usr/local/nginx/conf/nginx.conf

         location ~ .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
             access_log off;
         }

2.3、日志格式优化

 [root@cjq11 logs]# vim /usr/local/nginx/conf/nginx.conf

 找到以下几行去掉注释#

      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
  
      access_log  logs/access.log  main;

 注释:

1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;

2.$remote_user :用来记录客户端用户名称;

3.$time_local : 用来记录访问时间与时区;

4.$request : 用来记录请求的url与http协议;

5.$status : 用来记录请求状态;成功是200,

6.$body_bytes_sent :记录发送给客户端文件主体内容大小;

7.$http_referer :用来记录从那个页面链接访问过来的;

8.$http_user_agent :记录客户端浏览器的相关信息;

 3、目录文件访问控制

主要用在禁止目录下指定文件被访问,当然也可以禁止所有文件被访问!一般什么情况下用?比如是有存储共享,这些文件本来都只是一些下载资源文件,那么这些资源文件就不允许被执行,如sh,py,pl,php等等

3.1、禁止访问images下面的php程序文件

[root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

        location ~ ^/images/.*\.(php|php5|sh|py|pl)$ {
            deny all;
        }

             [root@cjq11 ~]# nginx -s reload

[root@cjq11 ~]# mkdir /usr/local/nginx/html/images

[root@cjq11 ~]# echo "<?php phpinfo(); ?>" > /usr/local/nginx/html/images/index.php

访问测试一下:

http://192.168.10.11/images/index.php

 访问不到是正常的

3.2、多个目录书写方法

[root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

        location ~ ^/images/(attachment|avatar)/.*\.(php|php5|sh|py|py)$ {
            deny all;
        }

3.3、配置nginx禁止访问*.txt文件

3.3.1、添加访问页面

[root@cjq11 ~]# echo "test" > /usr/local/nginx/html/test.txt

3.3.2、访问测试 

  http://192.168.10.11/test.txt

 可以访问到test

3.3.3、 配置规则,禁止访问txt

 [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

        location ~* \.(txt|doc)$ {
                if ( -f $request_filename) {
                  root /usr/local/nginx/html;
                } 
                deny all;
        }

[root@cjq11 ~]# nginx -s reload

 再次访问测试

   http://192.168.10.11/test.txt

访问不到test

3.3.4、 可以错误重定向到某一个URL

 [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

        location ~* \.(txt|doc)$ {
                if ( -f $request_filename) {
                  root /usr/local/nginx/html;
                }
                rewrite ^/(.*)$ http://www.baidu.com last;
        }

 3.3.5、对目录进行访问限制

 创建两个目录

             [root@cjq11 ~]# mkdir -p /usr/local/nginx/html/{aa,bb}

 目录写测试页面

[root@cjq11 ~]# echo 'aa' > /usr/local/nginx/html/aa/index.html

[root@cjq11 ~]# echo 'bb' > /usr/local/nginx/html/bb/index.html

配置目录拒绝访问

             [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

        location /aa/       { return 404 ; }
        location /bb/       { return 403 ; }

             [root@cjq11 ~]# nginx -s reload

访问测试

访问192.168.10.11/aa/index.html     结果为404

访问 192.168.10.11/bb/index.html    结果为430

3.3.6、对访问来源控制

             [root@cjq11 ~]# vim /usr/local/nginx/conf/nginx.conf

       location /aa/       {
                 allow 192.168.1.0/24; #允许1.0网段IP访问
                 deny all;
         }

[root@cjq11 ~]# nginx -s reload

 这里可以写IP地址指定某个IP能访问,或者不能访问

  • 46
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值