web⽹站的登录⻚⾯都是使⽤https加密数据来保障数据的安全性的,https能够加密信息,以免敏感信息被第三⽅获取,所以很多银⾏⽹站或电⼦邮箱等等安全级别较⾼的服务都会采⽤https,https是由HTTP+SSL/TLS协议组合而成,也就是在http协议的基础上⼜加了⼀层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进⾏加密,所以传输的数据都是加密后的数据。
Nginx能提供免费、开源、高性能的web服务功能,利用Nginx的rewrite模块可以做到https的强制跳转,本次实验通过Rocky8.6虚拟机来演示如何实现www.johnnyfang.com向https://www.johnnyfang.com的强制跳转。
- 编译安装Nginx1.18
1.1 安装依赖包
编译安装前需先安装好依赖包,gcc可以编译C和C++源代码等;gcc-c++也能编译C源代码,只不过把会把它当成C++源代码,后缀为.c的,gcc把它当作是C程序,⽽g++当作是c++程序,后缀为.cpp的,两者都会认为是c++程序;pcre和pcre-devel能为Nginx的rewrite模块和http核⼼模块会使⽤到正则表达式语法提供保障;Nginx在开启SSL功能的时候需要用到openssl-devel;Nginx在开启压缩功能的时候会用到zlib-devel。
1.2 获取源码并解压
Nginx源码可通过官网获取(下载选择界面:http://nginx.org/en/download.html),目前已更新到1.22主版本,考虑到稳定性,笔者下载的是1.18版本,下载好源码解压至指定文件夹。
1.3 编译安装
编译安装三步走,第一步执行configure脚本生成Makefile文件,在此环节,我们可以指定Nginx服务程序安装路径、所有者和所属组,以及支持哪些功能或模块等。
第二步和第三步可以放一块,为了防止编译环节出错,可以分编译和安装两步。
1.4 创建服务用户
根据编译安装中的指定选项,需检查是否有nginx用户的存在,没有的话需创建一个,建议将shell类型设为/sbin/nologin。同时将程序路径的所有者和所属组改为nginx,另外为了方便使用Nginx服务,建议创建一个软链接或者生成PATH变量。
1.5 创建service文件
此时如果直接执行nginx命令已经可以开启服务,不过为了可以利用systemd方式启动或关闭服务,并可以添加到开机自启动,我们也可以创建一个service文件。
1.5.1 修改默认pid文件路径
service文件中要填写Nginx服务的pid文件路径,编译安装后默认的pid文件是放在/apps/nginx/logs目录下,显得有点不伦不类,可以改为/apps/nginx/run目录,但是该目录不存在,因此需创建好,并且要将目录及其递归目录和文件的所有者、所属组改为nginx。
1.5.2 创建service文件
Nginx服务的service文件内容可以参照yum方式安装的该文件,并根据自己的安装路径和其他设置进行修改,具体内容如下图:
1.6 加载并启动服务
重新加载服务后,即可利用systemd方式开启Nginx服务,并可设为开机自启动,查看端口时,80端口已经打开,并能在浏览器中查看默认web主页。
- web站点部署
企业在实际生产中可能会部署多个网站,或者利用Nginx来作为代理服务器来转发各种服务请求,我们可以在Nginx主配置文件/apps/nginx/conf/nginx.conf中设置,但是管理的服务过多时,主配置文件会显得冗长而难以管理,因此可以考虑使用子配置文件形式来规划不同服务。
2.1 创建子配置文件路径
例如我们可以将当前网站的配置文件放在/apps/nginx/conf/conf.d目录下,由于该目录并不存在,需提前创建,并在主配置文件中声明子配置文件的路径。
2.2 创建子配置文件
接下来就是创建子配置文件来设置需要部署的站点信息,对应站点的配置文件中需填写监听端口、主机对应的域名已经web页面的相关路径。
2.3 部署web站点
由于子配置文件中设置的是将web站点放在/data/nginx/html/web目录下,因此还需创建对应的目录,为了测试效果,笔者将域名www.johnnyfang.com对应web站点首页内容进行简单的处理,检查语法无误后重新加载Nginx服务。
2.4 测试环节
客户端修改/etc/hosts文件后,即可通过域名访问到站点首页内容,通过电脑浏览器也能查看到对应内容。
- 实现https功能
Nginx的https功能是基于ngx_http_ssl_module模块来实现的,因此如果是编译安装的Nginx,在执行configure脚本生成Makefile文件环节一定要使⽤参数ngx_http_ssl_module开启ssl功能。因为是实验环境,笔者就不专门去注册域名并申请CA证书来做https了,在Linux系统中,我们可以通过自签名证书来实现https功能。
3.1 自签名证书
自签名证书的获取分根CA证书的生成、证书申请文件与私钥文件的生成,以及颁发证书三步。
3.1.1 自签名根CA证书
我们可以专门创建一个目录来存放各自站点的证书,进入目录后使用openssl命令来生成一个10年有效期的自签名CA证书,填写信息完毕,可以看到生成了根CA的证书文件和私钥文件。
3.1.2 自制key和csr文件
利用openssl命令生成自签名证书时,默认使用的是match策略,即国家、省/直辖市和公司/组织名称这三项必须和根CA证书的相关项匹配,如果要修改,可在/etc/pki/tls/openssl.cnf文件中调整策略。因为是在同一台主机上针对一个站点进行证书私钥文件和证书申请文件的生成,笔者就直接存放在当前目录了。
3.1.3 颁发证书
利用www.johnnyfang.csr这个证书申请文件,给对应的站点颁发一个有效期10年的证书文件,颁发完成后,可以转换成text格式查看证书文件内容。
3.2 Nginx服务配置
Nginx服务主要是在站点子配置文件的server语句块添加证书文件和证书私钥文件的路径,同时要开启基于ssl协议的443端口,也可添加一些ssl相关的缓存参数项设置。修改完毕检查语法无误后重新加载Nginx服务。
3.3 测试环节
客户端带上-k选项,通过https能成功访问到网站对应的首页内容,浏览器中输入https://www.johnnyfang.com域名后,通过高级选项跳过提示也能查看到网站首页内容。
- 实现https强制跳转访问
根据用户行为习惯,通常用户在使用域名进行web网页访问时是不会输入https的,要想实现https的强制跳转,需要用到Nginx的rewrite模块,rewrite模块可以实现url的重写。url的重写是⾮常有⽤的功能,⽐如它可以在我们改变⽹站结构之后,不需要客户端修改原来的书签,也⽆需其他⽹站修改我们的链接就可以设置为访问,另外还可以在⼀定程度上提⾼⽹站的安全性。
4.1 修改站点子配置文件
在进行用户url重写的判定时,我们可以使用if指令来进行条件匹配判定,结合本次实验,主要是将用户http协议的请求转为https协议,Nginx中可使用的协议相关的变量为$sheme,因此站点子配置文件中可以做如下设置。
4.2 客户端测试
客户端直接使用curl命令访问时,会显示进行了302临时重定向(如果想实现永久重定向,在rewrite一行结尾添加permanent),加上-Lk选项即可看到https强制跳转后web首页内容。
在浏览器中按f12打开开发者调试工具,输入http://www.johnnyfang.com域名后在“网络”-“标头”部分可以看到更详细的跳转过程,首先是请求的url为http协议的,然后进行了302临时重定向,重定向后的目标是“响应头”的“location”部分的https://www.johnnyfang.com。