Nginx 优化

一.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)

时间: 2024-11-06 03:48:26

Nginx 优化的相关文章

nginx优化(突破十万并发)

此文章非原创,出自鸟哥之手~ http://blog.chinaunix.net/uid-25266990-id-2985541.html 仅仅改了排版 --> 为了好看 ------------------------------------------------------------------------------ 分隔线 nginx优化(配置文件+内核优化) 一.nginx配置文件 1.worker_processes  8; 按照cpu数目来指定,一般为它的倍数 2.worker

Linux之nginx优化与防盗链

Linux之nginx优化与防盗链 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发. Nginx以事件驱动(epoll)的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理.负载平衡.但是Nginx并不支持cgi方式运行,原因是可以减少因

Nginx优化(十七)

[教程主题]:Nginx优化 [课程录制]: 创E [主要内容] Nginx 优化 nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发. Nginx以事件驱动(epoll)的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理.负载平衡.

2.Nginx优化

[教程主题]:Nginx优化 [课程录制]: 创E [主要内容] Nginx 优化 nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发. Nginx以事件驱动(epoll)的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理.

web优化之nginx优化<六>

这里我们接着web之nginx优化<->继续分析nginx优化之资源防盗链,方爬虫,控制目录权限.CDN加速重要性及方法. 12.资源防盗链 例如:资源在优酷视频,但显示在我自己的博客上,会增加优酷的带宽,但是访问量在我的博客:会节省我的资源. 1)根据http referer 实现防盗链 通过referer可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址. 2)其他的防盗链方案: ·cookie防盗链: ·加密URL路径,定时失效: ·lighttpd有类似的插件mod

web优化之nginx优化&lt;七&gt;

2.更改nginx的默认用户 这里我们接着web之nginx优化<->继续分析使用普通用户的重要性. 在高标准环境下尽量不使用root,尽量使用普通用户,这样外部人员提权也提不到root用户.搭建服务的时候就用普通用户搭建,生产环境下最好不要随便用root用户. 1)让nginx服务使用普通用户 ·root用户跑master进程的隐患: a.管理权限必须是root,这就使得最小化分配权限原则遇到难题 b.使用root跑nginx服务,一旦网站出问题,用户很容易获得服务的root权限 ·ngin

高并发下的 Nginx 优化与负载均衡

高并发下的 Nginx 优化 英文原文:Optimizing Nginx for High Traffic Loads 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. 有一些坏消息要告诉你, 你不能像Apache一样优化Nginx.它没有魔术配置来减半负载或是让PHP运行速度加快一倍. 高兴的是, Nginx已经优化的非常好了. 当你决定使用Nginx并用a

CentOS6.5 Nginx优化编译配置

说到Nginx,它真的算是我在运维工作中的好朋友,它优异的性能和极高的工作效率实在是让人大爱,来自internet的报告称其epoll模型能够支持高达50000个并发连接数. Epoll[维基百科]: epoll是Linux下 多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符 集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历

安装部署LNMP/大并发nginx优化/php性能加速 实战

安装部署LNMP及Nginx优化.PHP加速进行压力测试 部署LNMP环境: 主机 IP 主机名 Centos7.2 192.168.5.128 www.benet.com 部署步骤如下: 使用yum仓库安装Nginx依赖包 yum -y install  gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel 创建Nginx用户 组解压Nginx软件包 编译安装Nginx ./configur

高并发下的Nginx优化

高并发下的Nginx优化 2014-08-08 13:30 mood Nginx 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. AD:2014WOT全球软件技术峰会北京站 课程视频发布 11月21日-22日 与WOT技术大会相约深圳 现在抢票 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache