Node.js + Nginx 部署 HTTPS 服务

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

今天,经过无数次折腾,向往已久的域名备案终于下来了。于是迫不及待地将个人博客网站进行 HTTPS 部署迁移,中间遇到一些坑,在此做个记录。

原因

之所以要将网站从 http 迁移到 https,原因有:

  • https 更安全,相对于 http 可以较为有效防止中间人攻击,每个项目都希望安全托底。博客虽然没有重要数据,但不失为练兵的好地方。
  • 如今 HTTP2 越来越受人关注,它可以提高访问速度,而 HTTP2 的前提就是 HTTPS

步骤

  1. 安装证书
  2. nginx 反向代理
  3. 更改前端连接方式

安装证书

为什么需要证书?这和 HTTPS 协议的设计有关。 HTTPS,指的是 Hypertext Transfer Protocol Secure,另外也也可以称为 HTTP over SSL 或者 HTTP over TLS。通俗一点,HTTPS 通过 Http 协议传输数据,SSL/TLS 加密数据。

它是如何实现加密的呢?

首先,浏览器厂商预先安装了各个 证书颁发机构 的证书,用于对访问网站进行安全验证 然后,个人向 证书颁发机构 申请个人证书,并将证书应用于服务器配置中。 之后浏览器访问服务器,获取公钥,将其与已有的证书列表匹配,决定是否继续。 如果通过,浏览器通过公钥与服务器通信,协商两个非对称私钥,用于各自的数据传输加密,从而建立的加密通道,防止中间人窃听。

如何安装证书? 向证书颁发机构申请证书即可。目前的机构有Symantec、Comodo、GoDaddy 以及 Let's Certbot。这里我们选择免费的 Let's Certbot

在官网上有详细的说明。我的环境是 Linux 16.04 Nginx,其他的环境可以参照官网说明:

#####安装:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx 
复制代码
开始
$ sudo certbot --nginx certonly
复制代码
自动续期

可以参考 这里

根据提示,顺利安装完毕。这里有个前提,就是服务器要有域名,而国内的域名都需要按照工信部要求备案,这也是为什么我需要等待大半个月的原因。

反向代理

证书安装完毕,如果部署在 nginx 中的是静态页面,那么此刻已经顺利部署了 HTTPS 服务。但是更多的应用场景中,我们一方面提供静态服务,如 img、js、css 等等,另一方面我们也需要 REST 服务。 但是此刻,当我们通过 axios 或者 vue-resource 这样的 HTTP client 库来访问 Node.js 服务 API 来获取数据,发现浏览器禁止了该连接。原因是在部署 HTTPS 服务后,整站都要使用 https 来进行数据传递,包括资源的获取,GET/POST 请求等等。

如何解决?我在这走了一些弯路。当时想,因为是访问 Node.js 服务器的 API,我知道 Node.js 是支持 HTTPS 服务的,所以想当然在 Node 中使用 Openssl 来进行自认证。网上有很多类似的教程,但是在浏览器中,对于自认证的证书并不认可。所以这种方法可行但不适用于其他用户访问,更不能应用于生产环境。这里推荐几个工具:

第一个是可以发送模拟浏览器发送各种请求,对于测试 API 来说十分方便 第二个之所以在这里推荐是因为我一开始使用 Chrome,但给出的错误提示很模糊,而 Firefox 在 Network 中对于 Request/Response 错误信息会更直白,在这个问题上帮了我很多忙。

正是 Firefox 给出的提示:xxxx 提供了不支持的自签名证书..,我知道自签名走不通,于是往 Nginx 上考虑了一下,想到 nginx 有反向代理功能,如果说,做一个 api 的反向代理,导航到 node 服务端口,会不会有用呢?于是在网上查找了 Nginx 反向代理的教程,操作如下:

/ete/nginx/site-available/default 中:

location /api {
 proxy_pass http://localhost:8089;
 proxy_buffering on;
}
复制代码

重启 nginx,重启 node 服务。

success!

这样,我们通过反向代理让 REST 服务无需担心证书问题,因为 Nginx 已经做了这一部分工作。

更改前端连接方式

这一部分可选,因为我之前使用的是 vue-resource,连接使用 this.$http 所以无法对 HTTPS 进行连接,解决该问题,可以:

  • 使用 axios,简单优雅处理

最后

整个过程写的比较乱,原因还是自己对 SSL/TLS 的底层协议不熟悉,而且 Nginx 也是新学,反向代理之前只有所耳闻,并没有实际操作过。但不得的说,Nginx 的配置方式比较友好,一看就明白它是什么意思。所以配置起来也不复杂。

接下去会把这部分在深入一点,写一个系列吧。


作者:allenWang
链接:https://juejin.im/post/5b1945b26fb9a01e554c042e
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章
|
2月前
|
弹性计算 运维 监控
快速部署 Nginx 社区版
Nginx是一个高性能的HTTP和反向代理服务器。Nginx在计算巢上提供了社区版服务,您无需自行配置云主机,即可在计算巢上快速部署Nginx服务、实现运维监控,从而方便地基于Nginx搭建您自己的应用。本文介绍使用如何通过计算巢快速部署Nginx社区版。
快速部署 Nginx 社区版
|
2月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实战指南
【9月更文挑战第6天】在数字化时代的潮流中,后端开发作为支撑现代Web和移动应用的核心,其重要性不言而喻。本文将深入浅出地介绍如何使用Node.js及其流行的框架Express来搭建一个高效、可扩展的后端服务。通过具体的代码示例和实践技巧,我们将探索如何利用这两个强大的工具提升开发效率和应用性能。无论你是后端开发的新手还是希望提高现有项目质量的老手,这篇文章都将为你提供有价值的见解和指导。
|
3月前
|
消息中间件 JavaScript 中间件
函数计算产品使用问题之WebIDE编写的Node.js代码是否会自动进行打包部署
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
JavaScript 前端开发 中间件
构建高效后端服务:Node.js与Express框架的完美搭档
【8月更文挑战第28天】在追求高性能、可扩展和易维护的后端开发领域,Node.js和Express框架的组合提供了一种轻量级且灵活的解决方案。本文将深入探讨如何利用这一组合打造高效的后端服务,并通过实际代码示例展示其实现过程。
|
1月前
|
前端开发 JavaScript 应用服务中间件
使用nginx部署网站
使用nginx部署网站
|
1月前
|
JavaScript 应用服务中间件 nginx
nginx部署vue项目
本文介绍了将Vue项目部署到Nginx的步骤,包括构建Vue项目、上传dist文件夹到服务器、安装Nginx、配置Nginx代理静态文件以及重启Nginx,确保了Vue应用可以通过域名或IP地址访问。
88 1
|
1月前
|
前端开发 JavaScript 应用服务中间件
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
本文是一篇详细的教程,介绍了如何在Linux系统上安装和配置nginx,以及如何将打包好的前端项目(如Vue或React)上传和部署到服务器上,包括了常见的错误处理方法。
177 0
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s基础使用--使用k8s部署nginx服务
本文介绍了Kubernetes中核心概念Deployment、Pod与Service的基本原理及应用。Pod作为最小调度单元,用于管理容器及其共享资源;Deployment则负责控制Pod副本数量,确保其符合预期状态;Service通过标签选择器实现Pod服务的负载均衡与暴露。此外,还提供了具体操作步骤,如通过`kubectl`命令创建Deployment和Service,以及如何验证其功能。实验环境包括一台master节点和两台worker节点,均已部署k8s-1.27。
138 1
|
2月前
|
应用服务中间件 nginx Docker
docker应用部署---nginx部署的配置
这篇文章介绍了如何使用Docker部署Nginx服务器,包括搜索和拉取Nginx镜像、创建容器并设置端口映射和目录映射,以及如何创建一个测试页面并使用外部机器访问Nginx服务器。
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
下一篇
无影云桌面