第13课:如何配置

第13课:如何配置 Nginx 的 HTTPS

Nginx 是一款开源的高性能 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器;Nginx 可以作为一个部署静态资源的 HTTP 服务器,也可以作为反向代理实现负载均衡。本文以 Windows10 操作系统为例,给大家分享如何搭建部署静态资源和作为反向代理的 Nginx HTTPS 服务器。

环境准备

Nginx 下载地址详见这里

如下图所示,笔者下载的版本是 nginx-1.13.12,下载完成后解压即可。

enter image description here

解压完成后,文件目录结构如下图。同时,笔者在此目录下创建 ssl 文件夹,用于存放下文配置 Nginx 时生成的私钥以及证书。

enter image description here

打开 cmd 进入 D:\nginx-1.13.12 目录下,执行 start nginx 命令,启动 Nginx 服务器。

enter image description here

打开浏览器,输入地址:http://nginx-web-01,访问页面,若出现如下页面则表示启动服务成功。

enter image description here

如何使用 Nginx 部署静态资源

在生产环境时,大型网站的静态资源一般都会进行独立部署。优点如:静态资源与动态内容分离,有利于部署 CDN;启用新的一级域名,每次请求,浏览器都不会携带 cookie,这对于 cookie 内容比较大,并且流量大的网站会省去不少宽带费用等等。下面笔者将会给大家介绍如何使用 Nginx 部署静态资源。

基于 HTTP 的 Nginx 部署静态资源

首先,创建一个静态网页,如 home.html,如下图所示:

enter image description here

修改 nginx.conf 文件,用于 Nginx 处理静态资源,同时修改 server_name 为 nginx-web-01。

enter image description here

在 Nginx 的 html 文件夹中创建 page 文件夹,然后将 home.html 复制到 page 文件夹中。输入地址:http://nginx-web-01/page/home.html,出现如下页面表示访问成功。

enter image description here

注意:每次修改 Nginx 的配置文件后,必须重新加载 Nginx 的配置文件,执行命令:Nginx -s reload。大家切记不要重复启动 Nginx 服务,不要问笔者原因,只能告诉大家这是通过血与泪的教训得出的。

基于 HTTPS 的 Nginx 部署静态资源

1. 使用自签名的 SSL 证书配置 Nginx

在《第02课:OpenSSL 快速入门》中,笔者已经给大家介绍了如何使用 OpenSSL。下面将使用 OpenSSL 进行一次实战演练,同时也帮助大家回顾复习 OpenSSL。假设我们已经安装并配置了 OpenSSL,其步骤如下:

(1)生成服务器的私钥,输入命令:

openssl genrsa -des3 -out server.key 1024

enter image description here

(2)生成一个证书请求,输入命令:

openssl req -new -key server.key -out server.csr

然后填写生成 server.key 设置的密码,填写的相关信息如下:

  • Common Name (e.g. server FQDN or YOUR name) []: nginx-web-01
  • Country Name (2 letter code) [AU]: CN
  • State or Province Name (full name) [Some-State]: Shannxi
  • Locality Name (eg, city) []: xian
  • Organization Name (eg, company) [Internet Widgits Pty Ltd]:51TalkDocter
  • Organizational Unit Name (eg, section) []: IT
  • Email Address []: chancein007@163.com

enter image description here

注意:上述需要输入信息中最重要的为 Common Name,这里输入的域名即为我们要使用 HTTPS 访问的域名。

(3)生成一个解密的 key 文件, 这样会使得 Nginx 配置 SSL 安全证书重启免输入密码。输入命令:

openssl rsa -in server.key -out server.key.unsecure

enter image description here

(4)根据私钥和 csr 文件生成 crt 证书文件,输入命令:

openssl x509 -req -days 365 -in server.csr -signkey server.key.unsecure -out server.crt

enter image description here

(5)为 Nginx 配置私钥以及生成的证书,修改 nginx.conf 文件,找到如下内容:

enter image description here

更改后,内容如下:

enter image description here

(6)打开浏览器,输入地址:https://nginx-web-01/page/home.html,访问页面,出现如下页面表示访问成功。

enter image description here

会发现这个证书是不被浏览器信任的,并给出了一个证书错误的提示,那接下来我们便会解决这个问题,欲知详情,请继续观看下文。

2. 使用私有 CA 签名的 SSL 证书配置 Nginx

下面笔者会使用《第04课:使用 XCA 管理和生成 SSL 证书》中已经生成的私有根 CA 证书签署上文使用 OpenSSL 生成的证书请求。其步骤如下:

(1)导入证书请求 csr 文件

打开《第04课:使用 XCA 管理和生成 SSL 证书》中已经生成的 xca 数据库。单击“Certificate Signing Requests” 页面,然后单击右边的“Import”按钮。

在弹出的窗口中选择上文生成的 server.csr,然后单击“打开”按钮。

enter image description here

单击 OK 按钮,导入 csr 文件成功。

enter image description here

(2)使用私有 CA 签署 csr 文件

选择 nginx-web-01 的证书请求,并右键单击,在弹出的菜单中点击签署(Sign)。

enter image description here

在弹出的窗体中,点击源(Source)页面,并注意下面的用红色标出的两处。

  • 使用 51Talk Docter Root CA 签署证书请求。
  • 使用 Https_Server 的模板。

enter image description here

最后单击 OK 按钮,我们发现在 nginx-web-01 证书请求的一列出现了一个绿色的√,说明被成功签名。

enter image description here

(3)导出服务器证书和根证书

选择已经被签署好的 nginx-web-01 的服务器证书,并单击“导出(Export)”按钮。

enter image description here

在弹出的页面,选择要导出的路径,然后选择证书的格式为 PEM(*.crt),单击 OK 按钮。

enter image description here

接下来就是导出根证书,选中根证书,并单击“导出(Export)”按钮。

enter image description here

在弹出的页面,选择要导出的路径,然后选择证书的格式为 DER(*.cer),单击 OK 按钮。

enter image description here

(4) 配置 Nginx 的 HTTPS

在 nginx.conf 中配置上文生成的私钥和服务器证书,将上文配置的 server.crt 证书更改为私有 CA 签名的 nginx-web-01.crt 证书。更改后,内容如下:

enter image description here

因为 51TalkDocter_Root_CA.cer 是一个私有的 CA 根证书,不是操作系统默认自带的 CA 根证书,所以我们需要把其安装到 Windows 操作系统的受信任的根证书列表中。

具体操作步骤如下:

双击 D:\nginx-1.13.12\ssl\51TalkDocter_Root_CA.cer证书,其会弹出一个窗体显示证书。

enter image description here

注意其上面有以一个红色叉号,表示当前这个证书是不受操作系统信任的一个 SSL 证书。

单击下面的“安装证书”按钮,然后选择“本地计算机(L)”,单击“下一步”按钮。

enter image description here

在下面的窗体中,选择“将所有证书都放入下列存储(p)” 复选框,并点击最右侧的“浏览..”按钮,其将会弹出“选择要使用的证书存储(C)”的窗体,然后选择“受信任的根证书颁发机构”,然后单击“确定”按钮,再单击“下一步”按钮,如下图所示意。

enter image description here

最后单击“完成”按钮。

enter image description here

再次双击打开c:\ssldemo\51TalkDocter_Root_CA.cer证书,会发现以前的红色叉号已经消失。

enter image description here

打开浏览器,输入地址:https://nginx-web-01/page/home.html。我们会发现证书错误的提示已经消失,表示我们已经配置成功。

enter image description here

配置 Nginx 的反向代理以及负载均衡

当网站的访问量达到一定程度后,单台的服务器便不能满足用户的请求时,这时便需要多台服务器做集群,将压力分散到不同的机器上。下面将会给大家介绍如何使用 Nginx 实现反向代理及负载均衡。笔者先给大家分享一张反向代理负载均衡的原理图,方便于大家的理解。

1. 基于 HTTP 配置 Nginx 的反向代理以及负载均衡

(1)环境准备

由于条件限制,笔者在自己电脑安装 Nginx 作为反向代理服务器,同时安装两个不同的版本 Tomcat 作为服务器方便测试。http://nginx-web-01/ 代表 Nginx 服务器,http://nginx-web-01:8001/ 代表 Tomcat8 服务器,http://nginx-web-01:8080/ 代表 Tomcat9 服务器。启动 Nginx 和 Tomcat 的服务,如下图所示:

enter image description here

enter image description here

enter image description here

(2)配置 Nginx 的反向代理

在 nginx.conf 文件中添加配置中添加指令:proxy_pass(指定代理位置的服务器地址 URL),如下图所示:

enter image description here

打开浏览器,输入地址:http://nginx-web-01/。我们发现 Nginx 已经反向定位到 Tomcat8 上面,说明我们已经配置成功。

enter image description here

(3)配置 Nginx 的负载均衡

负载均衡需要使用 Nginx 支持的 HTTP Upstream 模块,该模块通过一个简单的算法调度来实现客户端到服务端的负载均衡。Nginx 的 upstream 目前支持4种方式的分配:

  • 轮询

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,会自动剔除。同时也可以设定服务器的权重(weight)比值,weight 和访问比率成正比,当 weight 的值越大,被访问的几率越高,用于后端服务器性能不均的情况。

  • ip_hash

每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

  • Fair(第三方)方式

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  • url_hash(第三方)方式

按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。

笔者将会采用的轮询的方式配置负载均衡。在 nginx.conf 中添加均衡服务器列表,然后使用 proxy_pass 引用服务器列表。内容如下:

enter image description here

打开浏览器,输入网址:http://nginx-web-01/。刷新几次,我们会看到 Tomcat8 和 Tomcat9 两种不同的页面,说明 Nginx 已经把请求分发到不同的服务器中,同时也说明 Nginx 作为反向代理配置负载均衡成功。

enter image description here

enter image description here

2. 基于 HTTPS 配置 Nginx 的反向代理以及负载均衡

在上文中我们已经配置好了 Nginx 的 HTTPS,因此,笔者在下文的配置中即可直接使用,并且笔者也会继续使用基于 HTTP 配置 Nginx 的反向代理以及负载均衡的环境,步骤如下:

(1)配置 Nginx 的反向代理

在 nginx.conf 文件指定位置中添加指令:proxy_pass(指定代理位置的服务器地址 URL),同时我们需要先注释掉上文在 nginx.conf 中配置均衡服务器列表,否则启动 Nginx 服务时会报错,如下图所示:

enter image description here

enter image description here

打开浏览器,输入地址:https://nginx-web-01/。我们发现 Nginx 已经反向定位到 Tomcat8 上面,说明我们已经配置成功。

enter image description here

(2)配置 Nginx 的负载均衡

此处笔者仍旧采用轮询的方式配置负载均衡,删掉上一步对均衡服务器列表的注释,然后使用 proxy_pass 引用服务器列表。内容如下:

enter image description here

enter image description here

打开浏览,输入网址:https://nginx-web-01/。刷新几次,我们会看到 Tomcat8 和 Tomcat9 两种不同的页面,说明 Nginx 已经把请求分发到不同的服务器中,同时也说明 Nginx 作为反向代理配置负载均衡成功。

enter image description here

enter image description here

总结

本文主要给大家分享了如何配置普通的 Nginx 的 HTTP/HTTPS 从而让其能够把静态页面和 JS 部署到 Ngnix 服务器上来;对于 HTTPS 的配置方式,分享了使用自签名证书和有 CA 颁发的服务器证书进行配置的两种方式。

紧接着分享了如何配置基于 HTTP 的负载均衡的配置,并在此基础之上如何配置基于 HTTPS 的负载均衡。

为了激发大家的思考,笔者给大家留下一道作业,考虑下面的场景:Nginx 访问 HTTP 时如何强制跳转到 HTTPS? 比如,如果将后端的 Tomcat 配置为 HTTPS 之后,配置 Nginx 的反向代理及负载均衡为 HTTP 之后,是否可以正常访问? 建议大家按照本文的步骤动手试一下,肯定会有新的收获。如果遇到不懂问题,可以联系笔者一起探讨,最后祝大家学习开心,生活愉快!

上一篇
下一篇
目录