1. 优化nginx worker进行个数
nginx服务主要有两个重要进程:
01) master进程:可以控制nginx服务的启动 停止 或重启
02) worker进程:处理用户请求信息,帮助用户向后端服务进行请求(php mysql)
添加worker进程方法
1 2 |
vim nginx.conf worker_processes 1; # 修改nginx配置文件中worker_processes指令后面的数值 |
建议:worker进程数量=等于CPU的核数 worker进程数量=等于CPU的核数*2
如何在一个系统中获悉CPU核心是多少?
①. 利用top命令--按数字1,获取到CPU核数信息
②. grep processor /proc/cpuinfo|wc -l
③. lscpu
查看cpu核心数命令示例
示例一
1 2 3 4 5 6 7 |
[root@web01 ~] # top # 按数字1 top - 03:22:48 up 9 days, 26 min, 4 users , load average: 1.06, 0.99, 0.92 Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie Cpu0 : 0.2%us, 0.6%sy, 0.0%ni, 99.0% id , 0.1%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 0.1%us, 0.1%sy, 0.0%ni, 99.1% id , 0.7%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 485984k total, 452536k used, 33448k free , 24984k buffers Swap: 786428k total, 5912k used, 780516k free , 242048k cached |
示例二
1 2 3 |
[root@web01 ~] # lscpu |grep CPU CPU op -mode(s): 32-bit, 64-bit CPU(s): 2 |
示例三
1 2 3 |
[root@web01 ~] # grep processor /proc/cpuinfo processor : 0 processor : 1 |
2. 绑定不同的nginx进程到不同的CPU上
4个worker进程分配CPU资源方法:
1 2 |
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; |
8个worker进程分配CPU资源方法:
1 2 3 |
worker_processes 8; worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000; # 分配8进程方法 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; |
4个worker进程分配CPU资源方法:
1 2 |
worker_processes 4; worker_cpu_affinity 0101 1010; # 将进程分配到两颗CPU上 |
3. 优化nginx事件处理模型
官方配置参数说明:
http://nginx.org/en/docs/ngx_core_module.html#use
1 2 3 |
Syntax: use method; Default: — Context: events |
关于事件处理模型可以参考:
https://oldboy.cnblogs.com/p/7750615.html#auto_id_10
举例配置:
1 2 3 4 5 6 |
user www www; worker_processes 1; events { worker_connections 1024; use epoll; --- 指定使用的模型为epoll } |
4. 调整nginx单个进程允许的客户端最大连接数
查看nginx当前的打开文件数
1 2 3 4 5 |
[root@oldboy ~] # lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE /OFF NODE NAME nginx 10422 root 6u IPv4 11868856 0t0 TCP *:http (LISTEN) nginx 10424 www 6u IPv4 11868856 0t0 TCP *:http (LISTEN) nginx 10425 www 6u IPv4 11868856 0t0 TCP *:http |
修改最大连接数方法
1 2 3 4 5 |
vim nginx.conf events #<==events指令是设定Nginx的工作模式及连接数上限 { worker_connections 1024; } |
说明:此数值设置不要超过系统最大打开文件数量。
5. 配置Nginx worker进程最大打开文件数
举例配置:
1 2 3 4 |
[root@web02 conf] # cat nginx.conf user www www; worker_processes 1; worker_rlimit_nofile 2048; # 设置worker进程打开文件数 |
6. 优化nginx高效文件传输模式
sendfile参数的官方说明如下:
1 2 3 |
syntax:sendfile on | off; #<==参数语法 default:sendfile off; #<==参数默认大小 context:http,server,location, if in location #<==可以放置的标签段 |
说明:在系统内核中,利用零拷贝方式实现数据传输
实现高效数据传输的两种方式
第一种方式:tcp_nopush
1 2 3 |
syntax: tcp_nopush on | off; #<==参数语法 default: tcp_nopush off; #<==参数默认大小 context: http,server,location #<==可以放置的标签段 |
说明:将数据包积攒到一定量时再进行传输
参数作用:
激活或禁用Linux上的TCP_NODELAY选项。这个参数启用只在连接传输进入到 keep-alive状态。TCP_NODELAY和TCP_CORK基本上控制了包的"Nagle化",Nagle化在这里 的含义是采用Nagle算法把较小的包组装为更大的帧。John Nagle是Nagle算法的发明人,后者就是用他的名字来命名的。
此算法解决的问题就是所谓的silly window syndrome,中文称"愚蠢窗口症候群",具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,很轻易地就能令网络发生拥塞,Nagle化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下希望发送小块数据,把这一选项关掉也是合乎需要的。
第二种方式:tcp_nodelay
1 2 3 |
Syntax: tcp_nodelay on | off; Default: tcp_nodelay on; Context: http, server, location |
说明:只要有数据包产生,不管大小多少,就尽快传输
参数作用:
激活或禁用Linux上的TCP_CORK socket选项,tcp_cork是linux下tcp/ip传输的一个标准了,这个标准的大概的意思是,一般情况下,在tcp交互的过程中,当应用程序接收到数据包后马上传送出去,不等待,而tcp_cork选项是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞,已经是默认了。
此选项仅仅当开启sendfile时才生效, 激活这个.tcp_nopush参数可以允许把http response header和响应数据文件的开始部分放在一个文件里发布,其积极的作用是减少网络报文段的数量。
强调:两个指令是相悖的,请选择其一开启,不要同时开启;
默认采用tcp_nodelay方式进行传输。
7. 设置nginx服务超时参数
Nginx连接超时的参数设置
1) 设置参数:
1 |
keepalive_timeout 60; # 长连接才有意义 |
keepalive_timeout参数的官方说明如下:
1 2 3 |
syntax:keepalive_timeout timeout [header_timeout]; #<==参数语法 default:keepalive_timeout 75s; #<==参数默认大小 context:http,server,location #<==可以放置的标签段 |
说明:客户端和服务端都没有数据传输时,进行超时时间倒计时,一旦超时时间读取完毕还没有数据传输,就断开连接
2) 设置参数:client_header_timeout 55;
1 2 3 |
syntax:client_header_timeout time ; #<==参数语法 default:client_header_timeout 60s; #<==参数默认大小 context:http,server #<==可以放置的标签段 |
说明:表示定义客户端请求报文发送的间隔超时时间,客户端发送的请求报文中请求头信息的间隔时间
3)设置参数:client_body_timeout 55;
1 2 3 |
syntax:client_body_timeout time ; #<==参数语法 default:client_body_timeout 60s; #<==默认值是60秒 context:http,server,location #<==可以放置的标签段 |
说明:表示定义服务端响应报文发送的间隔超时时间,客户端发送的请求报文中请求主体信息的间隔时间
4)设置参数:send_timeout 60s
1 2 3 |
syntax:send_timeout time ; #<==参数语法 default:send_timeout 60s; #<==默认值是60秒 context:http,server,location #<==可以放置的标签段 |
说明:表示定义客户端读取服务端响应报文的间隔超时时间,服务端发送的响应报文间隔时间
8. 配置Nginx gzip压缩实现性能优化
1) Nginx gzip压缩功能介绍
Nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到用户客户端之前, Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。
2) Nginx gzip压缩的优点
提升网站用户体验:
发送给用户的内容小了,用户访问单位大小的页面就加快了,用户体验提升了,网站口碑就好了。
节约网站带宽成本:
数据是压缩传输的,因此节省了网站的带宽流量成本,不过压缩时会稍 微消耗一些CPU资源,这个一般可以忽略。
此功能既能提升用户体验,又能使公司少花钱,一举多得。对于几乎所有的Web服务来说,这是一个非常重要的功能,Apache服务也有此功能。
1 2 3 4 5 6 7 |
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 4; gzip_types text /css text /xml application /javascript ; gzip_vary on; |
说明:将服务端响应的数据信息进行压缩,可以有效节省带宽,提高用户访问效率
需要和不需要压缩的对象:
1) 纯文本内容压缩比很高,因此,纯文本的内容最好进行压缩,例如:html、js、css、xml、shtml等格式的文件。
2) 被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。
3) 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的。
4) 如果再压缩很可能不会减小或减小很少,或者有可能增大,同时压缩时还会消耗大量的CPU、内存资源。
压缩配置参数说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
gzip on ; #<==开启gzip压缩功能。 gzip_min_length lk; #<==设置允许压缩的页面最小宇节数,页面宇节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K,如果小于1K可能会越压越大。 gzip_buffers 4 16k; #<==压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据 大小相同的内存空间来存储gzip压缩结果。 gzip_http_version 1.1 ; #<==压缩版本(默认1.1,前端为squid2.5时使用1.0),用于设置识别HTTP协议版本,默认是1.1, 目前大部分浏览器已经支持GZIP解压,使用默认即可。 gzip_comp_level 2 ; #<==压缩比率。用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。 gzip_types text /plain application /x-javascript text /css application /xml ; #<==用来指定压缩的类型,"text/html"类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型。 gzip_vary on ; #<==vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用Squid缓存 经过Nginx压缩的数据。 |
9. 配置Nginx expires缓存实现性能优化
简单地说,Nginx expires的功能就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除为止。
Nginx expires功能优点:
1) expires可以降低网站的带宽,节约成本。
2) 加快用户访问网站的速度,提升用户访问体验。
3) 服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低,甚至可以节约人力成本。
4) 对于几乎所有的Web服务来说,这是非常重要的功能之一,Apache服务也有此功能。
实践配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[root@web02 extra] # cat blog.conf server { listen 80; server_name blog.etiantian.org; server_tokens off; # 静态请求处理的location location / { root html /blog ; index index.php index.html index.htm; } # 动态请求处理的location location ~* .*\.(php|php5)?$ { root html /blog ; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10y; root html /blog ; } location ~ .*\.(js|css)$ { expires 30d; root html /blog ; } } location / { expires 3650d; } |
企业网站有可能不希望被缓存的内容:
1) 广告图片,用于广告服务,都缓存了就不好控制展示了。
2) 网站流量统计工具(JS代码),都缓存了流量统计就不准了。
3) 更新很频繁的文件(google的logo),这个如果按天,缓存效果还是显著的。
10. 配置FastCGI优化
FastCGI常见参数的Nginx配置示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
[root@nginx conf] # cat nginx.conf worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; worker_rlimit_nofile 65535; user nginx; events { use epoll; worker_connections 10240; } http { include mime.types; default_type application /octet-stream ; sendfile on; tcp_nopush on; keepalive_timeout 65; tcp_nodelay on; client_header_timeout 15; client_body_timeout 15; send_timeout 15; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ; server_tokens off; fastcgi_connect_timeout 240; fastcgi_send_timeout 240; fastcgi_read_timeout 240; 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:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; #web............... server { listen 80; server_name blog.oldboyedu.com; root html /blog ; location / { root html /blog ; index index.php index.html index.htm; } location ~ .*\.(php|php5)${ fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.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; } access_log logs /web_blog_access .log main; } upstream blog_etiantian{ server 10.0.0.8:8000 weight=1; } server { listen 8000; server_name blog.oldboyedu.com; location / { proxy_pass http: //blog_etiantian ; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } access_log logs /proxy_blog_access .log main; } } |
FastCGI常见参数列表说明: