目录
- 前言
- 所需准备
- 申请免费的证书
- 安装nginx配置https和http2
- 已安装的nginx添加http和http2模块
- 总结
一. 前言
最近在学习网络协议相关的知识,在学习应用层协议时,对以前有耳闻的https和http/2协议有了更深入的了解,为了提高自己博客的安全性和网络性能,就借助nginx把博客网站配置成了http/2协议,同时也把学习的知识学以致用。
二. 所需准备
- 云服务器,可以看我这篇文章免费申请一个申请亚马逊免费一年服务器详细教程,每个小伙伴都能部署chatgpt服务。
- 已备案的域名guojiongwei.top,并且解析到云服务器上面,域名可以在阿里云,腾讯云这些网站备案购买,很便宜。
三. 申请免费的SSL证书
要配置https,,需要申请ssl证书,可以在阿里云,阿里云官网等网站申请免费的ssl证书,本文以在阿里云申请为例。
3.1 登录阿里云
进入阿里云官网,点击右上角登录自己的账号,登录成功后在页面输入框搜索ssl,如下图,点击数字证书管理服务
。
3.2 购买免费SSL证书
在ssl证书里面选择免费证书 -再点击创建证书,点击创建证书后下面列表会出现一个待申请状态的证书,点击证书申请,填写申请的信息。
点击证书申请后,出现下面页面,填写要绑定的域名,个人信息一般会自动回显,如果没有回显,就手动填写一下,填写完成后,点击左下脚提交审核,等待3~5分钟,审核结果就会出来了。
等审核结果出来后就可以下载ssl证书上传到服务器了。
3.3 下载SSL证书
申请ssl证书审核完成后, 点击证书列表的下载按钮,打开下面下载证书的弹窗,服务器类型选择nginx,点击下载按钮,会在本地下载一个zip文件,zip文件里面有两个文件pem和key,pem存的是证书,key 存的是私钥,部署https的时候需要这两个文件。
四. 安装nginx配置https和http2
本文会用nginx来配置https和http2,所以要在云服务器安装nginx。
4.1 安装前置环境
yum install gcc-c++
yum install -y openssl openssl-devel
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
4.2 下载nginx安装包
在nginx.org网上下载nginx包上传至服务器 /usr/local目录中,也可以执行以下命令直接下载:
cd /usr/local
wget https://nginx.org/download/nginx-1.24.0.tar.gz
解压并进入nginx-1.24.0目录
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
4.3 配置https和http2模块
这里后面加了两个参数,是开启https和http2的模块,不加的话默认是不会安装这两个模块的,推荐在安装nginx时就直接把这两个模块给加上,不然后面再加会比较麻烦。后面章节也会讲怎么给已经安装的nginx添加这两个模块。
- --with-http_ssl_module:nginx支持开启https的模块
- --with-http_v2_module:nginx支持开启http2的模块
./configure --with-http_ssl_module --with-http_v2_module
4.4 编译并安装
make & make install
4.5 启动nginx
安装完成后,/usr/local里面会有一个nginx文件夹,这就是nginx服务所在目录。
进入sbin目录下,执行一下 ./nginx命令启动,nginx就启动好了。
cd /usr/local/nginx/sbin
./nginx
4.6 设置环境变量
为了方便我们在全局使用nginx,可以配置一下nginx的环境变量
编辑环境变量文件:
sudo vi /etc/profile
在最下面添加内容:
export PATH=$PATH:/usr/local/nginx/sbin
然后按esc + wq保存并退出,然后执行命令使环境变量生效:
source /etc/profile
然后测试一下看看,就可以看到配置成功了:
nginx -v
4.7 配置https和http2
配置https需要把上面下载的 .pem和 .key两个文件上传到服务器,先在服务器创建一个目录用来存放所有的ssl证书:
cd /usr/local/nginx #进入该目录
mkdir cert # 创建放置SSL证书目录
cd cert #进入ssl目录
pwd # 查看当前目录路径
在服务器创建好放置证书的目录后,就该从本地把证书上传到服务器了
上传证书到服务器最简单的方式就是就是在服务器对应文件夹新建 .pem和 .key文件,把下载下来的 .pem和 .key文件内容分别复制进来,本文中是把证书文件上传到了服务器的/usr/local/nginx/cert
文件夹中。
现在证书上传上来了,nginx也安装好了,就可以在nginx配置https了。
在服务器终端输入nginx -t查看nginx配置文件nginx.config所在目录:
nginx -t
可以看到nginx的配置文件的位置在 /usr/local/nginx/conf/nginx.conf
输入命令开始编辑nginx.conf:
cd /usr/local/nginx/conf
vi nginx.conf
新建一个server,也可以在原有的项目配置server上添加配置:
server {
listen 443 ssl http2;
# 配置HTTPS的默认访问端口为443,并且开启ssl。
# h2代表开启http2
# 如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
server_name guojiongwei.top; # 证书绑定的域名。
ssl_certificate cert/guojiongwei.top.pem; # 配置证书
ssl_certificate_key cert/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 http2:表示监听443端口,开启https协议,并且开启http2。
- server_name guojiongwei.top:和购买证书相匹配的域名
- ssl_certificate:配置证书的路径
- ssl_certificate_key: 配置私钥钥的路径
配置完成后,输入nginx -s reload重启nginx
nginx -s reload
4.8 在浏览器端查看效果
没有报错信息的话,在浏览器输入https协议的域名guojiongwei.top,打开控制台,会看到该域名下的请求协议已经变成了http2,前缀也变成了https,代表开启成功了。
http/2相对http/1.1新增了很多优化,比如二进制分帧,头部压缩,服务端推送,多路复用等特性,优化了http/1.1队头阻塞问题,减少了头部数据大小,极大的提高的网络性能和速度。
五. 已安装nginx添加https和http2模块
如果nginx已经安装了,但如果安装时没有安装http_ssl_module和http_v2_module模块,但此时已经有了很多配置文件,不好卸载nginx重新安装,那就可以按照下面的步骤在不用卸载nginx的情况下添加http_ssl_module和http_v2_module模块。
如果nginx没有安装http_ssl_module模块,在上面配置好https配置后执行nginx -s reload,此时会提示:
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:36
因为nginx开启https需要安装http_ssl_module模块才可以开启,而nginx默认是没有安装该模块,前面我们安装的时候手动配置了该模块,,如果安装nginx的时候的时候没有安装该模块,就需要我们手动安装一下了,包括开启http2的http_v2_module模块也是一样的道理。
接下来就要在已安装的nginx上安装这两个模块了。
如果没有报错,说明nginx已经安装了http_ssl_module和http_v2_module模块,可以跳过后续的流程。
如果nginx.conf文件存在开启https和http2的配置要先注释掉,不然执行nginx部分操作命令都会提示需要http_ssl_module模块。
5.1 进入到nginx源码目录
nginx的源码目录一般和配置文件目录不在同一个文件位置,安装新模块需要在nginx源码目录重新执行 ./configure配置并make编译。
像本文 /usr/local/nginx-1.24.0文件夹即是nginx的源码目录,不同的安装方式可能源码目录不一样,要根据自己的服务器nginx目录来。
- /usr/local/nginx-1.24.0: nginx源码目录。
- /usr/local/nginx: nginx应用目录
cd /usr/local/nginx-1.24.0
5.2 配置新增https和http2模块
原先的nginx可能也安装了其他的模块,所以要先查看一下当前安装的模块,在当前安装的模块命令后面加上要新安装的模块,这样才不会影响到原有已安装的,输入查看命令:
nginx -V
为了方便演示,下面这张图我换了一个服务器查看的,每个已安装的nginx看到的结果可能都不一样,关键就是里面的configure arguments
参数,这是原先编译nginx时的参数,重新编译时也要把原先的参数带上,才能保证不会覆盖掉原先的配置。
带上原先的配置,再加上我们要新增的模块配置,最后在终端输入下面的命令:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
是原有的,我的这个示例服务器已经安装了--with-http_ssl_module
,再在后面加上--with-http_v2_module
命令,确保两个模块都会被配置。
如果输出的configure arguments
值为空,那也可以用上面的配置命令。
5.3 make重新编译nginx
在配置新增模块完成后,执行make重新编译,这里和上面安装nginx时不一样的是只编译不安装:
make
meke编译完成之后会在源码目录nginx-1.24.0下的objs目录下产生nginx的二进制文件,接下来就是把最新编译的这个nginx二进制文件替换原先 /usr/local/nginx/sbin/nginx二进制文件,来实现新增模块功能。
为了避免替换后出现问题,一般会先把原先的nginx二进制文件备份,再用上面编译好的nginx二进制文件替换,这样如果出现问题也可以很快的复原。
5.4 备份原先nginx二进制文件
原先的nginx二进制文件位于nginx的配置文件nginx.conf同层级的sbin目录中
cd /usr/local/nginx/sbin
ls
如下图:
执行cp命令来备份nginx二进制文件
cp nginx nginx.bak
再看当前目录下,已经有备份的nginx.bak文件了:
5.5 替换nginx二进制文件
- 新编译生成的nginx二进制文件在nginx源码目录中,位置是 /usr/local/nginx-1.24.0/objs/nginx
- 要被替换的原nginx二进制文件位置 /usr/local/nginx/sbin/nginx
执行替换操作:
cp /usr/local/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin/nginx
可能会出现cp: 无法创建普通文件"/usr/local/nginx/sbin/nginx": 文本文件忙
的提示,这是因为nginx现在正在运行着,可以先执行nginx -s quit把nginx平滑关闭后再执行替换命令,然后再启动nginx:
nginx
完成后再次执行nginx -V查看
nginx -V
此时看到在最后面已经有了 --with-http_v2_module和 --with-http_v2_module模块:
5.6 在浏览器端查看效果
现在编译后支持https和http2的配置已经完成了,打开原先注释掉的https和http2的nginx的配置,然后重启一下nginx。
nginx -s reload
在浏览器输入自己的域名guojiongwei.top,打开控制台
可以到protocol一栏已经变成h2了,scheme一栏是https,到此为止已经大功告成了,https和http/2都已经配置完成了,项目的访问速度和安全性都有了提升。
六.总结
本文详细的总结了一下我自己在给博客网站配置https和http2的流程,希望能对你有帮助,但不同服务器场景不一样,可能也会遇到其他新的问题,有问题可以私信或者评论。