Nginx

网站完成调整

从前天开始进行测试,到今天上午完成了配置,我的网站完成了后台调整,从过去的 LNMP 切换到了 Docker 服务,也把 URL 的配置格式从目录切换到了子域名。

上个月我写了《或许我应该切换到子域名》这篇文章,讲了一些关于网站部署的想法。这次是把这篇文章中的想法进行了实践,并且也使用了 Docker。起因是我偶然间读到了这篇文章,里面对使用 Docker 来部署一个 WordPress 讲的非常清晰,特别是里面使用了 Nginx Proxy Manager (NPM) 这个工具,之前我从来没听说过它,让 Nginx 配置的一切都图形化了,而且支持自动申请 Let’s Encrypt SSL 证书,解决了我过去尝试中遇到的难题。我通读了下来,心想这并不复杂呀,于是也萌生了尝试的念头。

因为我之前还有 credit 没用完,所以我在 Linode 上面下单了一个最小的 VPS 实例,并把一个二级域名解析到上面。一开始我安装 Docker 这一步就遇到点问题,我开始的时候为了通用性,尽量避免兼容问题,选择了 Ubuntu 24.04 操作系统,结果遇到些挺奇怪的错误。软件仓库里有好几个版本的 Docker,我是新手也完全不确定该用哪一个。后来我按照网上的说明选了一个安装上去,在执行 docker compose 命令的时候也发生了 Python 的异常,在新的服务器上不大应该。于是我第二次选择了 Debian 12,也是我目前在用的 OS。这次我直接看 Docker 的官方网站上的说明,添加了 Docker 官方源,安装的里面的 stable 版本,之后比较正常了。

这次我遇到了一些问题,到最后基本都解决了。很多问题是我自己粗心导致的,比如在 NPM 中配置代理后访问时的 500 错误。现在看来是当时自己粗心,之前每怎么用过 Docker,看到一个内部 IP 就凭直觉往里填 127.0.0.1,后来才知道应该填 172.17.0.1。还有就是博客的 URL,怎么让他不带端口号,也不要自己跳转到无法访问的形式也让我想了半天。后来我发现应该配置好了代理和SSL之后,再访问 WordPress 完成安装,在后台设置中一切就正确了。我在测试服务器上把 WordPress 当前的配置都迁移过去,包括 Markdown 解析、主题字体设置,而且我发现现在 WordPress 导入支持把原本的媒体文件也导入进当前的服务器,文章里面的链接 URL 也被升级过了,省了很大的功夫。之后我还在申请通配符 SSL 证书那里遇到了麻烦,DNS 验证通不过,之后我发现我提交的是 DNSPod 后台的腾讯云 API,改成 token 之后问题也解决了。

成功配置好了 Nginx + uWSGI + MoinMoin

昨天晚上加班前,我去星巴克喝了一杯冰美式,加上周末白天我睡的比较多,因此晚上回家就睡不着了,于是就继续研究 MoinMoin 在 Nginx 上的配置。最终配置成功。

总结:我大概是有段时间没有碰 Linux 服务器了,因此对一些信息提示太不敏感了,完全忽略了错误信息的本意,并且忘记了上网搜索的方法,反而像一个菜鸟一样,照着文档的葫芦画瓢,遇到了和自己实际情况不一样的地方,就束手无策。另一方面,Linux 系统发行版众多,很多发行版有自己的一套工具,这就导致了配置命令的多种多样。加上 Python 和 uWSGI 的配置又比较麻烦,因此网上的文档不能做到面面俱到,实际上这方面的文档比起 WordPress 的配置要少很多,我这次也算是吃了这方面的亏。

我一开始是按照 DigitalOcean 给出的 How To Install MoinMoin with Nginx on Ubuntu 14.04 来一步一步的操作的,一开始比较顺利,直到文档要我执行 sudo start moin 这个命令时,系统提示我找不到 start 命令,我一下子傻掉了,不知道该怎么进行,而且根据我有限的 Linux 经验,我也从没见过一个叫 start 的命令。用 tab completion 得知,系统有一个 start-stop-daemon 命令,我想也许版本不同换成了这个?于是就在周六的下午研究它的命令行参数,走了不少弯路,到最后也没有成功。

之后我还参考过 Nginx 的网站,结果让我更加困惑,只是草草的给了我一小段配置片段,就没有其它任何内容了。我在 Google 上用 Nginx 和 MoinMoin 做关键词搜索,得到的结果和 DigitalOcean 的大同小异,都是在 start 这一步上卡住了。

到了昨天晚上,我决定不按照 DigitalOcean 的文档里来操作,而是先把我在 Linode 上的 MoinMoin 实例复制过来,毕竟到最后还是要转移数据的。为了不影响我目前在 Vultr 服务器上的 WordPress,我在 DigitalOcean 里新建了一个 droplet,专门用来配置 MoinMoin。我重新执行了一下文档里的东西,最后依旧是在 start 这一步上受挫。

大手术

最近我的网站服务器运行的比较糟糕,特别是博客部分,经常发生 500 错误,有的时候 MySQL 会被 mercy killed,导致 WordPress 无法连接到数据库,博客就挂掉了。

过去我买的比较廉价的 VPS,因此时不时就要捣鼓一下,不过自从我买了 Linode,就比较少的去上 VPS,所以近几年对 VPS 的了解也差了很多。VPS 资源不足的时候,一点资源就要精打细算,因此控制的比较好。后来的 VPS 的内存有了 1GB,想比起过去条件好了许多,我就没有在意控制,甚至编写过一个 Rails 应用,后台用的 MySQL InnoDB 引擎,那时候就觉得内存没有不够的时候。

后来经历过 MySQL 升级,默认的引擎变成了 InnoDB,我旧的配置文件一度导致 MySQL 无法启动。从那之后,我基本上没有再在意过 MySQL 资源优化的问题。这导致的问题就是,MySQL 进程经常被杀死,因为 VPS 的内存被用光了。然后我采用了一些办法,不过收效不大,最后我给博客加上了 WP Super Cache 插件,这样哪怕数据库挂掉也能访问一些页面。然后上周五写了几篇文章,发布的时候竟然出现了 500 错误,这简直不能忍受。刷新了几次发布成功文章后,我就考虑修正一下这个问题。

我想计划是不用 Apache 了,采用 Nginx。我刚用 VPS 的时候,内存很小,才 80M,当时就知道 Nginx 占用资源和 Apache 相比不是一个数量级的。当然 Apache 有它的好处,寿命很久的工程有很多插件,比如 WSGI,我安装 MoinMoin 非常方便,在 Nginx 下就要费一些事。再就是 .htaccess 等功能,Nginx 下使用不同的语法,要改变也很麻烦。不过,现在出现了资源不足的问题,我还是决心做一个尝试。我的 VPS 上目前跑的东西也不多了,主要是一个 WordPress 的博客和一个 MoinMoin 的 wiki,之前自己的 Rails 应用也不跑了,有一个 Awstats 在运行,不过现在看的也不多。

Nginx 重定向

过去因为一直弄不好我的 blog 里的 Google Analytics 插件的设定,导致在 WordPress 后台的 Dashboard 里面无法显示 Google Analytics 的报告,因此我过去几个月都没有怎么去看 Google 的统计工具。昨天把这事搞定了,于是我也看了一下网站统计方面的信息。当我看到 Google Webmaster Tools 里报告的 189 项 Not found 抓取错误时,觉得应该处理一下子了。

之所以搞得这么难看,是因为我过去切换 blog 系统的 URL 设定的缘故。最早我用的是 WordPress,当时用的是 /year/month/slug/ 的 URL 格式,后来我学会了 Movable Type,于是就把 URL 的格式弄成了 Movable Type 默认的 /year/month/slug.html 格式。当时为了把搜索引擎索引的旧的 URL 都改过来还花了好多功夫。后来我实在是不想再用 Movable Type 了,就把 blog 程序换回了更有前途的 WordPress,URL 格式我也切换回来了,毕竟这是 WordPress 里比较常用的。Movable Type 是生成的静态页面,因此用 html 格式比较自然,WordPress 是动态页面,自然就比较倾向于子目录的格式。

切换了 URL 格式,过去的页面就自然无法访问了。我在第一次切换成 Movable Type 的时候,就为此费了心思。当时用的是虚拟主机,web 服务器自然是 Apache,我就捣鼓了一阵 .htaccess,让旧的 URL 可以自动重定向到新的下面。这次也是如此,不过是反过来了。而且这次我用的是 VPS 主机,资源不容许跑 Apahce,所以我用的 web 服务器是 Nginx。Nginx 不支持 .htaccess,因此我要修改 Nginx 的设定。通过搜索,相关代码如下:

VPS 转移

我在这次购买新的 VPS 的时候之前的一段时间里,由于长时间没有上 VPS 的终端,因此对于 VPS 的一些设定什么的都忘的差不多了。那时我一直对于再次登陆 VPS 的终端有种排斥的感觉。当我的新 VPS 开通后,如何转移数据让我头疼了一阵子。好在现在已经转移成功,我可以写一篇文章把当中出现过的一些问题给记录下来,之后再遇到类似情况可以轻松一些。

其实 Linux 系统的数据转移很简单,反正都是文件,开通 FTP 之后镜像一下就一切搞定。不过我在之前的一篇文章中说过,我这次想要用与过去不同的软件来搭建主机,所以有些东西需要重新配置。对于新软件不熟悉,导致了这次的一些问题的发生。不过这也是一次学习机会,通过这次转移,我又积累了一些服务器方面的经验。

先说一下我过去用的软件吧:Debian 5.0 + Lighttpd + PHP-CGI + MySQL + phpMyAdmin + MemCache + Exim4 + vsftpd。我这次用的软件为:Debian 6.0 + Nginx + PHP-FPM + MySQL + Exim4 + vsftpd。操作系统方面都是 Debian,没什么问题。Web 服务器需要重新配置。我过去用过 Nginx 建网站,不过当时用的也是 PHP-CGI,所以有些参数的位置不同。数据库方面,我过去的所有操作都是通过 phpMyAdmin 来完成的,而对于用 SQL 语句来操纵用户权限,我没有接触过。我的站点规模都很小,因此从之前的经验上看来 MemCache 没有起太大的作用,所以这次就没有再用它。其它的邮件和 FTP 服务器都是一样的。

Web 服务器

Nginx 和 Lighttpd 的配置都挺简单的,看一下例子把内容按照自己的需求修改一下就可以了。不过因为用的软件不同,有些配置都变了位置。比如说 PHP 进程的个数,原来在 Lighttpd 的配置文件里可以设定,现在需要去 /etc/php5/fpm/pool.d/www.conf 里面设定。

我这次使用 WordPress 遇到了几次内存限制的问题。由于缓存方面配置的失误(缓存那部分说),我没有通过转移数据库的方式来转移 blog,而是在新 VPS 上新安装了一个 WordPress,然后从旧的 WordPress 那里选择 export 后再在新 WordPress 那里 import。本来我觉得这么操作不会有任何问题的,结果上传文件的时候我收到了这样的错误信息: