一.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
再此查看如下,浏览器访问错误页面也就没有版本号了
[[email protected] 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进程个数
nginx由master和worker进程组成,master进程相当于管理员,worker进程为用户提供服务
一般设置为cpu核数或者核数x2,用top按1查看
修改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使用epoll的IO多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。
根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue| rtsig |epool|dev/pool |select|pllo ];”我们使用的是Centos6.5的linux,因此将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.conf中http字段添加如下参数,具体大小根据业务做调整
即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)需要压缩的内容:纯文本(js,css,html),对于图片,视频,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缓存功能(重要)
对于图片,CSS,JS等元素更改的机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长,CSS,JS,html等代码缓存10天,这样用户第一次打开页面后,会在本地缓存上述内容,提高了以后打开的页面加载速度,节省服务端大量带宽,此功能同apache的expires。这里通过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功能优点
(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。
expire功能缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决办法:
第一个缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个对缓存的对象改名
a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已
b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。
企业网站缓存日期案例
1、51cto 1周
2、sina 15天
3、京东 25年
4、淘宝 10年
网站不希望被缓存的内容
1)广告图片
2)网站流量统计工具
3)更新频繁的文件(google的logo)