nginx web应用全方位优化手册 nginx优化25条

nginx web应用全方位优化手册

  • A+
所属分类:应用运维

本文中起子将结合最近起子所学到的nginx优化相关知识对nginx的web应用优化进行分类整理。

本着防君子不防小人的道理,个人认为,nginx的web优化,应该依次包括性能优化、外观体验、访问控制、版本信息优化、权限优化、安全策略等环节,显然当站点真的被拉了仇恨被CC、DOS/DDOS时,单靠nginx的优化已无济于事了。本文较长,欢迎点击右侧目录跳转到相关章节。

 

一、性能优化

1.1 配置nginx worker进程个数

nginx由master和worker进程组成,master进程相当于管理员、监工,进行accesslog的处理等工作,worker进程为用户提供服务,好比服务员

一般的我们设置设置为cpu核数(线程数)或则核数x2,用top按1查看线程数即虚拟核数,或使用cat /proc/cpuinfo过滤其中的processor字段,单个系统一般随线程数量由零有序增大、大型网站中,条件允许时,

修改nginx.conf配置文件第一行

worker_processes 4;

1.2 根据cpu核数进行nginx进程优化

把几个进程分配在一个cup上,cup亲和力

1、不同cpu设置如下

四核cpu配置:

八核cpu服务器参数配置:

 

官方文档说明

 

1.3 nginx事件处理模型优化

nginx的连接处理机制在不同的操作系统上采用不用的IO模型,在linux下,nginx使用epoll的IO多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。

根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我们使用的是Centos6.5的linux,因此将nginx的事件处理模型调整为epool模型。(bsd系系统理论上选择kqueue,未经测试不敢贸然下论断,如有出入还望指正)

1、具体参数如下在优化4下边挨着:

1.4 调整nginx worker单个进程允许的客户端最大连接数

这个值根据服务器性能和程序的内存来指定(一个进程启动使用的内存根据程序确定)

老男孩思想:20480只是理论宽松的参数,最终应该根据系统性能在性能测试中决定一个不会超出软硬件系统能力的值,对于超过负载的请求只能舍弃。

最大链接数的计算方式

这个参数是单个进程的最大链接数,实际最大链接数是worker进程个数乘以这个数。

从用户的角度,http 1.1协议下,由于浏览器默认使用两个并发连接,因此计算方法:

nginx作为http服务器的时候:

max_clients = worker_processes * worker_connections/2

nginx作为反向代理服务器的时候:

max_clients = worker_processes * worker_connections/4

或者从一般建立连接的角度:客户并发连接为1.

nginx作为http服务器的时候:

max_clients = worker_processes * worker_connections

nginx作为反向代理服务器的时候:

max_clients = worker_processes * worker_connections/2

nginx做反向代理时,和客户端之间保持一个连接,和后端服务器保持一个连接。

1.5 配置nginx worker进程最大打开文件数

worker_rlimit_nofile 65535;

相当于系统ulimit -HSn,应该相对于所有nginx模块生效。但是若系统中已经对环境或者nginx实例用户进行限制即系统nofile<nginx应用nofile,则不会达到nginx应用nofile的文件描述符使用程度

理念:配置参数不是越大越好,最好设为服务器承受的极限点。

1.6 开启高效的文件传输模式

在http字段设置

 

tcp_nopush参数可以允许把http response header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量。From: http://nginx.org/en/docs/http/ngx_http_core_module.html

1.7 fastcgi调优(配合PHP引擎动态服务)

cache 写入缓存区

buffer 读取缓冲区

fastcgi是静态服务和动态服务之间的一个接口

1、参数详解:有的只能放在http标签

fastcgi_connect_timeout 300;

###指定链接到后端FastCGI的超时时间。

fastcgi_send_timeout 300;

###向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。

fastcgi_read_timeout 300;

###指定接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。

fastcgi_buffer_size 64k;

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

fastcgi_buffers 4 64k;

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

 

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

 

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

 

###将301应答缓存一天

 

将其他应答缓存为1分钟

 

定义缓存的路径

fastcgi_cache_path /application/nginx/php_cache levels=1:2 keys_zone=cache_php:30m inactive=1d max_size=10g; 必须在http中声明
fastcgi_cache_key "$scheme$request_method$host$request_uri"; 缓存键值

fastcgi_cache_key $host$request_uri;
fastcgi_cache cache_php;

###表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误放生,但是开启缓存也可能会引起其他问题,要很据具体情况选择
fastcgi_temp_path /application/nginx/fastcgi_temp/temp;
fastcgi_temp_file_write_size 128k;
###在写入fastcgi_temp_path时将用多大的数据库,默认值是fastcgi_buffers的两倍,设置上述数值设置小时若负载上来时可能报502 Bad Gateway
fastcgi_cache_use_stale error timeout invalid_header http_500;
错误的返回码

1.8 配置nginx gzip压缩功能(重要)

1.9 配置nginx expires缓存功能(重要)

对于图片,CSS,JS等元素更改的机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长,CSS,JS,html等代码缓存10天,这样用户第一次打开页面后,会在本地缓存上述内容,提高了以后打开的页面加载速度,节省服务端大量贷款,此功能同apache的expires。这里通过location,将需要缓存的扩展名列出来,然后指定缓存时间。

1、根据文件扩展名进行判断,添加expires功能

在server字段添加

范例1:

 

 

百度的logo就是10年

2、根据目录及其他进行判断,添加expires功能范例

## Add expires header according to dir.

location ~ ^/(images|javascript|js|css|flash|media|static)/ {

expires 360d;

}

 

location ~(robots.txt) {

expires 7d;

break;

}

3expire总结

expire功能优点

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

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

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

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

解决办法:

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

第二个 对缓存的对象改名

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

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

企业网站缓存日期案例

1、51cto 1周
2、新浪 15天
3、京东 25年
4、淘宝 10年

网站不希望被缓存的内容

1)广告图片
2)网站流量统计工具
3)更新频繁的文件(google的logo)

1.10使用tmpfs文件系统给/tmp

1.11使用proxycache

①、http模块

②、server模块

至于server模块应该就不用跟上面介绍的那样详细了吧!不同站点只是 proxy_cache 这个配置不一样而已!比如:

站点1配置

 

二、用户体验

2.1 设置连接超时时间

2.2 nginx错误页面优雅显示

范例:403跳转

www

三、访问控制

3.1 上传文件大小限制(动态应用)

nginx.conf中http字段添加如下参数,具体大小根据业务做调整

即http协议原理中请求报文的请求主体,此功能在php参数中还有设置。

client_max_body_size 10m;

3.2 nginx站点目录及文件URL访问控制(重要:防止恶意解析)

1、根据扩展名限制程序和文件访问

作用:禁止目录下指定文件北风文,或者禁止指定目录下所有内容被访问

最佳应用场景:集群的共享存储,本来就应该只是资源文件,禁止指定扩展名程序被执行,例如:.php,.sh,.pl

nginx下禁止访问资源目录下的php程序文件,配置方法如下:

范例1:nginx配置限制指定目录下的php程序被解析

 

禁止请求方法

 

需要放在php解析location的下面

范例2:Nginx下配置禁止访问*.txt文件

 

2、限制来源ip访问

使用ngx_http_access_module限制ip访问

例如:phpmyadmin数据库web客户端,内部开发人员用

范例1:禁止某目录让外界访问,但允许某ip访问改目录,且支持php解析。

 

范例2限制及指定ip或ip段访问

思考:此处可以结合shell脚本改写include的ip并即时reload nginx实例来实现动态权限控制,但为了不造成性能影响建议在网络层做策略,以减少拒绝应答的性能开销。其实用性或许与是否识别x-forword-for等有关,或许可以阻止恶意客户端以代理进行的攻击,思之思之。

官网资料

http://nginx.org/en/docs/http/ngx_http_access_module.html

其他写法

if ( $remote_addr = 10.0.0.7 ) {

return 403;

}

企业问题案例:nginx做反向代理的时候可以限制客户端IP吗? 解答: 法1:使用if来控制

if ( $remote_addr = 10.0.0.7 ) {

return 403;

}

if ( $remote_addr = 218.247.17.130 ) {

set $allow_access_root 'true';

}

3、限制使用网站ip访问网站

防止别的网站指定到你的ip,盗用你的流量,占你贷款,假冒你。

方法1:ngnix第一个虚拟主机设置403,不够友好

方法2:添加301跳转,也是第一个虚拟主机(一般不这么搞,一般用上面的)

nginx的所有变量 http://nginx.org/en/docs/varindex.htm

3. 3配置nginx图片及目录防盗链

(1)图片,视频上打水印,品牌。

(2)防火墙控制,根据ip控制。

(3)防盗链(根据referer控制)

 

如何及时发现问题

第一、对IDC及CDN带宽做监控报警。

第二、作为高级运维或者运维经理,每天上班的一个重要任务,就是经常查看网站流量图,关注流量变化,关注异常流量。

第三、对访问日志做分析,对于异常流量能迅速定位,并且和公司市场推广等有比较好的默契沟通交流,以便调度贷款和服务器资源。确保网站正常的访问体验得到保证。

3.4 nginx防爬虫优化

使用Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
问题:可能会暴漏网站目录结构

nginx防爬虫优化
nginx根据$http_user_agent获取客户端agent,然后判断是否允许或者返回指定页面
网上资料:http://blog.csdn.net/xifeijian/article/details/38615695
##添加如下内容可防止爬虫(防搜索引擎的,但是网站展示宣传就不行了,所以看情况搞)

 

实战演示:禁止不同浏览器软件访问:

 

还是防君子不防小人的做法,有目的强爬可能伪造浏览器agent

3.5  限制客户端请求的HTTP方法

#Do not accept DELETE, SEARCH and other methods

四、版本信息优化

4.1 隐藏nginx header里版本号信息

header 和 错误页 中Server: nginx/1.6.2

server_tokens off;

用于隐藏脚本

4.2 更改源码隐藏软件名称及版本号

 

五、权限优化

5.1 更改掉nginx默认用户及用户组(worker进程服务用户优化)

 

5.2 让Nginx运行于(A Chroot Jail (Containers))监牢模式

用户使用有家目录的

将启动脚本、相关配置文件放置于加目录,脚本目录700 普通文件600使得无关用户无访问权限

并设置

pid /home/inca/log/nginx.pid

一般不用80端口

用反向代理解决端口问题haproxy,nginx,f5,lvs nat模式等

5.3 为web服务增加用户身份验证(适合内部机密网址)

控制力度:可以是一个虚拟主机,或一个目录

场景:内部使用的网址,例如phpmyadmin客户端

配置方法如下:

nginx配置:

 

创建密码文件:

 

 

六、安全策略

6.1 nginx日志相关优化与安全

1、配置日志切割脚本并写入计划任务

2、不记录不需要的访问日志

对于健康检查或某些(图片,js,css)日志,一般不记录日志,因为在统计PV时是按照页面计算,而且日志写入频繁会消耗磁盘IO,降低服务器性能。

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

access_log off;

}

3、访问日志的权限设置

假设日志目录为/app/logs,则授权

chown -R root.root /app/logs

chmod -R 700 /app/logs

不需要再日志目录给nginx用户读或者写许可。因为nginx的master进程是root,不要担心权限不够写不进去日志

6.2 防DOS攻击

1、控制单个ip的并发请求防止DOS攻击

使用limit_conn_zone进行控制,控制单个ip或域名的访问次数,限制连续访问

在http标签添加控制,可添加多个,在server或location中使用,

 

2、限制单个ip的请求速率防止DOS攻击

使用limit_req_zone进行控制,控制单个ip的访问速率

附录

nginx 4层反代 连接控制

6.3防DDOS策略

6.4分区挂载安全优化

专用网页代码分区  挂载  defaults,nosuid,noexec,nodev 1 2

 

七、其他优化

1、内核优化

2、移除不想要的nginx模块(最小化原则)

编译时加–without-http-**不安装模块

3、开启iptables防护

 

 

weinxin
我的微信公众号
我的微信公众号扫一扫

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

目前评论:1   其中:访客  1   博主  0

    • 2019人気TOPブランドコピー腕時計専門店。
      こういうユニークなコピーブランドは貴方の気質に顕現できるだけでなく、個性と魅力に漂います。
      もしできれば、ご来店を期待しています。
      世界の一流ブランド品N級の専門ショップ
      ◆在庫情報随時更新!(*^-^*)
      ◆スタイルが多い、品質がよい、価格が低い、実物写真 .
      ◆100%品質保証!満足保障!
      2019超人気 ブランドコピー時計超美品