性能和速度一直是计算机领域的一大挑战。它直接影响用户体验。
如果一个网站加载时间过长,你也许会直接关闭这个网页。一般来说,一个网页的加载时间不能超过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;
压缩网页
看这片文章:Ubuntu-Nginx添加配置gzip模块,提要网页加载速度
使用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