编译安装Nginx,实现多域名 HTTPS

花门楼前见秋草,岂能贫贱相看老。这篇文章主要讲述编译安装Nginx,实现多域名 HTTPS相关的知识,希望能为你提供帮助。
      nginx支持基于单个ip实现多域名的功能,并且还支持单ip多域名的基础之上实现HTTPS,其实是基于Nginx的SNI(Server Name Indication)功能实现,SNI是为了解决一个Nginx服务器内使用一个ip绑定多个域名和证书的功能,其具体功能是客户端在连接到服务器建立SSL链接之前先发送要访问站点的域名(Hostname),这样服务器再根据这个域名返回给客户端一个合适的证书。

  1. 编译安装Nginx1.18
1.1 准备事项
    编译安装Nginx1.18之前,需先安装gcc、pcre-devel、openssl-devel和zlib-devel这四个依赖包。

    根据习惯,我们可提前创建Nginx服务的专有用户nginx。

1.2 下载源码包
    Nginx源码包可通过官网(下载选择界面:??https://nginx.org/en/download.html??下载,目前已更新到1.21.6版本,官方提示1.20.2版已成为稳定版,不过实际生产中更建议使用略低于官方稳定版的Nginx源码包,笔者这边就下载1.18来进行后续操作。


1.3 解压并运行configure脚本
    解压已下载的Nginx源码包,进入已解压的包目录下可查看到有一个configure脚本文件,利用configure脚本可指定Nginx的安装路径、服务的默认用户和组、编译安装时需带有哪些特性等。

1.4 编译安装
    执行make命令进行编译,编译完成后,objs目录下会多出一个nginx程序文件,利用该文件可查看到现有的版本已经configure环节使用了哪些选项等,如果后期想要添加其他特性或者进行平滑升级等,也可在此基础上重新进行编译。


    执行make install命令进行安装,由于Nginx服务并不大,所以编译安装环节会比较快。

1.5 修改权限及创建软链接
    configure环节指定安装路径为/apps/nginx,但相关文件属主和属组为root,需改为nginx。为了方便开启或关闭服务,通常我们是需要生成PATH变量的,但Nginx服务安装后只有一个程序文件,因此直接对程序文件创建一个软链接即可。此时,直接执行nginx命令即可开启服务。



1.6 创建service文件
    Nginx服务在编译安装完成后,虽然可直接通过nginx相关命令来进行服务的开启或关闭等,但并不符合我们使用服务的习惯,无法做到开机自启动等,因此可以考虑创建一个service文件。
    由于service文件中要包含pid文件路径,默认的pid路径为/apps/nginx/logs/nginx.pid,显得有点不伦不类,可以在/apps/nginx目录下创建一个run子目录(注意要修改属主和属主),并在配置文件中将pid默认路径指向该目录。


    service文件内容可参考yum方式安装的Nginx对应文件部分,创建完毕后重新加载服务,由于笔者在编译安装完成后已经开启了Nginx服务,关闭进程后即可利用传统的systemctl方式来开启服务,并做到开机自启动。



  1. 单个ip实现多域名
    假设以上编译安装的Nginx服务器中要部署两个网站,一个是PC端的,域名为www.johnnyfang.com,另一个为手机端的,域名为m.johnnyfang.com。
2.1 创建子配置文件存放路径
    单个ip实现多域名中,各域名部分的配置信息可以在Nginx服务的配置文件中添加,不过会显得十分冗长,因此可以考虑将各个域名对应的配置文件单独存放。例如可以创建一个/apps/nginx/conf.d/目录,并在Nginx配置文件的http语句块中声明需要从新创建的目录下去找对应的conf文件。

2.2 创建子配置文件
    PC端和手机端网站的配置文件是在上面一步创建的目录下单独存放的,因此要创建两个子配置文件,各自的配置文件中需指明主机所对应的端口、域名和网页文件路径。由于笔者这边是将网页文件路径放在/data目录下的,尚不存在,故需手动创建。

2.3 测试环节
    此时客户端使用curl命令去访问PC端和手机端的网站,能正常显示对应主页中的内容。修改电脑中hosts文件后,也能在网页中查看对应域名的主页内容。





  1. 单个ip实现多域名HTTPS
      Web网站的登录页面都是使用HTTPS加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是由HTTP+SSL/TLS两部分组成,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
3.1 PC端
3.1.1 脚本实现自签名证书
    在/apps/nginx/conf.d/目录下创建子目录ssl用于存放证书,进入到ssl目录下,创建脚本来进行自签名证书的颁发,脚本内容如下:

    执行完certs.sh脚本会生成5个证书相关文件,可以将服务器证书johnnyfang.com.crt和CA证书ca.crt合并到一块,注意服务器证书要放在CA证书前面。为了方便管理,也可将私钥部分进行改名,此时ssl目录下的两个www开头文件就是PC端网站所需使用的证书文件。

3.1.2 PC端HTTPS设置
    PC端在实现多域名环节已经创建了pc.conf子配置文件,此时根据PC端证书相关文件来进行HTTPS设置,内容如下图,保存内容后重启Nginx服务。

3.1.3 测试环节
    客户端执行curl https://www.johnnyfang.com -k命令可以查看到PC端网页的主页显示内容,在浏览器中也能查看对应内容。


3.2 手机端
3.2.1 脚本实现自签名证书
    与PC端相同,我们可以创建脚本来进行手机端网站的自签名证书颁发,需要注意的是,手机端将服务器证书文件和CA证书合并后(合并时也要将服务器证书放在CA证书之前),要改成pem为后缀的文件。


3.2.2 手机端HTTPS设置
    根据已创建的手机端相关证书,在实现多域名环节创建的手机端配置文件中进行HTTPS设置,内容如下图,保存配置文件后重启Nginx服务。

3.2.3 测试环节
    客户端执行curl https://m.johnnyfang.com -k命令,或在浏览器中查看,均能正常显示手机端网页主页内容。

【编译安装Nginx,实现多域名 HTTPS】

    推荐阅读