一个思维惯性导致的问题

最近的资讯可视化项目,在将测试页面部署到服务器的过程中,我遇到了一些问题,现在记录下来作为经验总结。

系统版本升级的必要性与数据丢失

首先遇到的问题是服务器系统版本过低。我的服务器目前使用的是 CentOS 7,这个版本无法支持我们的程序运行,因为程序依赖于 Node.js 18 以上的版本,而我本地开发使用的是 Node.js 20 版本。

为了在系统上升级 Node.js,我发现需要先升级 glibc,但是由于 CentOS 7 版本过低,无法支持 glibc 的升级。因此,我不得不将整个系统版本进行升级,从 CentOS 7 升级到 CentOS Stream 9。

然而,在升级过程中我犯了一个严重的错误。虽然腾讯云提示系统升级时数据盘的数据可以保留,但我错误地认为自己配置过数据盘。实际上,我只是在系统默认的系统盘上创建了一个分区来存储数据,包括之前部署的静态页面、微信小程序页面,以及各种测试和 demo 页面。由于单独的数据盘需要额外付费,而我之前并未付费购买,所以根本没有独立的数据盘。

这导致系统升级后所有数据都丢失了。幸运的是,出于谨慎考虑,我在升级前制作了系统镜像。通过这个镜像,我成功将系统恢复到升级前的状态,找回了丢失的数据。

之后,我先执行了数据库备份,将数据备份到本地电脑上,然后重新进行系统升级。升级完成后,我安装了必要的软件,包括 Nginx(使用 OpenResty)、Node.js(通过 NVM 管理版本,这样更加方便)以及 Git 等工具。

跨域问题的解决方案

第二个遇到的问题是请求跨域。我们的程序需要调用 AInvest 接口,根据资讯 ID 获取资讯原文,这是 AInvest 方提供给我们的接口。但是我的测试页面是前端页面,直接发请求访问他们的接口时会存在跨域问题。

在本地开发时,这个问题并不存在,因为我启动了一个 dev server,通过代理转发解决了跨域问题。但是当我将程序构建为静态页面部署到服务器上时,由于已经 build 成静态页面,就没有了代理转发功能。

最初,我想在服务器上也启动一个 dev server 来做转发,这也是为什么我坚持要升级系统和 Node.js 的原因。当系统升级完成、Node.js 也安装好后,我确实成功启动了服务。程序通过 localhost 的 3333 和 3334 端口提供服务,但是新的问题随之而来。

由于用户是通过域名访问服务器页面的,我需要将域名形式的请求转发到这些端口上。在配置转发规则的过程中,我发现存在一些问题,包括静态资源文件的请求转发等,这些配置一开始没有配置好,尝试了几次都没有成功。

问题的简化解决

在配置过程中,我突然意识到自己把问题复杂化了。为什么要启动 dev server 呢?我完全可以直接在 Nginx 上做转发。具体做法是:将前端对 AInvest 接口的请求通过 Nginx 转发到我自己的域名下,然后前端不再直接访问 AInvest 的接口,而是访问我转发后对外提供的接口,这样就可以解决跨域问题了。

采用这种方式,我既不需要升级系统,也不需要部署 dev server。最终,我通过配置 Nginx 转发就解决了问题。

反思

回过头来看,我发现自己绕了一大圈,前面做的很多工作都是无用功。这主要是因为方案没有确定好,而且在处理问题时思路有些混乱,把一个本来很简单的问题复杂化了。

这也反映了惯性思维的影响。因为我在本地开发时习惯用 dev server 进行转发,所以自然而然地想在服务器上也采用同样的方式。这是一个典型的因思维定势和惯性所导致的决策错误案例。