Hexo不必转换成静态网页再交给比如Nginx,tomcat这样的工具发布网站,内置了一个服务器。但是默认情况下是不带SSL证书的。
效果展示
以下三个服务器都是使用Hexo提供网页服务的。
基本步骤
1.准备SSL证书。
去提供云服务的官网下载自己购买的、已经备案的域名的SSL证书,比如阿里云,腾讯云,华为云等,这里介绍的是阿里云与腾讯云。
需要注意的是,这里需要下载的是服务器类型为Nginx的,后面配置时需要使用到。
阿里云下载解压后可以得到一个.pem文件和.key文件,而腾讯云有所不同,是一个.crt文件和.pem文件。
注意 以下配置方法以阿里云的为例,腾讯云方法一样,.crt文件的作用和.pem是相同的,也就是说阿里云中使用.pem在腾讯云中则使用.crt文件。
2.上传到云服务器
为了管理方便,在云服务器上自己hexo项目文件夹(也就是将来要发布成网站的文件夹)中新建ssl文件夹,把这两个文件上传到这个ssl文件夹中。比如说当前这个hexo项目文件夹为"withyan",则ssl文件夹即在withyan文件夹中,其中withyan文件夹的路径为:/root/withyan
3.配置server.js
整个自己的hexo项目有个入口地址,即server.js文件,目录为withyan/node_modules/hexo-server/lib
。
注意需要安装express,即在hexo项目目录下,输入命令如下:
## 或者npm
cnpm install express --save
接下来需要对这个server.js文件进行修改。
# 跳转到相应目录,备份一下需要修改的文件
$ cd withyan/node_modules/hexo-server/lib
$ cp server.js server.js.back
编辑这个server.js文件,修改后内容如下,注意需要根据实际情况修改SSL证书文件名:
var fs = require('fs');
var connect = require('connect');
var http = require('https');
var chalk = require('chalk');
var Promise = require('bluebird');
var open = require('opn');
var net = require('net');
var url = require('url');
var express = require('express');
var httpApp = express();
httpApp.all("*", (req, res, next) => {
let host = req.headers.host;
host = host.replace(/\:\d+$/, ''); // Remove port number
res.redirect(307, `https://${host}${req.path}`);
});
httpApp.listen(80, function () {
console.log('http on 80 Welcome to Smileyan.cn');
});
const options = {
key : fs.readFileSync("/withyan.cn.key"),
cert: fs.readFileSync("/withyan.cn.pem")
}
module.exports = function(args) {
var app = connect();
var config = this.config;
var ip = args.i || args.ip || config.server.ip || undefined;
var port = parseInt(args.p || args.port || config.server.port || process.env.port, 10) || 4000;
var root = config.root;
var self = this;
return checkPort(ip, port).then(function() {
return self.extend.filter.exec('server_middleware', app, {context: self});
}).then(function() {
if (args.s || args.static) {
return self.load();
}
return self.watch();
}).then(function() {
return startServer(http.createServer(options,app), 443, ip);
}).then(function(server) {
var addr = server.address();
var addrString = formatAddress(ip || addr.address, addr.port, root);
self.log.info('Hexo is running at %s . Press Ctrl+C to stop.', chalk.underline(addrString));
self.emit('server');
if (args.o || args.open) {
open(addrString);
}
return server;
}).catch(function(err) {
switch (err.code){
case 'EADDRINUSE':
self.log.fatal('Port %d has been used. Try other port instead.', port);
break;
case 'EACCES':
self.log.fatal('Permission denied. You can\'t use port ' + port + '.');
break;
}
self.unwatch();
throw err;
});
};
function startServer(server, port, ip) {
return new Promise(function(resolve, reject) {
server.listen(port, ip, function() {
resolve(server);
});
server.on('error', reject);
});
}
function checkPort(ip, port) {
return new Promise(function(resolve, reject) {
if (port > 65535 || port < 1) {
return reject(new Error('Port number ' + port + ' is invalid. Try a number between 1 and 65535.'));
}
var server = net.createServer();
server.once('error', reject);
server.once('listening', function() {
server.close();
resolve();
});
server.listen(port, ip);
});
}
function formatAddress(ip, port, root) {
var hostname = ip;
if (ip === '0.0.0.0' || ip === '::') {
hostname = 'localhost';
}
return url.format({protocol: 'http', hostname: hostname, port: port, path: root});
}
分析
- 首先需要引入相关依赖
- var fs = require(‘fs’);
- var express = require(‘express’);
- 需要更改以前默认使用的http改为https
- 以前是 var http = require(‘http’);
- 现在是 var http = require(‘https’);
- 需要配置httpApp
- 可以理解为把所有http在80端口的请求拦截转到https进行处
- var httpApp = express() 和 httpApp.all 和httpApp.listen
- 当然,需要配置一下SSL相关证书文件路径,即const options
- 最后把以前的http.createServer(app) 改为 http.createServer(options,app)。
- 需要自己再源代码中找一下。
好处与坏处
- 好处:所有80端口的http请求全部都转到https请求;成功安装SSL证书,更加安全;显得高大上;治疗强迫症晚期的程序员患者相关疾病。
- 坏处:从此使用
hexo s -p 4534
启动hexo项目后面的端口配置完全失效了。只能在80端口上运行。
4.测试效果
在hexo项目文件夹下,这里即withyan
目录下,启动hexo
hexo s
然后打开浏览器访问自己的域名就可以成功了。
注意事项
总体来说比较简单,注意事项如下:
- 不要弄错了hexo-server目录的地址,在hexo这个项目下的node_modules,而不是在别的位置。
- 记得修改server.js之前进行备份,免得“回不了头”。
- 在基本理解的情况下进行修改,注意别改错了。
- 高版本的hexo可能会提示
opn
没有安装,安装也很简单,在hexo项目目录下,npm install opn --save
即可。 - 有耐心,遇到问题慢慢解决。
注意:严禁抄袭!转载需要征得作者同意。谢谢
其他
Node.js安装SSL的例子
let express = require("express");
var https = require('https')
,fs = require("fs");
var options = {
key : fs.readFileSync("./withyan.cn.key"),
cert: fs.readFileSync("./withyan.cn.pem")
};
let app = express();
app.get('/', function (req, res) {
res.send('Hello World');
})
https.createServer(options, app).listen(3011, function () {
console.log('Https server listening on port ' + 3011);
});
启动
node app.js
效果
https://www.jianshu.com/p/638f364e0642?utm_source=oschina-app
https://www.jb51.net/article/141558.htm
https://www.jb51.net/article/141536.htm
总结
稍微读一下源码和官方文档,再加上查一下资料就能解决问题。
Smileyan
2020.1.4 18:59
2020.1.4 18:59