SSL配置、泛域名和静态服务
写在前面
现在大部分网站都使用https协议,而不是传统的http,因此本篇就来学习如何使用Nginx配置网站HTTPS和如何将http重定向到https,同时也会学到如何进行泛域名路径分离和请求转发,静态服务的相关配置,这些都是企业日常开发过程中经常会遇到的情况。
Nginx配置网站HTTPS
HTTPS
HTTPS是超文本传输安全协议(英文为Hyper Text Transfer Protocol Secure,简称HTTPS)是超文本传输协议HTTP和SSL/TLS的组合,用以提供加密通信以及对网络服务器身份的鉴定。HTTPS连接通常被用于万维网上的交易支付和企业信息系统中敏感信息的传输。请不要将HTTPS协议与在RFC2600中定义的安全超文本传输协议(S-HTTP)相混淆。
HTTPS目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,HTTPS网站已经大面积创建了,个人和站长均可以自己动手搭建一个安全的加密网站。
第一步,创建本地SSL证书,依次执行如下命令:
1 | // 创建存储文件目录 |
之后会一次填写如下信息:
1 | Country Name (2 letter code) [XX]:US |
第二步,首先使用nginx -V
(注意是大写)命令来查看已经安装的插件,可以发现目前并没有安装http_ssl_module
模块:
1 | [root@envythink ssl]# nginx -V |
第三步,回到Nginx下载目录,笔者为/home/envythink/nginx-1.17.0
,使用如下命令来进行编译安装http_ssl_module
模块:
1 | ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --add-module=/usr/local/nginx/third_module/echo-nginx-module-0.61 --with-http_stub_status_module --with-http_ssl_module |
之后使用make
命令进行安装,切记不可使用make install
命令,这样会覆盖前面已经安装的Nginx。
第四步,更新二进制文件。由于此处执行了编译和安装命令,那么接下来就需要将安装目录中的nginx命令进行更新,也就是将/home/envythink/nginx-1.17.0/objs
目录下的nginx覆盖掉之前的/usr/local/nginx/sbin/
目录下的nginx,使用的命令如下:
1 | cp /home/envythink/nginx-1.17.0/objs/nginx /usr/local/nginx/sbin/nginx |
之后开发者再次使用nginx -V
(注意是大写)命令来查看已经安装的模块,可以发现http_ssl_module
模块已经安装成功了:
1 | [root@envythink nginx-1.17.0]# nginx -V |
第五步,在vhost目录下新建一个hellobook.com.conf文件,其中的代码如下所示:
1 | server { |
第六步,新建/usr/share/nginx/html/hellobook
目录,并在里面新建index.html文件,其中的内容如下所示:
1 | <h1 style="color:red;text-align:center">The web site is running by using ssl</h1> |
第七步,使用nginx -t
命令来检查Nginx语法并使用nginx -s reload
命令来重启Nginx。然后在浏览器中访问https://hellobook.com
,结果如下所示:
请注意,HTTPS默认使用的是443端口,而HTTP默认使用的是80端口,因此当开发者直接访问http://hellobook.com
,结果如下所示:
HTTP重定向到HTTPS
很明显上面是不太友好的方式,正确的做法是,当用户访问http://hellobook.com
时,应当将其重定向到https://hellobook.com
,那么这个重定向应该如何操作呢?
开发者需要在hellobook.com.conf文件中新增如下配置信息:
1 | server { |
之后使用nginx -t
命令来检查Nginx语法并使用nginx -s reload
命令来重启Nginx。然后在浏览器中访问http://hellobook.com
,结果如下所示:
除了上述配置外,我们还可以使用其他的配置方式,如下所示,开发者可以根据需要选择合适的方式:
1 | server { |
可以看到这三种方式的适用场景是不同的,开发者需要结合实际需求来进行选择。
当然,开发者也可以在server区块中新增几个用于提升网站安全性的命令,如下所示:
1 | # 减少点击劫持 |
其他更多的命令参数,大家可以参阅Nginx官方网站进行学习。
泛域名
所谓的泛域名是指某一个或者一些域名的子域名,举个例子,如域名为envythink.com
,它的子域名可能为test.envythink.com
、hello.envythink.com
、test1.doc.envythink.com
、test2.doc.envythink.com
等域名,这些都可以看作是envythink.com
域名的泛域名。
泛域名路径分离
泛域名路径分离这是一个非常实用的技能,在实际开发过程中我们可能需要配置一些二级、三级域名,并希望通过Nginx来实现自动指向对应目录这一功能。
举个例子,假设我们希望下面三或者多个子域名能自动指向服务器中的指定目录:
(1)test1.doc.envythink.com
子域名自动指向服务器的/usr/share/nginx/html/doc/test1
目录;
(2)test2.doc.envythink.com
子域名自动指向服务器的/usr/share/nginx/html/doc/test2
目录;
(3)test3.doc.envythink.com
子域名自动指向服务器的/usr/share/nginx/html/doc/test3
目录……
此时开发者可以在doc.envythink.com.conf
配置文件中新增如下server区块,里面的内容如下所示:
1 | server { |
考虑到实际效果,这里以test1.doc.envythink.com
为例进行介绍。新建/usr/share/nginx/html/doc/test1/
目录,然后在里面新建一个index.html文件,其中的代码如下所示:
1 | <h1 style="color:red;text-align:center">The web site domain is test1.doc.envythink.com</h1> |
接下来使用nginx -t
命令来检查Nginx语法并使用nginx -s reload
命令来重启Nginx。
之后在浏览器地址栏中访问test1.doc.envythink.com
,可以看到如下信息,这就表明我们泛域名路径分离设置是成功的:
泛域名转发
在上面我们学习的是如何进行泛域名的路径分离,其实还可以进行泛域名转发,需求和之前的非常类似。在实际开发过程中我们可能需要将一些二级、三级域名链接转发到我们希望的路径,然后让后端根据路径来解析不同的规则。
举个例子,假设我们希望下面三或者多个子域名链接能自动转发到我们指定的路径上:
(1)test1.server.envythink.com/api?name=envy
子域名链接自动转发到127.0.0.1:88/test1/api?name=envy
;
(2)test2.server.envythink.com/api?name=envy
子域名链接自动转发到127.0.0.1:88/test2/api?name=envy
;
(3)test3.server.envythink.com/api?name=envy
子域名链接自动转发到127.0.0.1:88/test3/api?name=envy
……
此时开发者可以在server.envythink.com.conf
配置文件中新增如下server区块,里面的内容如下所示:
1 | server { |
接下来使用nginx -t
命令来检查Nginx语法并使用nginx -s reload
命令来重启Nginx。之后就可以测试我们对于泛域名转发的相关配置是否生效,可以发现的确生效了。
静态服务
尽管在前面或多或少的介绍了如何使用Nginx来配置静态服务,接下来将专门学习如何实现这个功能。
其实配置起来非常简单,开发者只需在*.conf
文件中新增如下代码即可:
1 | server { |
接下来使用nginx -t
命令来检查Nginx语法并使用nginx -s reload
命令来重启Nginx。之后就可以测试我们对于静态服务的设置是否生效,可以发现的确生效了。
那么这样,关于Nginx配置SSL、泛域名和静态服务的学习就到此为止,后续学习其他的知识。