Mayx的运维笔记 | Mayx的博客
Author: mayx
Description: 新年新Bug！
Date: 2020-01-05T00:00:00+08:00

5 January 2020 - 字数统计：2306 - 阅读大约需要7分钟 - Hits: Loading...

# Mayx的运维笔记

by mayx

这是一篇创建于 天前的文章，其中的信息可能已经有所发展或是发生改变。

AI摘要

这篇文章记述了运维人员新年期间遇到的问题，花火学园的服务器宕机，原因是数据库连接问题。在经历重启失败、故障排查后，发现用户表出现问题，通过重置解决问题。为了提高稳定性，运维决定迁移服务器，从Ubuntu迁移到CentOS，并使用LEMP应用。迁移过程中包括数据库和文件备份、新服务器部署、DNS设置、CDN配置以及基础环境优化（如BBR和Swap安装）。在优化过程中，运维尝试使用UNIX domain sockets，但遇到了权限设置问题，后来调整了MySQL连接配置。此外，还发现并处理了postfix和日志记录的问题。最后，运维反思了之前的问题，并计划分开开发环境和主站服务器。

- 开端
- 重建的过程
- 之后的优化
- 后记

新年新Bug！

#
开端

前天，我维护的花火学园宕机了，由于在上面安了乱七八糟的各种各样的东西，所以我以为它只是日常卡机，所以我就随手重启了一下。

重启完之后，它凉了，不知道为什么，数据库连不上了……于是我开始问另外一个同样可以登录服务器的人，问他有没有动过数据库，结果听起来貌似他好几个月都没登服务器了。于是我慌了，试着手动启动MySQL的服务，然而黑色的界面里冷冰冰的`Job for mysql.service failed`告诉我事情没有那么简单。我按照错误的提示查看了详细信息，然而里面也只是简单的记录了一句`mysql.service: Main process exited, code=exited, status=1/FAILURE`这样通俗而又简单的一句话……这和没说有什么区别……谁都知道它启动失败了……

没办法，这时候只能向网站的上一代运维求助了 （向大佬低头） ，经过大佬不知道什么样的操作，终于找到了真正的错误详细信息，看起来好像是数据库中的用户表出了问题。于是大佬重置了用户表，总算是勉强把MySQL服务重新启动了。

不过虽然这时候再做一些简单的配置，应该差不多就可以重新上线了，不过考虑了一下，为了让以后不会再出现乱七八糟的事，我打算把网站重新迁移一遍，让系统环境做一个大更新！

#
重建的过程

首先重新租一台服务器吧，之前用的是Ubuntu的服务器，现在一年过去了，也该考虑考虑稳定性的问题了，于是我把系统换成了CentOS。

然后为了之后配置起来方便一些，我依然决定使用服务器商已经配置好的LEMP应用，这样建好以后我也不用再考虑安装服务器软件的问题了。

在新的服务器部署的过程中，我回到原来的服务器，开始打包网站的数据库和文件，做好向新的服务器转移的准备。

没多久，新的服务器就部署好了，于是我直接一个`scp`就把所有的文件传到了新的服务器上。不得不说，服务器直接传输文件的速度是真的快，几个GiB的文件几分钟就传完了。顺便感叹一下，花火学园的数据居然也都好几个GiB了，想当年我接手的时候还不到2GiB。

然后就是导入数据库和解压网站文件，以及配置Nginx，完成以后，网站不出所料的可以正常使用了。

然后就是设置DNS之类乱七八糟的事，以及Cloudflare的CDN之类的，不过还好之前设置过防火墙白名单的配置，这次也方便了不少。

不过这还没完，既然换了新的服务器，而这一年里我对服务器的了解也更深了一些，至少应该做一些优化吧。

所以呢，我就先把BBR给装上了，搞太多东西也很麻烦，所以我就直接用了一键脚本。顺便又搞了Swap，毕竟服务器只有1GiB的内存，是应该多搞点内存，虽然可能速度会降低，但还是求稳嘛，而且服务器好像是SSD的硬盘，应该影响不大。

到这里，基础的环境部分我就自认为搞好了。

#
之后的优化

到了第二天，我又心血来潮，想再搞点别的东西来优化服务器，首先我的目标是把对内的TCP/IP sockets全部换成UNIX domain sockets，用UNIX domain sockets可以减少不少系统开销，所以我首先对PHP-FPM开刀。

其实改起来也很简单，就是把PHP-FPM的配置文件中的`listen`项从IP地址换成文件，然后把Nginx中的`fastcgi_pass`改成带`unix:`前缀的文件就OK了。我改完之后真就以为OK了，但是现实中的`502 Bad Gateway`打破了我的幻想，看来没那么简单……

后来我仔细看了一下PHP-FPM文件的注释，发现了一句警告：

    ; WARNING: If you switch to a unix socket, you have to grant your webserver user
    ;          access to that socket by setting listen.acl_users to the webserver user.

哦哦，原来是要设置`listen.acl_users`……然后我把nginx加了进去，重启之后它就好了。

之后我打算优化一下MySQL，不过我也不是很清楚MySQL中怎么设置UNIX domain sockets，本来是打算就此放过，不过我听说好像数据库连接中用`127.0.0.1`要比`localhost`要好，因为少了一次解析。我听着感觉好像有那么点道理，然后就去把网站配置的数据库地址给改了。

不过后来发现查了一下，发现好像MySQL对`localhost`地址有特殊规定，在MySQL中如果使用`localhost`，那么连接就会走UNIX domain sockets，而使用`127.0.0.1`就会和平常一样走TCP/IP sockets。

看完之后我感觉有那么点不爽啊，然后就回去又把我的数据库地址改了回去，不仅如此，我还打算关掉3306端口，后来查了一下，发现在配置文件中加入`skip-networking`就可以了。

之后我查看了一下端口，除了443端口和我的SSH的端口外还有一个奇怪的25端口，看着感觉很不爽，查了一下是postfix的端口，然后我一个不爽就把postfix随手卸载掉了。

再往后，我看了看我的Nginx日志，发现大小有那么点不对劲，才建的服务器日志已经有400-500MiB了？！虽然花火学园平时流量不算小，但也不至于这么夸张吧？后来我发现我没有过滤静态资源的日志，之后又修改了一下配置文件，心里就舒服多了😁。

于是，花火学园的优化就到此结束。

#
后记

我其实应该仔细看看日志的，向莫名其妙出现的BUG说不定是攻击？ （被害妄想症23333） 后来我翻了翻日志好像也没这个倾向。

另外我确实不应该把正在开发中的项目和主站放在同一个服务器，至少鸡蛋也不应该放到同一个篮子里面嘛……这次我打算做好主站的所有配置，保证它的正常运行。

tags: 运维 - 笔记 查看原始文件

#### 推荐文章

Loading...

上一篇：年终总结
下一篇：Mayx的运维笔记 - 应用优化
想问这篇文章
召唤伊斯特瓦尔