怎么给Node.js后端项目启用https+域名访问接口? 时间: 2024-08-26 17:19 分类: 猿码 热度: 241°C 评论 一般而言我们在自己本地调试 Node.js 项目的时候,无一例外都是通过 `http://localhost:` 后接具体的接口 url 地址来进行接口访问。但是当我们本地开发完成之后,需要在我们自己的服务器上面进行项目的部署,这也就意味着在服务端启动的项目需要使用 `http://<服务器公网IP地址>:<后端服务启动端口>` 来进行访问。 这样乍一听是不是也没什么问题?但是当我们的前端项目已经部署好,并且已经成功的绑定了 https 与域名,这个时候如果再去访问后端的 http 的接口, **极大概率都会被浏览器本身的安全策略给拦下来,理由是 https 访问 http 类型协议的资源,很容易造成安全隐患**。 这个时候我们意识到, **后端的服务不可能永远使用 http+IP 地址的形式进行访问,成熟的项目必将使用 https+域名的形式来访问服务。** 因此,在这篇文章中我将给出我为我自己的后端项目配置 https+域名的过程,供有需要参考的同学借鉴学习。 ##前置准备 既然是需要使用 服务器+https+域名,那么**服务器、域名、和启用 https 所需的 SSL 证书** 都必不可少。 ####服务器: 推荐阿里云、腾讯云或华为云这样的厂商的服务器,比较稳定。 - 阿里云服务器:https://iil.ink/aliecs - 腾讯云服务器:https://iil.ink/tengxuncvm - 华为云服务器:https://iil.ink/huaweiyunyouhui ####域名: 域名的准备相对比较简单,直接去各大类型的云服务提供商如阿里云、腾讯云、AWS 等去搜索“域名注册”,然后输入一个自己喜欢的域名看看能不能买。 一般对于服务器的域名而言,比较常见的是采用 api.example.com 这样格式命名居多(Pixiv 就是这样的格式),我自己使用的是 nonhana-server.cn ,我觉得意思到了即可。 ####SSL证书: 目前国内很多大厂子的免费SSL证书,现在都把1年的期限调整为3个月了,每3个月一换太麻烦了,这里推荐一个可以免费15年的免费SSL证书。参考下面的教程: ####[轻松搞定SSL证书自动续签,解决免费证书每3个月失效问题](https://blog.gaomeluo.com/archives/xuqianssl/ "轻松搞定SSL证书自动续签,解决免费证书每3个月失效问题") 上面的准备完成之后,就要把域名绑定到服务器上,域名解析绑定的教程略 ##在原生 Express 项目中接入 上述步骤全部完成之后,就可以开始进行在 Express 项目中的接入了。 我们在上述步骤中已经完成了对 ssl 证书的下载,其中包括了 pem 格式以及 key 格式。 首先,我们将这两种格式的证书复制到你的项目的静态资源目录下面。在我个人的项目中就是 `/public/ssl` 目录下。 然后,我们在服务启动脚本 `/bin/server.ts` 中,把原本启动服务的方法改写成一个函数。这个函数首先通过环境变量获取当前的环境类型,判断当前项目所处的环境是开发环境(development)还是生产环境(production),如果是开发环境则不启用 https+域名访问;如果是生产环境则采用 https+域名进行访问。最后通过调用这个函数来启动服务,即可。 而具体究竟是怎么启用 https+域名进行访问的呢?这个是怎么实现的呢?这就借助了 express 项目中内置的 `https` 模块。我们首先在最上方进行这个模块的导入: `import https from https` ,然后再调用它提供的 `createServer()` 方法,传入配置项以及 express 项目的核心脚本 `app.ts` 从而启动服务。而我们的证书,就是在 `createServer()` 这个方法的第一个参数中传进去的。 具体可以参考一下我自己的实现代码: import dotenv from "dotenv"; import http from "http"; import https from "https"; import fs from "fs"; import path from "path"; import app from "../app"; import debug from "debug"; /** * 读取环境变量配置。 */ dotenv.config(); // ...其他的配置 /** * 定义创建 HTTP/HTTPS 服务器的函数: * 如果是生产环境,则使用 HTTPS 创建服务器,否则使用 HTTP 创建服务器。 */ function createServer() { if (process.env.NODE_ENV === "production") { const options = { key: fs.readFileSync( path.join(__dirname, "../public/ssl/nonhana-server.cn.key") ), cert: fs.readFileSync( path.join(__dirname, "../public/ssl/nonhana-server.cn_bundle.pem") ), }; return https.createServer(options, app); } else { return http.createServer(app); } } const server = createServer(); // ...其他的配置 在这里我采用的是 `dotenv` 这个第三方库来实现对 `.env` 环境变量的读取操作。 我们可以看到,我这边的配置项 `options` 实际上就是一个对象,里面放了两个属性 `key` 以及 `cert` 。 `key` 对应的就是 `.key` 格式的证书,而 `cert` 对应的就是 `.pem` 格式的证书,直接通过 `path` 模块进行导入就可以了。 完成之后,我们只要在服务端把 `.env` 中的 `NODE_ENV` 字段改为 `production`,然后再确保证书已经配置 OK,就可以使用 https+域名来进行访问你的后端项目了。 ###扩展阅读: 【[如何优化Vue项目性能?](https://blog.gaomeluo.com/archives/vuexingnengyouhua/ "如何优化Vue项目性能?")】 【[Nginx如何配置一个静态WEB服务?](https://blog.gaomeluo.com/archives/nginxpeizhiweb/ "Nginx如何配置一个静态WEB服务?")】 【[如何在CentOS 7上安装Odoo 12](https://blog.gaomeluo.com/archives/centos7odoo12/ "如何在CentOS 7上安装Odoo 12")】 【[如何在Ubuntu上创建安全的SFTP服务?](https://blog.gaomeluo.com/archives/ubuntusftp/ "如何在Ubuntu上创建安全的SFTP服务?")】 【[如何在 Ubuntu 上安装 Nagios?](https://blog.gaomeluo.com/archives/UbuntuNagios/ "如何在 Ubuntu 上安装 Nagios?")】 【[如何在 CentOS 8 上安装 OpenCV?](https://blog.gaomeluo.com/archives/CentOS8OpenCV/ "如何在 CentOS 8 上安装 OpenCV?")】 【[如何在 Ubuntu 上安装和使用 Nginx?](https://blog.gaomeluo.com/archives/UbuntuNginx/ "如何在 Ubuntu 上安装和使用 Nginx?")】 标签: Linux 服务器 Nginx ssl证书
评论已关闭