作者:平凡的冰冰凝凝 | 来源:互联网 | 2014-05-28 09:40
Nginx小巧,高效,稳定等优点非常适合配置不高,内存小的VPS。这里的优化策略不是让nginx每秒能处理更多的请求,那是一个繁忙网站要做的。记住,这是一个只有64MB的VPS,对于架设一个访问量不大的网站/博客来说,尽可能减少Nginx的内存占用率是最重要的
Nginx 小巧,高效,稳定等优点非常适合配置不高,内存小的
VPS。这里的优化策略不是让nginx每秒能处理更多的请求,那是一个繁忙网站要做的。记住,这是一个只有 64MB 的
VPS,对于架设一个访问量不大的网站/博客来说,尽可能减少 Nginx 的内存占用率是最重要的,用尽量小的 Nginx
占用内存去满足不大的访问量。
优化 nginx.conf
Nginx 运行的进程数,一般设置成和 CPU 的核数相同。
worker_processes 1;
使用 epoll,Linux 内核2.6版本以上支持 epoll(eventport支持 Soaris,kqueue 支持
BSD系列),worker_connections 每个 Nginx 进程所允许的最大的连接数,max_clients =
worker_processes * worker_connections。
events {
use epoll;
worker_connections 128;
}
设置连接的超时时间。
keepalive_timeout 5;
Linux内核相关,用 kernel file buffer 直接发送数据给 network interface,不需要另用
buffer 中转,通过调用内核级 sendfile() 来提高性能(Linux
kernel的sendfile是如何提高性能的)。tcp_nopush 这个参数只有 sendfile on
的时候才有用。tcp_nodelay 只在 keepalive
连接状态中使用。sendfile on;
tcp_nopush on;
tcp_nodelay on;
gzip 压缩方面的参数,分别是:支持 gzip 压缩,回送给客户端最小的 gzip 压缩大小,gzip 压缩缓存,要 gzip
压缩的文件类型,压缩程度,vary header 支持,gzip http 版本默认是1.1,如果前端是 squid2.5
则使用1.0。
gzip on;
gzip_min_length 1000;
gzip_buffers 4 8k;
gzip_types text/* text/css application/Javascript application/x-Javascript;
gzip_comp_level 5;
gzip_vary on;
gzip_http_version 1.1;
性能测试
ab(Apache Bench)是一个用来测试 Apache HTTP Serve r的工具,主要用来测试 Apache
的性能,尤其是展示 web server 每秒能处理多少次请求。
Debian 下安装 ab:
#apt-get install apache2-utils
开始测试,下面的命令将会打开10个连接并且使用 Keep-Alive,通过这30个连接进行压力测试。不要在 web server
上本机测试,最好用另外一台机器。
#ab -kc 10 -t 30 http://www.server110.com/
优化 Nginx 前测试:
Finished 196 requests
Server Software: nginx/0.6.32
Server Hostname: www.server110.com
Server Port: 80
Document Path: /
Document Length: 26186 bytes
Concurrency Level: 10
Time taken for tests: 30.4440 seconds
Complete requests: 196
Failed requests: 195
(Connect: 0, Length: 195, Exceptions: 0)
Write errors: 0
Keep-Alive requests: 0
Total transferred: 5172095 bytes
HTML transferred: 5128733 bytes
Requests per second: 6.53 [#/sec] (mean)
Time per request: 1530.839 [ms] (mean)
Time per request: 153.084 [ms] (mean, across all concurrent requests)
Transfer rate: 168.31 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 46 46 1.8 47 61
Processing: 367 1442 152.0 1432 1718
Waiting: 253 1332 155.3 1323 1615
Total: 414 1488 152.0 1480 1766
Percentage of the requests served within a certain time (ms)
50% 1480
66% 1523
75% 1561
80% 1585
90% 1617
95% 1641
98% 1659
99% 1708
100% 1766 (longest request)
优化后测试:
Finished 187 requests
Server Software: nginx/0.6.32
Server Hostname: www.server110.com
Server Port: 80
Document Path: /
Document Length: 26030 bytes
Concurrency Level: 10
Time taken for tests: 30.21724 seconds
Complete requests: 187
Failed requests: 186
(Connect: 0, Length: 186, Exceptions: 0)
Write errors: 0
Keep-Alive requests: 0
Total transferred: 4943176 bytes
HTML transferred: 4901785 bytes
Requests per second: 6.23 [#/sec] (mean)
Time per request: 1605.440 [ms] (mean)
Time per request: 160.544 [ms] (mean, across all concurrent requests)
Transfer rate: 160.78 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 46 47 2.5 47 71
Processing: 420 1511 300.3 1445 2744
Waiting: 325 1394 283.8 1333 2633
Total: 466 1558 300.6 1492 2794
Percentage of the requests served within a certain time (ms)
50% 1491
66% 1539
75% 1574
80% 1622
90% 1700
95% 2227
98% 2682
99% 2782
100% 2794 (longest request)
结论
粗略看一下上面的数据,可能会发现优化后的性能还下降了,这是为什么呢?主要是因为 gzip on 增加了服务器的负载,需要
CPU/内存去压缩,很大程度影响到了实际性能。从内存使用的角度来说,我们优化的目的达到了,用 top 显示运行优化前的 nginx
占用了 1.54MB 的内存,运行优化后的 nginx 只占用了0.58MB。
节省了内存,牺牲了一点性能。不知道这个算不算优化呢?有的人追求速度,有的人追求节省资源,有的人追求稳定,我们主要看优化的目的是什么,才能根据自己所需进行改良。
对于一个访问量不大的网站/博客来说,每秒能处理的请求数不是太重要,只要这个请求数能应付那点访问量就可以了。对于只有 64MB 的
VPS 来说,要运行的东西太多,php/
mysql/wordpress
等都是耗内存大户,这个时候内存资源显得尤为重要,尽可能腾出空间来给这些必须的程序减少程序内存不够导致的频繁 swapping
才能从整体上提高性能。其实硬盘 IO 才是一个 web server 最大的性能瓶颈,这是另外一个话题。