设为首页 收藏本站
查看: 1327|回复: 1

[经验分享] nginx的配置和优化(隐藏版本号、gzip、expires、防盗链......等)

  [复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-6-25 09:04:59 | 显示全部楼层 |阅读模式
Nginx配置和优化
1.隐藏版本号默认情况下,使用curl命令会把nginx的版本信息等获取到,如:
1
2
3
4
5
6
7
[iyunv@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server:nginx/1.6.3
Date: Wed, 24 Jun 2015 02:50:59 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.30



现在通过添加server_tokensoff参数隐藏版本号.在http{}模块中添加
1
2
3
4
http {
....
server_tokens off;
}



继续curl一下,发现Server:后边的nginx版本号已经没了
1
2
3
4
5
6
7
[iyunv@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server:nginx
Date: Wed, 24 Jun 2015 02:54:54 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.30



2.客户端curl某个页面,返回404在server模块中加入下面规则即可
1
2
3
if ($http_user_agent ~*"curl"){
            return 404;
        }



3.根据CPU核数进行nginx进程优化
1
2
3
4
5
6
7
8
9
10
11
12
13
四核cpu配置:
worker_processes    4;
worker_cpu_affinity 0001 0010 01001000;
八核cpu服务器参数配置:
worker_processes    8;
worker_cpu_affinity 0000000100000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_cpu_affinity 0001 0010 01001000 0001 0010 0100 1000;
官方文档说明
worker_processes    4;
worker_cpu_affinity 0001 0010 01001000;
binds each worker process to aseparate CPU, while
worker_processes    2;  4核2进程
worker_cpu_affinity 0101 1010;



4.调整nginx事件处理模型、客户端最大连接数、最大打开的文件数4.1 nginx 的连接处理机制在不同的操作系统上采用不用的IO模型,在linux下,nginx使用epoll的IO多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。
根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我们使用的是Centos6.4的linux,因此将nginx的事件处理模型调整为epool模型。
4.2调整nginx worker单个进程允许的客户端最大连接数,这个值根据服务器性能和程序的内存来指定(一个进程启动使用的内存根据程序确定),这个参数是单个进程的最大链接数,实际最大链接数是worker进程数乘以这个数。
Max_client=worker_processes*worker_connections
4.3配置nginx worker进程最大打开文件数,相当于系统ulimit –HSn,注意配置参数不是越大越好,最好设为服务器承受的极限点,最好与ulimit-n的值保持一致

events {
use epoll;
worker_connections 1024;
worker_rlimit_nofile65535;

}
5.设置连接超时时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http {
..........
keepalive_timeout 60;
###设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该连接。
tcp_nodelay on;
####打开tcp_nodelay,在包含了keepalive参数才有效
client_header_timeout 15;
####设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
client_body_timeout 15;
####设置客户端请求主体读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
send_timeout 15;
####指定响应客户端的超时时间。这个超过仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
......
  
}




6.配置gzip压缩功能Gzip压缩是可以节省带宽,提高传输效率,但是由于是在服务器上进行压缩,会消耗服务器起源
使用的是nginx_http_gzip_module模块
参数:
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压缩的数据。
具体配置:
没配置gzip压缩之前;
1
2
3
4
5
6
7
[iyunv@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 24 Jun 2015 04:51:53 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.30



在http模块中添加下面参数
1
2
3
4
5
6
7
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;



重新curl一下,出现vary表示压缩已经开启
1
2
3
4
5
6
7
8
[iyunv@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 24 Jun 2015 04:53:46 GMT
Content-Type: text/html
Connection: keep-alive
Vary:Accept-Encoding
X-Powered-By: PHP/5.4.30




7.配置nginx expires缓存expire功能优点
(1)expires可以降低网站购买的贷款,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。
expire功能缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决办法:
第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个 对缓存的对象改名
a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已
b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。
配置方法:
配置前curl一下

1
2
3
4
5
6
7
8
[iyunv@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 24 Jun 2015 04:53:46 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.30



现在设置缓存图片1个月,css、javascript、flush等缓存一天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
location ~.*\.(js|css|javascript|fluash)$ {
expires 24h;
}
重新curl一下,发现expires 缓存到了下个月今天
1
2
3
4
5
6
7
8
9
10
11
12
[iyunv@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/du.jpg"   
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Wed, 24 Jun 2015 05:20:34 GMT
Content-Type: image/jpeg
Content-Length: 27696
Last-Modified: Mon, 07 Jul 201404:26:08 GMT
Connection: keep-alive
ETag: "53ba2160-6c30"
Expires:Fri, 24 Jul 2015 05:20:34 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes




8.nginx错误页面友好显示当访问网站出现400 403 404 405 408 410,500 501 502 503 504 等状态码时,可以将其重定向到一个友好页面,提升用户体验。
配置方法:
1)在http模块中开启:fastcgi_intercept_errors on;  (注意必须开启,否则不生效)
2)在http或者server模块配置下面参数
error_page  500 501 502 503 504 /error/5-error.html;   
error_page 400 403 404 405 408 410 411 412413 414 415 /error/4-error.html;
注意:这里是相对路径,‘/’表示网站根目录,如果需要自定义目录的话,需要在下面添加location指定该目录位置
3)确保在网站根目录下存在error和相关网页

效果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[iyunv@transit_machine ~]# curl  -H "www.beyond.com""http://172.16.254.5/aaa.php"   
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
   body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial,sans-serif;
   }
</style>
</head>
<body>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
</body>
</html>



注意,也可以将错误重定向到其他的url连接
下面是天猫的nginx优雅显示案例
error_page  500 501 502 503 504 http://err.tmall.com/error2.html;
error_page 400 403 404 405 408 410 411 412413 414 415 http://err.tmall.com/error1.html;

9.nginx设置防掉链防盗链就是其他网站通过url引用你网站上的资源,达到填充本网站的显示效果,这样会增加自己的带宽,增加服务器的压力。
解决办法:
1
2
3
4
5
6
7
8
9
10
11
12
location ~* \.(gif|jpg|png|swf|flv)${
valid_referers none blocked www.beyond.comwww.zsms.com;
if ($invalid_referer) {
rewrite ^/ http://www.beyond.com/403.html;
#return 404;
}
}
第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行:www.beyond.com www.zsms.com
表示对www.beyond.com www.zsms.com这2个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到错误页面,当然直接返回404也是可以的。




10.nginx限制访问10.1 根据扩展名限制程序和目录访问,可以防止通过访问网页,而执行网页上的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Nginx限制访问指定目录:
location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$
{
deny all;
}
注意需要放在php解析location的下面
  
Nginx禁止访问*.txt,*.doc
location ~* \.(txt|doc)$ {
if (-f $request_filename) {
root /data/www/www;
#rewrite …..可以重定向到某个URL
break;
}
}



10.2 限制ip访问
1
2
3
4
5
6
7
8
9
10
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
或者
if ( $remote_addr = 10.0.0.7 ) {
return 403;
}



10.3限制客户端类型:可有效防止爬虫
1
2
3
4
5
6
7
8
9
10
11
12
下面内容可以防止爬虫
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")
{
return 403;
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}




11.Nginx修改源码隐藏软件名称及版本号这个需要在编译安装之前进行修改,修改的是源码包的内容
1
2
3
4
cd nginx-1.6.2/src/core
sed -n '13,17p'nginx.h
#define NGINX_VERSION  "1.6.2" 修改为想要的版本号如2.4.3
#define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-80385-1-1.html 上篇帖子: nginx图片上传失败 下篇帖子: Linux下编译安装nginx 版本号
累计签到:102 天
连续签到:1 天
发表于 2015-6-29 11:05:07 | 显示全部楼层
挺详细的,学习了!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表