【服务端】使用nginx为网站配置https以及开启http/2提高安全和性能
目录
- 前言
- 所需准备
- 在腾讯云申请免费的SSL证书
- 下载SSL证书用nginx配置https协议
- 安装nginx模块http_v2_module开启http/2
- 参考文档
一.前言
最近在学习网络协议相关的知识,在学习应用层协议时,对以前有耳闻的SSL/TLS和http/2协议有了更深入的了解,为了提高自己博客的安全性和网络性能,就借助nginx把博客网站配置成了http/2协议,同时也把学习的知识学以致用。
二.所需准备
- 已备案的域名https://guojiongwei.top和**ECS云服务器**。
- 服务器系统为linux center-os
- 服务器已安装nginx
- 原先博客项目已配置以域名为虚拟主机的http访问
三.在腾讯云申请免费的SSL证书
1.登录腾讯云
进入腾讯云官网,点击右上角登录自己的账号,登录成功后在页面输入框搜索SSL证书,如下图
2.购买免费SSL证书
在ssl证书概览里面点击立即购买
选择域名免费版,点击下方免费快速申请按钮进行申请,出现下图,按照自己绑定的域名和邮箱信息进行填写即可
3.选择验证方式(采用DNS验证)
此处采用腾讯云官网DNS验证介绍文档
本文档将指导您在证书管理控制台申请证书或新增域名资料时,并且域名验证方式为 DNS 验证,如何进行域名验证操作。
步骤1:查看验证信息
- 登录 证书管理控制台。
- 选择【验证中】的证书,进入 “验证域名” 页面,并在规定时间内完成验证操作。如下图所示:
步骤2:添加解析记录
注意:
以下操作仅针对域名对应的域名解析商在腾讯云的情况下,若不在腾讯云,请您到域名对应的域名解析商处进行解析。
请您先找到验证域名(步骤1图例)页面,获取主机记录以及记录值。
登录 DNS 解析 DNSPod 管理控制台 ,查看已申请证书的域名,并单击操作栏的【解析】,进入【记录管理】页面。如下图所示:
单击【添加记录】,并根据不同证书类型添加 DNS 记录。
- Wotrus 品牌证书需填写记录类型为 CNAME 的解析记录。如下图所示:
- **主机记录**:填写在 [步骤1](https://cloud.tencent.com/document/product/400/54500#details) 中 “验证域名” 页面获取的主机记录值。
- **记录类型**:选择 “CNAME”。
- **线路类型**:选择 “默认” 类型,否则会导致CA 机构无法进行扫描认证。
- **记录值**:填写在 [步骤1](https://cloud.tencent.com/document/product/400/54500#details)中 “验证域名” 页面获取的记录值。
- **MX 优先级**:不需要填写。
- **TTL**:为缓存时间,数值越小,修改记录各地生效时间越快,默认为600秒。
其他品牌证书需填写记录类型为 TXT 的解析记录。如下图所示:
单击【保存】,完成添加。
添加成功后,证书对应域名添加记录值的系统会定时检查,若 CA 机构能检测到并且与指定的值匹配,即可完成域名所有权验证,请耐心等待 CA 机构扫描审核。
说明:
- 解析生效时间一般为10分钟 - 24小时,但各地解析的最终生效取决于各运营商刷新时间,请您耐心等待。
- 证书颁发完成或域名信息审核通过后,解析记录可手动清除。
四.下载SSL证书用nginx配置https协议
1.下载证书
购买SSL证书审核完成后, 进入证书管理控制台,点击已签发,选择购买证书点击详情,出现下图
点击下载证书,把证书下载到本地,解压后里面有各个服务器上面的密钥,此处由于使用的nginx,需要选择nginx包里面的密钥,如下图:
2.在服务器端建立文件存放证书
在本地连接远程服务器的方式也有很多种,window可以使用xshell或者git命令行ssh,mac也可以直接使用命令行ssh来连接,此处使用mac命令行ssh来连接远程服务器,打开命令行输入ssh 用户名称@ip。
ssh root@39.107.xxx.xxx
然后按照提示输入服务器对应的密码即可登录服务器。
然后进入上传SSL证书文件放置位置
cd /usr/local #进入该目录
mkdir ssl # 创建放置SSL证书目录
cd ssl #进入ssl目录
mkdir guojiongwei.top # 因为可能有多个域名,可以把每个域名作为文件夹名称来存储对应的证书,方便管理
cd guojiongwei.top
pwd # 查看当前目录路径
在服务器创建好放置证书的目录后,就该从本地把证书上传到服务器了
3.上传证书到服务器
上传文件到服务器的方式有很多种 使用xshell或者ftp,sftp等工具或者git都可以上传文件到服务器。
这里采用mac命令行自带的sftp命令行工具
1.打开命令行,输入
sftp root@39.107.xxx.xxx
输入密码后即可借助sftp上传文件到服务器,上传命令格式:
put 本地电脑文件路径 服务器文件路径
要上传两个文件Nginx目录下的1_guojiongwei.top_bundle.crt和2_guojiongwei.top.key
在电脑可以直接把要上传的文件拖动到窗口里面自动获取文件路径,然后再选择上传到我们刚才在服务器配置好的路径/usr/local/ssl/guojiongwei.top
put /Users/guojiongwei/Downloads/guojiongwei.top/Nginx/1_guojiongwei.top_bundle.crt /usr/local/ssl/guojiongwei.top
put /Users/guojiongwei/Downloads/guojiongwei.top/Nginx/2_guojiongwei.top.key /usr/local/ssl/guojiongwei.top
分别点击回车后,上传服务器成功,登录服务器,进入/usr/local/guojiongwei.top目录查看
cd /usr/local/ssl/guojiongwei.top # 进入放置ssl证书目录
ls # 查看文件列表
pwd # 查看当前文件目录
此时证书已经上传到服务器上面了。
4.nginx配置https
证书上传上来后,就可以在nginx配置https了
在服务器终端输入nginx -t查看nginx配置文件nginx.config所在目录
nginx -t
可以看到nginx的配置文件的位置在/usr/local/nginx/nginx.conf
输入命令开始编辑nginx.config
cd /usr/local/nginx
vi nginx.conf
新建一个server,也可以在原有的项目配置server上添加
server {
listen 443 ssl;
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
server_name guojiongwei.top; #证书绑定的域名。
ssl_certificate /usr/local/ssl/guojiongwei.top/1_guojiongwei.top_bundle.crt; #配置证书
ssl_certificate_key /usr/local/ssl/guojiongwei.top/2_guojiongwei.top.key; # 配置密钥
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
error_page 405 =200 $uri;
location / {
root html;
index index.html;
}
}
关键点
- listen 443 ssl; 表示监听443端口,开启https协议。
- server_name guojiongwei.top; 和购买证书相匹配的域名
- ssl_certificate /usr/local/ssl/guojiongwei.top/1_guojiongwei.top_bundle.crt; 配置证书的路径
- ssl_certificate_key /usr/local/ssl/guojiongwei.top/2_guojiongwei.top.key; # 配置密钥的路径
配置完成后,输入nginx -s reload重启nginx
nginx -s reload
没有报错信息的话,在浏览器输入https协议的域名https:guojiongwei.top,打开控制台,会看到该域名下的请求已经变成了https
<img src="http://p29.toutiaoimg.com/origin/pgc-image/96fdd88d4267457f8ef8604d7e5d4a9e" alt="copy.png" style="zoom:67%;" />
5.优化 添加http跳转到https
此时域名已经配置好https协议了,但目前浏览器输入域名没有待协议时默认都是http协议,我们可以手动添加nginx配置,如果是http协议访问就跳转到https
nginx新增配置代码,可以和原先的server并排放置
# http跳转https
server {
server_name guojiongwei.top;
location / {
rewrite ^/(.*)$ https://guojiongwei.top permanent;
}
}
添加完成后,nginx -s reload重启nginx,在浏览器输入http协议http:guojiongwei.top或者不带协议只输入域名guojiongwei.top,打开控制台,会看到该域名下的请求原先是http,返回301状态码永久重定向到了https协议。
<img src="http://p29.toutiaoimg.com/origin/pgc-image/a982e6f01fb043c4af9a2ba4a149d645" alt="copy.png" style="zoom:67%;" />
但这是的http的版本还是http/1.1版本,现在大部分浏览器都支持了http/2,http/2相对http/1.1新增了很多优化,比如二进制分帧,头部压缩,服务端推送,多路复用等特性,优化了http/1.1队头阻塞问题,减少了头部数据大小,极大的提高的网络性能和速度,所以要添加配置为项目开启http/2。
五. 安装nginx模块http_v2_module开启http/2
1.配置nginx开启 http2
nginx配置http/2其实很简单,配置代码只需要在nginx的server配置linten这一项ssl后面添加http2即可
server {
listen 443 ssl http2; #此处新增http2
server_name guojiongwei.top;
ssl_certificate /usr/local/ssl/guojiongwei.top/1_guojiongwei.top_bundle.crt;
ssl_certificate_key /usr/local/ssl/guojiongwei.top/2_guojiongwei.top.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
error_page 405 =200 $uri;
location / {
root html;
index index.html;
}
}
# http跳转https
server {
server_name guojiongwei.top;
location / {
rewrite ^/(.*)$ https://guojiongwei.top permanent;
}
}
配置完成后重启nginx
nginx -s reload
此时会提示
nginx: [emerg] the "http2" parameter requires ngx_http_v2_module in /usr/local/nginx/nginx.conf:123
原先是因为nginx开启http/2需要安装ngx_http_v2_module才可以开启,而nginx默认是没有安装该模块,需要我们手动安装一下
2. 为nginx安装ngx_http_v2_module模块来支持http
注意:nginx的源码目录一般和配置文件目录不在同一个文件位置,安装新模块需要借助nginx源码目录
在命令行输入nginx -V查看nginx的源码目录和配置目录,以及当前已安装的模块
nginx -V
输入
[root@iZ2zeewuylrvpighrn8jm4Z ~]# nginx -V
nginx version: nginx/1.17.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2l 25 May 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.0.2l
- --prefix=/usr/local/nginx:是配置文件目录
- --conf-path=/usr/local/nginx/nginx.conf:是主配置文件
- --with-openssl=/usr/local/src/openssl-1.0.2l:/usr/local/src/该目录一般树nginx源码目录
- --with-**:是nginx目前已安装的模块,可以看到里面没有ngx_http_v2_module。
安装ngx_http_v2_module
第一步:进入到nginx源码目录
cd /usr/local/src
该nginx-1.17.3文件夹即是nginx的源码目录,不同的安装方式可能源码目录不一样,要根据自己的服务器nginx源码目录来。
第二步:配置新增ngx_http_v2_module模块
cd nginx-1.17.3
ls
./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.0.2l --with-http_v2_module # 除了nginx -V的输入信息原有的模块之外,新增--with-http_v2_module
第三步:make重新编译nginx
在配置新增模块结束后,执行make重新编译
make
meke好了之后会在源码目录nginx-1.17.3下的objs目录产生nginx的二进制文件
然后把原先的nginx二进制文件备份,用上面编译好的nginx替换。
第四步: 用新编译好的nginx二进制文件替换原先的
原先的nginx二进制文件位于nginx的配置文件nginx.conf同层级的sbin目录中
cd /usr/local/nginx/sbin
ls
为避免替换过程中出现异常,我们可以先把原先的nginx二进制文件备份
cp nginx nginx.bak
此时新编译生成的nginx二进制文件在nginx源码目录中,位置是/usr/local/src/nginx-1.17.3/objs/nginx
要被替换的原nginx二进制文件位置/usr/local/nginx/sbin/nginx
然后执行替换操作
cp /usr/local/src/nginx-1.17.3/objs/nginx /usr/local/nginx/sbin/nginx # 拷贝新编译的二进制覆盖原nginx二进制
覆盖完成后再次执行nginx -V查看
nginx -V
此时看到在最后面已经有了--with-http_v2_module模块
再次执行nginx -s reload重启nginx
nginx -s reload
在liunx系统里面设计原则之一就是沉默是金,这次安装http_v2_module模块后,执行nginx -s reload没有未安装时的"http2" parameter requires ngx_http_v2_module报错了。
第五步:在浏览器端查看效果
在浏览器属于自己的域名https://guojiongwei.top,打开控制台
可以到protocol一栏已经变成h2了,scheme一栏是https,到此为止已经大功告成了,https和http/2都已经配置完成了,项目的速度和安全性都有了提升。
六.参考文档
1.腾讯云官网