码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx 优化

时间:2016-07-25 16:32:45      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:软件

一.Nginx 软件配置参数优化


1.隐藏nginx header里版本号信息

(1)查看版本号

# curl -I 127.0.0.1

HTTP/1.1 200 OK

Server:nginx/1.6.2

Date: Fri, 22 Jul 2016 03:14:39 GMT

Content-Type: text/html

Content-Length: 612

Last-Modified: Mon, 18 Jul 2016 03:27:22 GMT

Connection: keep-alive

ETag: "578c4c9a-264"

Accept-Ranges: bytes

(2)隐藏版本号

nginx配置文件的http标签内加入“server_tokens off; ”参数,也可以放大server标签和location标签中,如下:

http {

..........

server_tokens off;

..........

     }

/app/zpy/nginx/sbin/nginx -t

/app/zpy/nginx/sbin/nginx -s reload

再此查看如下,浏览器访问错误页面也就没有版本号了

[root@c66-kslx conf]# curl -I 127.0.0.1      

HTTP/1.1 200 OK

Server: nginx



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

(1)默认情况下,nginx服务启动,使用的用户和组默认都是nobody,查看默认配置如下:

# grep ‘#user‘ nginx.conf.default

#user  nobody;

web用户改为特殊的用户名如:nginx或更特殊点的zpy,但是这个用户必须是系统存在的。

(2)建立zpy用户

# useradd zpy -s /sbin/nologin -M   #禁止登陆,无家目录

# id nginx

(3)配置文件nginx.conf中修改(也可以编译安装时指定默认)

在配置文件最外层上面

worker_processes 1;

user zpy;



3.配置nginx worker进程个数

nginxmasterworker进程组成,master进程相当于管理员,worker进程为用户提供服务

一般设置为cpu核数或者核数x2,用top1查看

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

worker_processes 4;



4.根据cpu核数进行nginx进程优化

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

(1)不同cpu设置如下

四核cpu配置:

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;

八核cpu服务器参数配置:

worker_processes    8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000; 

(2)官方文档说明

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;
binds each worker process to a separate CPU, while
worker_processes    2;  4核2进程
worker_cpu_affinity 0101 1010;

(3)查看cpu使用情况

输入top命令查看系统资源占用信息,在top命令界面如何查看多颗CPU的利用率。

1

(4)命令行如何通过命令调整不同的进程或服务到不同的cup上,资源平均分配

观察发现,Linux服务器的4核CPU,只有第1个核心(CPU#0)非常忙,其他都处于idle状态。

不了解Linux是如何调度的,但目前显然有优化的余地。除了处理正常任务,CPU#0还需要处理每秒网卡中断。因此,若能将CPU#0分担的任务摊派到其他CPU核心上,可以预见,系统的处理能力将有更大的提升。

两个名词

SMP (Symmetrical Multi-Processing):指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。 [更多...]

CPU affinity:中文唤作“CPU亲和力”,是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。[更多...]


在Linux上修改进程的“CPU亲和力”

在Linux上,可以通过 taskset 命令进行修改。以Ubuntu为例,运行如下命令可以安装taskset工具。

# apt-get install schedutils

对运行中的进程,文档上说可以用下面的命令,把CPU#1 #2 #3分配给PID为2345的进程:

# taskset -cp 1,2,3 2345

但我尝试没奏效,于是我关掉了MySQL,并用taskset将它启动:

# taskset -c 1,2,3 /etc/init.d/mysql start

对于其他进程,也可如此处理(nginx除外,详见下文)。之后用top查看CPU的使用情况,原来空闲的#1 #2 #3,已经在辛勤工作了。


配置nginx绑定CPU

刚才说nginx除外,是因为nginx提供了更精确的控制。

conf/nginx.conf中,有如下一行:

worker_processes  1;

这是用来配置nginx启动几个工作进程的,默认为1。而nginx还支持一个名为worker_cpu_affinity的配置项,也就是说,nginx可以为每个工作进程绑定CPU。我做了如下配置:

worker_processes  3;
worker_cpu_affinity 0010 0100 1000;

这里0010 0100 1000是掩码,分别代表第2、3、4颗cpu核心。

重启nginx后,3个工作进程就可以各自用各自的CPU了。


刨根问底

如果自己写代码,要把进程绑定到CPU,该怎么做?可以用sched_setaffinity函数。在Linux上,这会触发一次系统调用

如果父进程设置了affinity,之后其创建的子进程是否会有同样的属性?我发现子进程确实继承了父进程的affinity属性。 


Windows?

在Windows上修改“CPU亲和力”,可以通过任务管理器搞定。

进程--关系设置--处理器关系

linux taskset命令详解

SYNOPSIS
       taskset [options] [mask | list ] [pid | command [arg]...]
OPTIONS
       -p, --pid
              operate on an existing PID and not launch a new task
       -c, --cpu-list
              specifiy  a  numerical  list of processors instead of a bitmask.
              The list may contain multiple items,  separated  by  comma,  and
              ranges.  For example, 0,5,7,9-11.
       -h, --help
              display usage information and exit
       -V, --version
              output version information and exit 


5.nginx事件处理模型优化

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

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

具体参数如下:

events {

    use epoll;

   worker_connections  1024;

}


附加:nginx epool 和apache select的区别

假设你的大学宿舍楼有很多房间,你的朋友来找你。select的宿管会带着你的朋友挨个房间去找,直到找到你为止。而epool的宿管会先记下你的门牌号,告诉你的朋友你的门牌号,不用亲自带着他去找你。如果来了10000个人,哪个方式效率高显而易见。同理在高并发服务器中,轮询I/O是最耗时的操作之一。epool效率更高!



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

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

events {

    use epoll;

    worker_connections  20480;

}

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

Max_client=worker_processes*worker_connections


单位时间内,服务器能够同时处理的最大链接数(有的请求1S结束,有的请求可能10S才结束)




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

worker_rlimit_nofile 65535;

相当于系统ulimit -HSn,应该是相同的。

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



8.开启高效的文件传输模式

http {

    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小 
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改 成off。 
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

}




9.设置连接超时时间

保护服务器资源,硬件CPU mem,连接数。

建立连接也是要消耗资源的,我们一般断掉那些连上的链接,但是不做事的

php网站建议短连接,PHP程序建立连接消耗的资源和时间要少。

JAVA网站建议长连接,JAVA程序建立连接消耗的资源和时间要多。

http字段设置

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将会关闭连接。

......

}




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

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

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

http {

..........

client_max_body_size10m;

......

}



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

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

参数详解:有的只能放在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_busy_buffers_size 128k;

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

     fastcgi_temp_file_write_size 128k;

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

     fastcgi_cache oldboy_ngnix;

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

     fastcgi_cache_valid 200 302 1h;

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

     fastcgi_cache_valid 301 1d;

###将301应答缓存一天

     fastcgi_cache_valid any 1m;

###将其他应答缓存为1分钟

     fastcgi_cache_min_uses 1;

###请求的数量

     fastcgi_cache_path

###定义缓存的路径

参数配置如下:

修改nginx.conf配置文件

在http标签中添加如下:

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

#fastcgi_temp_path /data/ngx_fcgi_tmp;

fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2keys_zone=ngx_fcgi_cache:512m

 inactive=1dmax_size=40g;

缓存路径,levels目录层次2级,定义了一个存储区域名字,缓存大小,不活动的数据在缓存中多长时间,目录总大小

在serverlocation标签添加如下:

        location ~ .*\.(php|php5)?$

    {

    fastcgi_pass  127.0.0.1:9000;

    fastcgi_index index.php;

     includefastcgi.conf;

       fastcgi_cache ngx_fcgi_cache;

       fastcgi_cache_valid 200 302 1h;

       fastcgi_cache_valid 301 1d;

       fastcgi_cache_valid any 1m;

        fastcgi_cache_min_uses 1;

       fastcgi_cache_use_stale error timeout invalid_header http_500;

       fastcgi_cache_key http://$host$request_uri;

    }



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

(1)优点:

a.节约带宽,省钱

b.传输速度快,用户体验好

(2)使用模块:

nginx依赖ngx_http_gzip_module模块。

apache使用的是mod_deflate压缩功能

(3)需要压缩的内容:纯文本(jscsshtml),对于图片,视频,FLASH什么的不压缩,gzip_types参数控制,因为压缩占用cpu啊。

(4)对应参数含义如下:

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压缩的数据。

(5)具体配置如下

http标签中配置

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;




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

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

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

server字段添加

范例1:

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

百度的logo就是10

(2)根据目录进行判断,添加expires功能范例

## Add expires header according to dir.
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    expires 360d;
}

expire总结

expire功能优点

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

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

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

expire功能缺点:

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

解决办法:

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

第二个对缓存的对象改名

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

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

企业网站缓存日期案例

151cto  1

2sina  15

3、京东 25

4、淘宝 10

网站不希望被缓存的内容

1)广告图片

2)网站流量统计工具

3)更新频繁的文件(googlelogo




Nginx 优化

标签:软件

原文地址:http://zhouxinyu1991.blog.51cto.com/6095086/1829664

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!