大家好,我是小林。
昨晚我发文上线了自己的网站,结果发文上线不到 10 分钟, 服务器就炸了,读者疯狂跟我说网站 500 错误了。
当时的场面直接尴住了,特别像在公司发布上线新的项目后,bug 频繁报。
评论区也有个课代表读者,跟大家科普了 500 错误是什么?简直太好笑了哈哈
今天就来复盘下昨天的问题。
为什么会有 500 错误?
收到大家反馈的错误后,我马上就去服务器查看 nginx 的 error 日志了,发现频繁报错了这个错误:“Too many open files”。
很快我就知道是文件描述符受限而导致 nginx 频繁报这个错误,每一个 TCP 连接都会占用一个文件描述符,当时发文不到 10 分钟,文章阅读就已经 1000 多了,瞬间一下子 1000 多个请求过来,就导致文件描述符被占满了,从而 nginx 就回 500 错误。
所以,要解决这个问题,就要调大文件描述符的显示。
首先,先来看看系统的最大描述符数:
这个是默认值,有18万个,那肯定不是这里受限。
然后,通过 ulimit -n 查看每个用户的最大描述符数:
这个也是默认值,也有 6.5 万个,说明也不是这里受限。
然后,通过 /proc//limits 这个文件查看 nginx 工作进程的最大描述符数:
可以看到,最大值才 1024 个!猜测 nginx 工作进程的最大描述符数太小而导致 nginx 报 Too many open files 的错误。
要怎么调大 nginx 的工作进程的最大描述符数呢?
很简单,只需要在 nginx.conf 配置调大 worker_rlimit_nofile 的值,这个参数单跟每个工作进程可以建立的最大连接数量息息相关,我这里调大到了 65535。
然后重新 reload nginx 的配置,再查看 /proc//limits:
可以看到,nginx 的工作进程最大描述符已经设置为 65535。
调大nginx工作进程最大描述符后,nginx 的 error 日志就没有在报错了,至此 500 错误的问题就解决了。
为什么网站访问很慢?
解决了 500 错误的问题后,后面又有很多读者反馈网站访问太慢了。
不瞒大家说,小林的服务器的配置确实很渣,还是去年阿里云活动白嫖的。1核心 CPU,2 GB 内存,5M 带宽:
其实小林在开设网站之前,就调研了身边的朋友他们的服务器配置如何?
我有位朋友也有个网站,他的网站每日 uv 有 1 万多,也就是每天有 1 万多人访问,这是挺牛逼的访问量了,但是他的服务器配置比我还低,访问平时还是挺正常的。
我心想我网站能每日 uv 有 5000 有开心了,所以按理来说我这个配置就够的了,就没有买更好的服务器配置,就用白嫖的服务器来看看效果。
给大家看看昨晚 8 点发文后的系统监控情况:
可以看到,CPU 和 内存远远没有达到瓶颈。所以网站访问慢的原因可以排除内存和 CPU 的限制。
接下里看看网络监控情况:
昨晚一发文,服务器的出口流量就直接到峰值了,一直维持 7M/s 的出口流量,这个出口流量已经达到服务器的带宽限制了。
所以,网站访问慢的原因就是服务器的带宽不够。
我的网站属于静态网站,然后用 nginx 部署,没有用到数据库之类的东西,所以是一个很轻量级的网站,CPU 和 内存 目前为止都是完全够用的,而且文章的图片我都没有放到服务器上,而是放到另外一个图床,所以大家访问的只是服务器的前端文件(js,html)这些。
昨天刚发文是因为一下太多请求导致带宽被打满的,等这个峰值过去后,其实出口流量也没那么多的了,比如现在出口流量就 2M/s,带宽也勉强够用。
等以后小林的网站日常带宽被打满后,我在充钱升级服务器设备吧哈哈。
另外,我还给网站做了个优化,在 nginx 打开了gzip 压缩,这样传输文件会经过压缩,这样带宽流量就能减少了一些。
在没有开启 gzip 压缩之前,打开这篇 2 万字的 TCP 文章,全部资源加载完需要 6 秒(并不是说打开这个文章要 6 秒才显示)。
在开启 gzip 压缩后,全部资源加载完只需要不到 3 秒,性能提升 50 %!
以后网站有任何异常的情况,我在跟大家分享,在解决 bug 的路上进步