/ 中存储网

如何在64M内存的vps上优化Nginx服务器

2014-04-01 17:09:01 来源:IT技术网
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 最大的性能瓶颈,这是另外一个话题。