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
访问测试一下:
访问不到是正常的
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、访问测试
可以访问到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
再次访问测试
访问不到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能访问,或者不能访问