上线 5 分钟,网站就炸了!

简介: 500错误

大家好,我是小林。

昨晚我发文上线了自己的网站,结果发文上线不到 10 分钟, 服务器就炸了,读者疯狂跟我说网站 500 错误了。

26.jpg

当时的场面直接尴住了,特别像在公司发布上线新的项目后,bug 频繁报。

评论区也有个课代表读者,跟大家科普了 500 错误是什么?简直太好笑了哈哈


25.png

今天就来复盘下昨天的问题。


为什么会有 500 错误?


收到大家反馈的错误后,我马上就去服务器查看 nginx 的 error 日志了,发现频繁报错了这个错误:“Too many open files”。

24.jpg

很快我就知道是文件描述符受限而导致 nginx 频繁报这个错误,每一个 TCP 连接都会占用一个文件描述符,当时发文不到 10 分钟,文章阅读就已经 1000 多了,瞬间一下子 1000 多个请求过来,就导致文件描述符被占满了,从而 nginx 就回 500 错误。

所以,要解决这个问题,就要调大文件描述符的显示。

首先,先来看看系统的最大描述符数:

23.png

这个是默认值,有18万个,那肯定不是这里受限。

然后,通过 ulimit -n 查看每个用户的最大描述符数:

22.png

这个也是默认值,也有 6.5 万个,说明也不是这里受限。

然后,通过 /proc//limits 这个文件查看  nginx 工作进程的最大描述符数:

21.jpg

可以看到,最大值才 1024 个!猜测 nginx 工作进程的最大描述符数太小而导致 nginx 报 Too many open files 的错误。


要怎么调大 nginx 的工作进程的最大描述符数呢?


很简单,只需要在 nginx.conf 配置调大 worker_rlimit_nofile 的值,这个参数单跟每个工作进程可以建立的最大连接数量息息相关,我这里调大到了 65535。

20.png

然后重新 reload nginx 的配置,再查看 /proc//limits:

19.jpg

可以看到,nginx 的工作进程最大描述符已经设置为 65535。

调大nginx工作进程最大描述符后,nginx 的 error 日志就没有在报错了,至此 500 错误的问题就解决了


为什么网站访问很慢?


解决了 500 错误的问题后,后面又有很多读者反馈网站访问太慢了。

不瞒大家说,小林的服务器的配置确实很渣,还是去年阿里云活动白嫖的。1核心 CPU,2 GB 内存,5M 带宽:

18.png

其实小林在开设网站之前,就调研了身边的朋友他们的服务器配置如何?

我有位朋友也有个网站,他的网站每日 uv 有 1 万多,也就是每天有 1 万多人访问,这是挺牛逼的访问量了,但是他的服务器配置比我还低,访问平时还是挺正常的。

我心想我网站能每日 uv 有 5000 有开心了,所以按理来说我这个配置就够的了,就没有买更好的服务器配置,就用白嫖的服务器来看看效果。

给大家看看昨晚 8 点发文后的系统监控情况:

image.gif

17.jpg

16.jpg

可以看到,CPU 和 内存远远没有达到瓶颈。所以网站访问慢的原因可以排除内存和 CPU 的限制。

接下里看看网络监控情况:

15.jpg

昨晚一发文,服务器的出口流量就直接到峰值了,一直维持 7M/s 的出口流量,这个出口流量已经达到服务器的带宽限制了。

所以,网站访问慢的原因就是服务器的带宽不够

我的网站属于静态网站,然后用 nginx 部署,没有用到数据库之类的东西,所以是一个很轻量级的网站,CPU 和 内存 目前为止都是完全够用的,而且文章的图片我都没有放到服务器上,而是放到另外一个图床,所以大家访问的只是服务器的前端文件(js,html)这些。

昨天刚发文是因为一下太多请求导致带宽被打满的,等这个峰值过去后,其实出口流量也没那么多的了,比如现在出口流量就 2M/s,带宽也勉强够用。

14.jpg

等以后小林的网站日常带宽被打满后,我在充钱升级服务器设备吧哈哈。

另外,我还给网站做了个优化,在 nginx 打开了gzip 压缩,这样传输文件会经过压缩,这样带宽流量就能减少了一些。

在没有开启 gzip 压缩之前,打开这篇 2 万字的 TCP 文章,全部资源加载完需要 6 秒(并不是说打开这个文章要 6 秒才显示)。

13.jpg

在开启 gzip 压缩后,全部资源加载完只需要不到 3 秒,性能提升 50 %!

12.jpg

以后网站有任何异常的情况,我在跟大家分享,在解决 bug 的路上进步

相关文章
|
数据安全/隐私保护 Python
小红书私信卡片一键生成, 小红书卡片跳转生成器, 小红书跳转卡片免费【python】
就是可以通过代码实现小红书卡片的效果,这个办法非常的稳定,主要问题是因为小红书没有公开的接口
|
6月前
|
人工智能 缓存 安全
7 个高效 Java 开发者的「反 AI 陷阱」习惯
AI时代,代码胜负手不再是手速,而是判断力!本文揭秘7大实战习惯:弹性降级、精准喂Context、拒绝炫技、严审依赖、三重审查、真集成测试、设计型Code Review——助你从AI用户跃升为AI驾驶员。(239字)
249 3
|
数据安全/隐私保护
BUUCTF [GXYCTF2019] CheckIn 1
BUUCTF [GXYCTF2019] CheckIn 1
852 0
|
Kubernetes 双11 容器
【赵渝强老师】Kubernetes中的控制器
Kubernetes通过控制器管理Pod的生命周期,以应对不同场景需求,如Deployment、DaemonSet、Job等。控制器可自动调整Pod数量和重启故障Pod,确保系统稳定运行。视频讲解和详细内容见下文。
255 0
|
Web App开发 网络协议 前端开发
【JavaEE初阶】 HTTP协议和使用Fiddler抓包
【JavaEE初阶】 HTTP协议和使用Fiddler抓包
|
缓存 JavaScript 前端开发
前端性能优化总结
前端性能优化总结
387 2
|
数据采集 Python Web App开发
关于文章《爬取知网文献信息》中代码的一些优化
关于文章《爬取知网文献信息》中代码的一些优化
关于文章《爬取知网文献信息》中代码的一些优化
|
NoSQL 安全 Java
【疑难杂症】-SpringBoot Admin服务离线、不显示健康信息的问题
SpringBoot Admin服务离线、不显示健康信息的问题 404 Not Found
1376 0
【疑难杂症】-SpringBoot Admin服务离线、不显示健康信息的问题
|
缓存 算法 索引
LeetCode 5. 最长回文子串 | 算法-从菜鸟开始
本文是《算法-从菜鸟开始》系列文章的第6篇,欢迎收藏、留言、点赞。 话不多说,让我们继续我们的算法之旅。
352 0
|
SQL 存储 关系型数据库
MySQL之数据导入导出备份以及事务、存储引擎
MySQL之数据导入导出备份以及事务、存储引擎 数据导入 作用:把文件系统的内容导入到数据库中 操作步骤: 1.在数据库中创建对应的表 create table userinfo(  username varchar(20), .
1847 0