代码改变世界

nginx优化

2019-12-28 11:48  unique-yichen  阅读(139)  评论(0)    收藏  举报

1、优化nginx进程个数策略

在高并发、高访问量的web服务场景,需要事先启动好更多的nginx进程,以保证快速响应并处理大量并发用户的请求。

worker_processes 1;   一般调整到与CPU的颗数相同

查看CPU  cat /proc/cpuinfo       或者    top    或者    sar  -u  1  5

2、默认情况下,nginx的进程跑在某一个CPU或CPU的某一个核上,导致nginx进程使用硬件的资源不均,这里的优化是不同的nginx进程给不同的CPU处理,充分有效的利用有效的硬件资源

八核CPU配置

worker_processes 8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

四核CPU配置

worker_processes 4;

worker_cpu_affinity 0001 0010 0100 1000;

二核CPU配置

worker_processes 2;

worker_cpu_affinity 0101 1010;

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

放置位置:events 标签

参数语法:worker_connections number

默认配置:worker_connections 512;

总并发=worker_processes*worker_connections

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

放置位置:主标签段

参数语法:worker_rlimit_nofile number

说明:作用是改变worker_processes能打开的最大文件数

worker_rlimit_nofile 65535;

这个参数受系统文件的最大打开限制,解决方法:

vim /proc/sys/fs/file-max

文件系统最大可打开文件数

要想ulimits 的数值永久生效,必须修改配置文件/etc/security/limits.conf 在该配置文件中添加

* soft nofile 65535

* hard nofile 65535

echo "* soft nofile 65535" >> /etc/security/limits.conf

echo "* hard nofile 65535" >> /etc/security/limits.conf

* 表示所用的用户

5、nginx事件处理模型优化

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

要根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我们使用的是Centos6.5的linux,因此将nginx的事件处理模型调整为epoll模型。

events {

worker_connections 1024;

use epoll;

}

6、一般来说,软件的漏洞都和版本相关,所以我们要隐藏或消除web服务对访问用户显示的各种敏感信息

放置位置:http模块下

参数:server_tokens off;

nginx隐藏需要修改原代码

修改路径: vim /nginx/src/core/nginx.h

 

 修改完后,从新编译: make  &&  make install

重启nginx

7、httpd长连接超时时间

默认是60s,功能是使客户端到服务器端的连接在设定的时间内持续有效,当出现对服务器的后继请求时,该功能避免了建立或者重新建立连接。切记这个参数也不能设置过大!否则会导致许多无效的http连接占据着nginx的连接数,终nginx崩溃!

http {

keepalive_timeout 60;

}

8、开启高效文件传输模式

设置参数: sendfile on;

sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率。

http {

  sendfile on; #放在http,server,location都可以

  tcp_nopush on;

  tcp_nodelay on;

}

9、配置nginx gzip压缩实现性能优化

(1).nginx压缩功能的介绍: nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送给客户端之前,nginx服务器会根据一些具体的策略实施压缩,以节省网站出口带宽,同时加快了数据传输效率,提升了用户的访问体验。

(2).压缩的优点: 提升网站用户体验:由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验就提升了 节约网站带宽成本:由于数据时压缩传输的,因此,会消耗一些cpu资源

(3).压缩的对象: 纯文本内容压缩比很高,因此,纯文本的内容最好要压缩 被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩反而变大 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源

参数:

gzip on;   #表示开启压缩功能

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

gzip_buffers  432k;   #压缩缓存区大小

gzip_http_version 1.1;  #压缩版本

gzip_comp_level  6;  压缩比例

gzip_types  text/css  text/html;  #指定压缩的类型

gzip_vary  on;  #vary header支持

10、nginx  expires功能

作用:为用户访问网站的内容设定一个过期时间,当用户第一次访问到这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及之后继续访问该网站,浏览器就会检查已经缓存在用户浏览器本地的内容,就不会去浏览器下载了,直到缓存的内容过期或者被清除为止。

优点:降低网站的带宽,节约成本 加快用户访问网站的速度,提升了用户访问体验 服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低,甚至可以节约人力成本

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

expires 360d;

}

缺点及解决办法

当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢? 一:对于经常需要的变动图片等文件,可以缩短对象缓存时间,例如,百度、谷歌等网站的首页图片经常会换成一些节日的图,这里可以将缓存期修改为1天 二:当网站改版或更新内容时,可以在服务器将缓存的对象改名(网站代码程序) 对于网站的图片、附件,一般不会被用户直接修改,用户层面上的修改图片,实际上是重新传到服务器,虽然内容一样但是一个新的图片名了 网站改版升级会修改JS、CSS元素,若改版的时候对这些元素改了名,会使得前端的CDN以及用户端需要重新缓存内容

11、禁止访问指定目录下的所有文件和目录

配置禁止访问指定的单个或多个目录

location ~ ^/(static|install|)/ { deny all; }

location ~ ^/static { deny all; }

12、location匹配规则

语法规则: location [=|~|~*|^~] /uri/ { … }

= 开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

~ 开头表示区分大小写的正则匹配

~*  开头表示不区分大小写的正则匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 / 通用匹配,任何请求都会匹配到。

多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考): 首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求