这段时间借助hexo粗略的搭建了一个自己的个人博客,通过域名访问时发现浏览器一直不安全,最后发现是因为一直通过的http访问。想着既然如此一步到位,完善成https访问方式。正巧腾讯云域名申请报备后, SSL证书的申请很容易, 查阅了不少资料,作为小白最后也完成了这一目标。 所以在这里将踩过的坑,以及经验步骤总结如下,欢迎指正。
首先我会简单解释一下nginx、以及反向代理。
能找到的大多数资料都是基于 nginx 实现的,那么什么是 nginx 呢?
Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。 ——摘自维基百科
对于不熟悉web的人,或者小白可以将其看作一网页服务器就好,我们这里需要用到的主要有反向代理。
借助在知乎上找到的一个图可以很好的解释
没看明白?没事,来点形象的栗子
正向代理:
假如你们宿舍只有一位同学可以用手机上网购物,你们有购物的需求都需要借助这位同学来实现。在这个过程中,最终你们都可以达到在电商平台购物的目的,但对于电商平台或者说店家来说,他并不知道到底是谁购买了产品。
在宿舍这可看作一个小的LAN,那位可以用手机上网的同学则充当了正向代理的作用,即我们一般意义上的代理。
反向代理:
换个栗子,你们社团需要买一些办公用品以及活动用品,交由一个同学外出采购,因为他有附近所有商家的联系方式。你们将需要购买的用品告诉那个同学后,那个同学外出采购,再带回来。在这个过程中,你们只提交了需求,交由那个同学去完成,而最终每一个物品在实际在哪家店购买,你们并不知晓。
在上面这个过程中,那位 同学便 扮演了反向代理的角色。
1、保护服务安全
隐藏服务节点的IP;
将服务节点置于防火墙之后,避免直接攻击业务节点服务器。
2、服务节点更专注于业务,同时提升性能
由于有反向代理的存在,可以让反向代理服务器去实现比如https、gzip压缩等与业务无关的功能;
提供动静态分离,将静态文件发往静态服务器或本地文件系统,避免业务节点处理这些与业务无关的请求;
提供缓存机制,将一些短时间内不会变化的动态内容,在反向代理服务器这层增加缓存,降低业务服务器的请求量;
由于控制权在代理服务这边,完全可以根据服务节点的性能动态分配请求,做到服务节点性能最佳。
正是由于Ngxin引入了反向代理的特性,让请求和响应都要经过Nginx,因此给Nginx带来了非常多的可能。比如负载均衡、HTTP缓存等。
以上内容来自:php中文网
说回实际,因为 hexo 服务默认开启端口是4000,我们可以通过反向代理将 https 或者 http 指向4000端口。
软件 | 版本 |
---|---|
ubuntu | 18.04.5 |
nginx | 1.14.0(Ubuntu) |
注意由于nginx版本不同,配置可能不同
配置https服务,必须得有SSL证书。在某某云申请的域名、云服务器,都可以在对应的平台申请SSL 证书,很容易且快速。
在腾讯云官网购买的云服务器,您可以登录 云服务器控制台 获取服务器 IP 地址、用户名及密码。
申请下SSL证书,将其下载解压后,会发现有Nginx文件夹,打开里面的.crt和.key文件即分别是你的证书和密钥。
sudo apt install nginx
安装好的 nginx 在 /etc/nginx 目录下,在此目录我们先创建一个ssl的目录用来存储证书。
cd /etc/nginx
sudo mkdir ssl
再通过ftp或者ssh将证书的.crt和.key文件上传到 ssl 这个目录下。
故这样你的
证书路径就是 /etc/nginx/ssl/1_xxxxxxx.xxx.crt
密钥路径:/etc/nginx/ssl/2_xxxxxxxx.xxx.key
在 /etc/nginx/conf.d 目录下,创建 yoursite.conf 文件,内容如下:
以下配置参考自腾讯云文档中心
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name your_domain_name;
#证书文件名称 即.crt文件路径
ssl_certificate /etc/nginx/ssl/1_xxxxxxx.xxx.crt;
#私钥文件名称 即.key文件路径
ssl_certificate_key /etc/nginx/ssl/2_xxxxxxxx.xxx.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
root html;
index index.html index.htm;
#配置代理 因为hexo默认端口为4000,故使其指向
proxy_pass http://localhost:4000;
}
}
server {
listen 80;
#填写绑定证书的域名
server_name your_domain_name;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
完成后,保存并退出。
第一个 server 是配置443端口的https服务,第二个server 是使http自动跳转到Https的安全配置。
在nginx根目录下,通过执行以下指令验证配置文件是否正确
sudo nginx -t
显示ok和successful则代表成功。
重启nginx服务
sudo systemctl restart nginx
检查nginx状态
systemctl status nginx
到这里一切顺利的话,则代表你的配置成功了,现在已经可以通过Https访问你的网站,浏览器不会再显示不安全。