优化Nginx配置提升网站性能 / 2020-05-01

Nginx官方博客最近发布了一篇文章《Help the World by Healing Your NGINX Configuration》,文章介绍了几种提高性能和减少网络带宽的非常实用的Nginx优化配置方法,值得参考。

Nginx官方博客最近发布了一篇文章:Help the World by Healing Your NGINX Configuration,文章介绍了几种提高性能和减少网络带宽的非常实用的Nginx优化配置方法。如果你的网站也是和easeapi一样用户量相对较小,可以直接拿来使用。

开启gzip

gzip是若干种不同文件压缩程序的统称,对于文本文件使用gzip压缩可以显著减小传输的文件大小。Nginx默认支持gzip功能,开启即可使用,典型的配置如下:

http {
	...
	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";
	#传输gzip压缩标志
	gzip_vary on;
	# gzip_proxied any;
	#压缩级别1-9,级别越高文件越小越费CPU,推荐6
	gzip_comp_level 6;
	#缓冲区大小
	gzip_buffers 16 8k;
	#启用压缩的最小http协议版本
	gzip_http_version 1.1;
	#启用压缩的最小数据长度,小文件压缩作用不大
	gzip_min_length 1k;
	#启用压缩的文件类型,主要针对文本文件
	gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
	...
}

设置Cache Headers

对于资源文件来说,短期内一般不会改变,因此可以针对性的设置较大的缓存时间。当浏览器首次下载到该文件之后,在缓存期间内再次访问会从本地缓存中读取,不会再次向服务器发起请求。典型的配置如下:

location ~* \.(?:jpg|jpeg|gif|png|ico|js|css)$ {
    expires 30d;
    add_header Cache-Control "public";
}

此项配置生效后,会在请求的头部增加下面两个字段:

//缓存时间(秒)
cache-control: max-age=2592000
//浏览器和缓存服务器都可以缓存
cache-control: public

当然,如果你觉得header中出现两个cache-control不美观(HTTP协议允许两个Cache-Control存在),也可以这样配置:

location ~* \.(?:jpg|jpeg|gif|png|ico|js|css)$ {
    add_header Cache-Control "public, max-age=2592000";
}

两种写法效果是一样的。

启用HTTP/2协议支持

关于HTTP/2的内容在之前的文章《近期服务器的一些改进》中有过介绍,头部压缩、二进制分帧等技术都可以在一定程度上减少网络流量。

优化日志

请求日志是写在磁盘文件中的,频繁的I/O操作对服务器性能影响较大。有三种方式可以优化:

  • 禁用资源文件的请求log
location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
    access_log off;
}
  • 禁用成功请求的log

如果仅需要关心那些访问出现错误的情况,可以禁用请求成功时的log。示例配置:

server {
	...
	#2xx-3xx的请求返回0,其他返回1即记录log
	map $status $loggable {
    	~^[23] 0;
    	default 1;
	}
	access_log /var/log/nginx/access.log combined if=$loggable;
	...
}
  • 最小化I/O操作

这个也是我推荐大家使用的。大多数情况下我们还是希望能记录所有的请求日志,包括成功和失败的,以便进行流量分析。这个时候,兼顾到性能,可以考虑使用缓冲区来减小IO操作频次。

#缓冲区512k填满或距离上次刷新时间超过1分钟则写入log
access_log /var/log/nginx/access.log combined buffer=512k flush=1m;

限速

如果网站提供有较大文件的下载,为防止一个请求占用过多的带宽而影响其他人的访问,可以对其进行限速。

location / {
	#当传输500k后,限速带宽为50k
	limit_rate_after 500k;
	limit_rate 50k;
}

此外,limit_req_zone、limit_conn_zone也是非常好用的流量控制组件。

这几个非常简单的配置项足以应付个人博客等小型网站,本站已实践效果很明显,光是Cache Headers这一项就可以减少很多的网络请求。如果你对性能优化有更高或更精细的要求,可以参考原文提供的几个链接,相信对你会有帮助。

其它文章

使用Filebeat和Elasticsearch分析Nginx日志
近期服务器的一些改进
inode用尽导致磁盘空间不足
Let’s Encrypt acme.sh 泛域名证书
阿里云云盘扩容笔记