0%

创建系统服务

定位到/usr/lib/systemd/system目录,新建’服务名称.service文件’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Unit]
#定义描述
Description=The ss-local service
#指定了在systemd在执行完那些target之后再启动该服务
#After=network.target remote-fs.target nss-lookup.target

[Service]
#定义Service 的运行type,一般是forking,就是后台运行
Type=forking
#以下定义systemctl start |stop |reload *.service 的每个执行方法,具体命令#需要>写绝对路径
ExecStart=/path/to/execfile
ExecReload=/opt/openresty/bin/openresty -p
ExecStop=/opt/openresty/bin/openresty -p

KillMode=control-group
Restart=on-failure
#创建私有的内存临时空间
PrivateTmp=true

[Install]
WantedBy=multi-user.target

插件安装

  • perl: CocInstall coc-perl ; npm install -g perlnavigator-server
  • js: CocInstall coc-tsserver
  • snippets: CocInstall coc-snippets
  • CocConfig配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    {
    "perl.navigator.enable": true,
    "perl.navigator.serverPath": "/home/gdf/soft/node-v22.11.0-linux-x64/lib/node_modules/perlnavigator-server/bin/perlnavigator",
    "clangd.path": "~/.config/coc/extensions/coc-clangd-data/install/18.1.3/clangd_18.1.3/bin/clangd",
    "languageserver": {
    "lua": {
    "command": "/opt/lua5.3.6/bin/lua-lsp",
    "filetypes": ["lua"]
    }

    }
    }

NERDTree 配置

使用F2快速展开或隐藏它打开vim时自动展开NERDTree

阅读全文 »

申请证书

1
certbot certonly --standalone -d abc.com

续签,需要暂停web服务器,让出80端口

1
certbot renew --cert-name abc.com

在文章中插入图片

绝对路径本地引用

当Hexo项目中只用到少量图片时,可以将图片统一放在source/images文件夹中,通过markdown语法访问它们。

1
![](/images/image.jpg)

图片既可以在首页内容中访问到,也可以在文章正文中访问到。

相对路径本地引用

图片除了可以放在统一的images文件夹中,还可以放在文章自己的目录中。文章的目录可以通过站点配置文件_config.yml来生成。
post_asset_folder: true
将_config.yml文件中的配置项post_asset_folder设为true后,执行命令$ hexo new post_name,在source/_posts中会生成文章post_name.md和同名文件夹post_name。将图片资源放在post_name中,文章就可以使用相对路径引用图片资源了。
![](image.jpg)

出现Unpected Application Error

路由的index.js里面createBrowserRouter时添加{basename:’/pan’}参数

nginx配置文件添加,否则刷新路由时会报找不到/pan/home

1
2
3
4
5
location /pan {
root html;
index index.html;
try_files $uri $uri/ /pan/index.html =404;
}

利用HTML5 File API 实现权限验证

  • 后端提供文件下载的接口与其他接口保证同样的权限验证策略,例如在header中验证Authorization头
  • 前端使用ajax请求文件下载的接口
  • 前端利用window.URL.createObjectURL将请求得到的内容转化为objectUrl
  • 前端模拟点击,使用window.URL.revokeObjectURL(url)实现文件下载
1
2
3
4
5
6
7
8
9
10
11
12
// 客户端
const download = async (url) => {
const response = await axios.get('/download/fileA', {headers: {Authorization: 'Token xxxxxx'}});
const blob = new Blob([response.data], { type: 'text/plain;charset=utf-8' });
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = [fileName];
a.click();
window.URL.revokeObjectURL(url);

}

基于jwt实现权限验证

  • 后端需要额外提供一个接口供用户获取下载用的token
  • 客户端使用ajax请求该接口获取token
  • 客户端模拟打开拼接了token的url:/download/fileA?token=xxx
  • 后端解析该token判断用户是否有权限下载该文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 服务器端
const jwt = require('jsonwebtoken');
...
router.get('/download/token', (req, res) => {
const secret = 'xxxxxx'
const token = jwt.sign({}, secret, { expiresIn: 2 }); // 2s内有效
return res.json({ token });

});

// 客户端
const download = async (url) => {
const { data: { token } } = await axios.get('/download/token');
let finalUrl = url;
if (url.includes('?')) {
finalUrl += `&token=${token}`;

} else {
finalUrl += `?token=${token}`;

}
window.open(finalUrl);

}

// 服务器端具体解析token下载文件的代码就省略了。
// jwt的使用参考jsonwebtoken库的使用

生命周期参数

泛型生命周期参数: ‘a通常和引用使用

1
2
3
4
5
6
7
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str{
if s1.len() > s2.len() {
x
}else{
y
}
}

函数具体化时泛型生命周期参数’a被指定为s2和s1中生命周期较短的那一个. 生命周期参数是为了指明某个对象的存活时间不能超过它所依赖的对象的存活时间.

git 命令

服务端初始化仓库 git init –bare 客户端初始化仓库 git init
客户端编辑完成后

1
2
git add hello.txt 
git commit -m "第一次提交"
阅读全文 »

location指令4种修饰符

1
2
3
4
5
location [ = | ~ | ~* | ^~ ] uri { ... }
= 完全匹配,只有完全相同的字符串才会匹配
~ 不区分大小写
~* 区分大小写
^~ 带这个修饰符的匹配上了后不会再去匹配正则

大规则:先进行前缀匹配prefix strings (prefix locations),最长匹配前缀会被记录,
再进行正则匹配,正则匹配成功则停止,否则使用前缀匹配

检测虚拟化相关命令

通过systemd-detect-virt命令获取本机的虚拟化方式 2.egrep “svm|vmx” /proc/cpuinfo 有输出代表实例支持虚拟化

1
2
3
$ lsmod | grep -i kvm
kvm_intel 204800 0
kvm 1347584 1 kvm_intel

如果模块已经加载可查看是否支持嵌套虚拟化:
cat /sys/module/<module>/parameters/nested
对于amd机器来说用
cat /sys/module/kvm_amd/
对于intel型的cpu用
cat /sys/module/kvm_intel/parameters/nested
如果不支持嵌套,编辑/etc/modprobe.d/kvm.conf增加一行:
options kvm-intel nested=1
然后执行
sudo modprobe -r kvm-intel