64MB VPS 上优化 Nginx

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.example.com/

优化 Nginx 前测试:

Finished 196 requests

Server Software:        nginx/0.6.32
Server Hostname:        www.example.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.example.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 最大的性能瓶颈,这是另外一个话题。

评论 (2 Comments)

  1. 很不错的教程啊。

  2. 优化前
    Concurrency Level: 10
    Time taken for tests: 5.433 seconds
    Complete requests: 50000
    Keep-Alive requests: 50000
    Requests per second: 9202.64 [#/sec] (mean)
    Time per request: 1.087 [ms] (mean)
    Time per request: 0.109 [ms] (mean, across all concurrent requests)

    优化后
    Concurrency Level: 10
    Time taken for tests: 4.256 seconds
    Complete requests: 50000
    Requests per second: 11748.30 [#/sec] (mean)
    Time per request: 0.851 [ms] (mean)
    Time per request: 0.085 [ms] (mean, across all concurrent requests)

    牛啊

发表评论