性能和速度一直是计算机领域的一大挑战。它直接影响用户体验。

如果一个网站加载时间过长,你也许会直接关闭这个网页。一般来说,一个网页的加载时间不能超过3秒。

Nginx和Apache是使用最广的web服务程序,它们都很稳定,并且可以处理大量连接。

我这里教你怎么优化Nginx web服务程序,发挥出Nginx的最高性能。

下面列出了我使用的几个方法,如果你有其它技巧,欢迎留言。



缓存资源

每个网站都有页面、图片、css、js等等资源,如果静态资源使用缓存的话,可以很可观提高网页的加载速度。

web页面大约30%的内容是静态的。

缓存有两点好处:1)页面加载快;2)降低服务器负载。

编辑Nginx配置文件,加入如下选项:

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {expires 365d;}

如果内容不变,缓存的文件有效期是365天。



调整Worker进程数

现代操作系统都是多进程、多线程的。

默认配置下,Nginx是单进程的。

为了充分利用系统资源,我们可以把Nginx配置成多进程web服务。

配置worker_processes参数,编辑配置文件/etc/nginx/nginx.conf,把worker_processes auto;改为:

worker_processes 12;



提高Worker的连接数

Worker连接和worker进程相关。例如,每个worker进程能处理维护多少个连接。如果你使用1个worker进程,并且把连接数设置为10,那么Nginx最多能处理10个连接。

你可以根据你网站的流量,适当调整这个值。超过连接数的连接将进入等待队列或超时。

我为每个进程设置1024个连接:

events {
    worker_connections 1024
}



优化timeout(超时时间)

Timeout参数可以用来提高你的web服务器性能。

有几个timeout参数,每个参数有它自己的功能。

我的配置为:

client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;



压缩网页

使用gzip压缩既能提高网页加载速度,也能降低服务器网络带宽压力。

nginx配置:

gzip on
gzip_comp_level 2;
gzip_min_length 1000;
gzip_types text/plain application/x-javascript text/xml text/css application/xml;



内存缓冲区

内存缓冲区太小可能导致Nginx频繁的写硬盘,结果导致提高了磁盘IO。

内存缓冲区有几种:

  • client_body_buffer_size:post请求缓冲区太小,访问者提交的信息。128k是不错的选择。
  • client_max_body_size:最大缓冲区太小,大的post请求是很危险的。
  • client_header_buffer_size:限制客户端请求头的大小,1k是很好的选择。

编辑/etc/nginx/nginx.conf,添加:

client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;



禁用访问日志

用户的每一个请求都会被nginx做为日志记录下来。为了提高性能和节省硬盘空间可以禁用访问日志。

我个人不建议禁用访问日志,因为日志中记录的信息是很有用的。

Nginx配置文件:

access_log off;



TCP_nodelay & TCP_nopush

这两个是网络层的重要参数:

1)TCP_nodelay:数据不会攒多了再发送,而是以实时的小数据发送。

tcp_nodelay on;

2)TCP_nopush:允许服务器发送HTTP请求,它以一个网络包发送而不是多个frame。它能优化数据传输并最小化服务器带宽。



Open_file缓存

Linux操作系统把所有东西都看成文件。

open_file_cache参数允许服务器为频繁使用的文件缓存文件描述符,参数设置如下:

open_file_cache max=5000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;



连接队列

为了优化Nginx,你可以配置Linux内核。

有两个参数很有用:net.core.somaxconn和net.ipv4.tcp_max_tw_buckets。

编辑/etc/sysctl.conf:

net.core.somaxconn = 65536
net.ipv4.tcp_max_tw_buckets = 1440000