Back

【服务端】使用nginx为网站配置https以及开启http/2提高安全和性能

目录

  1. 前言
  2. 所需准备
  3. 在腾讯云申请免费的SSL证书
  4. 下载SSL证书用nginx配置https协议
  5. 安装nginx模块http_v2_module开启http/2
  6. 参考文档

一.前言

最近在学习网络协议相关的知识,在学习应用层协议时,对以前有耳闻的SSL/TLS和http/2协议有了更深入的了解,为了提高自己博客的安全性和网络性能,就借助nginx把博客网站配置成了http/2协议,同时也把学习的知识学以致用。

二.所需准备

  1. 已备案的域名https://guojiongwei.top和**ECS云服务器**。
  2. 服务器系统为linux center-os
  3. 服务器已安装nginx
  4. 原先博客项目已配置以域名为虚拟主机的http访问

三.在腾讯云申请免费的SSL证书

1.登录腾讯云

进入腾讯云官网,点击右上角登录自己的账号,登录成功后在页面输入框搜索SSL证书,如下图

copy.png

2.购买免费SSL证书

ssl证书概览里面点击立即购买

copy.png

选择域名免费版,点击下方免费快速申请按钮进行申请,出现下图,按照自己绑定的域名邮箱信息进行填写即可

image-20210429232437687

3.选择验证方式(采用DNS验证)

此处采用腾讯云官网DNS验证介绍文档

本文档将指导您在证书管理控制台申请证书或新增域名资料时,并且域名验证方式为 DNS 验证,如何进行域名验证操作。

步骤1:查看验证信息

  1. 登录 证书管理控制台
  2. 选择【验证中】的证书,进入 “验证域名” 页面,并在规定时间内完成验证操作。如下图所示:
    img

步骤2:添加解析记录

注意:

以下操作仅针对域名对应的域名解析商在腾讯云的情况下,若不在腾讯云,请您到域名对应的域名解析商处进行解析。

  1. 请您先找到验证域名(步骤1图例)页面,获取主机记录以及记录值

  2. 登录 DNS 解析 DNSPod 管理控制台 ,查看已申请证书的域名,并单击操作栏的【解析】,进入【记录管理】页面。如下图所示:
    img

  3. 单击【添加记录】,并根据不同证书类型添加 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 的解析记录。如下图所示:

    • 主机记录:填写在 步骤1 中 “验证域名” 页面获取的主机记录值。
    • 记录类型:选择 “TXT”。
    • 线路类型:选择 “默认” 类型,否则会导致 CA 机构无法进行扫描认证。
    • 记录值:填写在 步骤1 中 “验证域名” 页面获取的记录值。
    • MX 优先级:不需要填写。
    • TTL:为缓存时间,数值越小,修改记录各地生效时间越快,默认为600秒。
  1. 单击【保存】,完成添加。

  2. 添加成功后,证书对应域名添加记录值的系统会定时检查,若 CA 机构能检测到并且与指定的值匹配,即可完成域名所有权验证,请耐心等待 CA 机构扫描审核。

    说明:

    • 解析生效时间一般为10分钟 - 24小时,但各地解析的最终生效取决于各运营商刷新时间,请您耐心等待。
    • 证书颁发完成或域名信息审核通过后,解析记录可手动清除。

四.下载SSL证书用nginx配置https协议

1.下载证书

购买SSL证书审核完成后, 进入证书管理控制台,点击已签发,选择购买证书点击详情,出现下图

copy.png

点击下载证书,把证书下载到本地,解压后里面有各个服务器上面的密钥,此处由于使用的nginx,需要选择nginx包里面的密钥,如下图:

copy.png

2.在服务器端建立文件存放证书

在本地连接远程服务器的方式也有很多种,window可以使用xshell或者git命令行sshmac也可以直接使用命令行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 本地电脑文件路径 服务器文件路径

copy.png

要上传两个文件Nginx目录下的1_guojiongwei.top_bundle.crt2_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

copy.png

分别点击回车后,上传服务器成功,登录服务器,进入/usr/local/guojiongwei.top目录查看

cd /usr/local/ssl/guojiongwei.top # 进入放置ssl证书目录
ls # 查看文件列表
pwd # 查看当前文件目录

copy.png

此时证书已经上传到服务器上面了。

4.nginx配置https

证书上传上来后,就可以在nginx配置https了

在服务器终端输入nginx -t查看nginx配置文件nginx.config所在目录

nginx -t

copy.png

可以看到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其实很简单,配置代码只需要在nginxserver配置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

copy.png

原先是因为nginx开启http/2需要安装ngx_http_v2_module才可以开启,而nginx默认是没有安装该模块,需要我们手动安装一下

2. 为nginx安装ngx_http_v2_module模块来支持http

注意:nginx的源码目录一般和配置文件目录不在同一个文件位置,安装新模块需要借助nginx源码目录

在命令行输入nginx -V查看nginx的源码目录和配置目录,以及当前已安装的模块

nginx -V

输入

copy.png

[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

copy.png

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

copy.png

第三步:make重新编译nginx

在配置新增模块结束后,执行make重新编译

make

meke好了之后会在源码目录nginx-1.17.3下的objs目录产生nginx的二进制文件

copy.png

然后把原先的nginx二进制文件备份,用上面编译好的nginx替换。

第四步: 用新编译好的nginx二进制文件替换原先的

原先的nginx二进制文件位于nginx的配置文件nginx.conf同层级的sbin目录中

cd /usr/local/nginx/sbin
ls

copy.png

为避免替换过程中出现异常,我们可以先把原先的nginx二进制文件备份

cp nginx nginx.bak

copy.png

此时新编译生成的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

copy.png

liunx系统里面设计原则之一就是沉默是金,这次安装http_v2_module模块后,执行nginx -s reload没有未安装时的"http2" parameter requires ngx_http_v2_module报错了。

第五步:在浏览器端查看效果

在浏览器属于自己的域名https://guojiongwei.top,打开控制台

copy.png

可以到protocol一栏已经变成h2了,scheme一栏是https,到此为止已经大功告成了,httpshttp/2都已经配置完成了,项目的速度和安全性都有了提升。

六.参考文档

1.腾讯云官网

2.为nginx启用ngx_http_v2_module模块

郭炯韦个人博客 备案号: 豫ICP备17048833号-1
Top