CasperG's Blog

Some People choose to see the ugliness in the world, the disarray. I choose to see the beauty.

acme证书申请


本文记录了如何使用 .acme.sh进行SSL证书的申请(三个月有效)。
操作需要在root用户下执行。

  1. 安装前置
    sudo apt install curl socat

  2. 获取脚本
    curl https://get.acme.sh | sh

  3. 申请证书

    1
    2
    3
    ~/.acme.sh/acme.sh --register-account -m xxx@xxx \\注册邮箱
    ~/.acme.sh/acme.sh --issue -d xxx.xxx.xxx --standalone \\申请域名证书
    ~/.acme.sh/acme.sh --installcert -d xxx.xxx.xxx --key-file [path.key] --fullchain-file [path.crt] \\安装证书

参考内容: X-ui可视化面板

docker部署命令详解


一、安装docker

  1. 卸载旧版本docker
    1
    sudo apt-get remove docker docker-engine docker.io
  2. 安装docker
    1
    2
    sudo apt update
    sudo apt install docker-ce
  3. 安装docker-compose
    1
    2
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    卸载docker-compose
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sudo rm /usr/local/bin/docker-compose
    ```

    #### 二、docker命令
    1. 启动服务相关
    ```shell
    # 启动docker
    sudo service docker start

    # 停止docker
    sudo service docker stop

    # 重启docker
    sudo service docker restart
  4. 镜像相关
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 列出镜像
    sudo docker image ls

    # 拉取镜像
    sudo docker image pull library/hello-world #docker库内
    sudo docker image pull hello-world

    # 删除镜像
    sudo docker image rm hello-world

    # 打包(将镜像打包为文件)
    sudo docker save -o [保存的文件名] [镜像名]

    # 如:
    sudo docker save -o ./ubuntu.tar ubuntu

    # 加载
    sudo docker load -i ./ubuntu.tar
  5. 容器相关
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    # 创建容器(创建后运行)
    sudo docker run [option] [镜像名] [向启动容器中传入的命令]

    # 可选参数
    -i # 表示以“交互模式”运行容器
    -t # 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
    --name # 为创建的容器命名
    -v # 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
    -d # 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
    -p # 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
    -e # 为容器设置环境变量
    --network=host # 表示将主机的网络环境映射到容器中,容器的网络与主机相同(不能与-p同时使用)

    # 交互式容器(可在终端控制台使用命令)
    sudo docker run -it --name=myubuntu ubuntu /bin/bash

    # 守护式容器(长期运行不停止)
    sudo docker run -dit --name=myubuntu2 ubuntu

    # 进入已运行的容器
    sudo docker exec -it [容器名或容器id] [进入后执行的第一个命令]
    sudo docker exec -it nginx /bin/bash

    # 列出正在运行的容器
    sudo docker container ls

    # 列出全部容器
    sudo docker container ls --all

    # 停止一个已经在运行的容器
    sudo docker container stop [容器名或容器id]

    # 启动一个已经停止的容器
    sudo docker container start [容器名或容器id]

    # kill掉一个已经在运行的容器
    sudo docker container kill [容器名或容器id]

    # 删除容器
    sudo docker container rm [容器名或容器id]

    将容器打包为镜像
    1
    sudo docker commit [容器名] [镜像名]
    从docker容器中导入/导出文件
    1
    2
    3
    4
    5
    # 从容器导出
    docker cp [容器ID]:[source] [destination]

    #导入容器
    docker cp [source] [容器ID]:[destination]

三、dockerhub

dockerhub是一个用于保存docker镜像的仓库,类似于Github。

  1. 登录和退出
    1
    2
    docker login
    docker logout
  2. 拉取镜像
    1
    2
    3
    4
    5
    # 在官方仓库搜索镜像
    docker search xxx

    # 拉取镜像
    docker pull xxx
  3. 推送镜像到在线仓库
    1
    2
    3
    #示例:镜像mynginx
    docker tag mynginx:v1 username/mynginx:v1 #打上gurh16的tag
    docker push username/mynginx:v1
    注意:一定要先给镜像打tag,再推送!

参考内容: Ubuntu安装docker-吉吉博客

Nginx配置新版2022


一、Conf.d文件夹的应用

在新版nginx中,假设网站不需要每次都编辑/etc/nginx/nginx.conf。现可将xxx.conf放入/etc/nginx/conf.d/文件夹中,nginx会自动识别配置。

  • /etc/nginx/conf.d/xxx.conf的编写格式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    server { # http访问配置
    listen 80;
    listen [::]:80;
    server_name ohuai.guru;
    rewrite ^(.*)$ https://ohuai.guru$1 permanent; # 将http重定向至https
    }

    server { # https访问配置
    listen 443; # ipv4
    listen [::]:443; # ipv6
    server_name ohuai.guru;
    ssl on;
    ssl_certificate /blog/ssl/ohuai.guru_bundle.crt;
    ssl_certificate_key /blog/ssl/ohuai.guru.key;
    ssl_session_timeout 5s;
    ssl_prefer_server_ciphers on;

    location / {
    root /blog/gurh-blog/public;
    index index.html;
    }
    }
    /etc/nginx/conf.d/xxx.conf中,只需要填写server{}部分http{}部分不用填写。

二、 nginx反代

通过nginx反代,原本需要用主域名+端口号访问的服务可以通过二级域名来访问,并且此访问使用https.

  1. 在cloudflare添加A记录将服务器ip解析至二级域名
  2. 申请二级域名证书
  3. /etc/nginx/conf.d/中添加xx.conf文件,
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    server {
    listen 443;
    listen [::]:443;
    server_name code.ohuai.guru; # 二级域名
    ssl on;
    ssl_certificate /blog/ssl/code.ohuai.guru_bundle.crt; # 证书文件绝对路径
    ssl_certificate_key /blog/ssl/code.ohuai.guru.key;
    # 私钥文件绝对路径
    ssl_session_timeout 5s;
    ssl_prefer_server_ciphers on;

    location / {
    proxy_pass http://172.17.0.3:8443/; # 该服务容器的内网ip
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real_IP $remote_addr;
    }
    }
    注意:proxy_pass中的网址必须以/结尾。

服务器扁平化管理详情


为了便于服务器的管理及维护, 本次使用了扁平化管理来重新配置本服务器,即所有服务独立运行在docker容器中,互不干扰。

一、服务器支持的服务

  • Portainer(在线管理docker containers)
  • Code-server (在线编辑发布Blog)
  • Nginx
  • X-UI(可视化X-ray面板)
  • Zerotier(位于宿主机)

(具体访问链接位于备忘录)

二、更新内容

  1. 添加了对博客在线编辑/发布的支持
  2. 增加了nginx反向代理,各服务可通过https二级域名访问
  3. 增加了对X-ray及Xtls的支持,X-UI管理界面可同时配置多条线路
  4. 将服务器加入内网,现可通过10.0.1.101连接(Zerotier
  5. 博客增加了Github Pages 镜像站 https://mirror.ohuai.guru,再也不怕走丢啦!!!

新版本博客进度跟踪


1. 版本信息描述

1
2
3
4
5
6
7
os: CentOS 7
kernel: 4.14.129-bbrplus
node: v14.17.0
npm: 6.14.14
hexo: 4.2.0
next: 7.8.0
next_scheme: Pisces

2. 新版本特性

  • 更换域名为ohuai.guru

  • 添加透明背景+图片背景

  • 添加关于页面

  • 更改文章网址为 https://ohuai.guru/YY/MM/DD/number (新文章需要在yaml中加入number: xxx)

  • 添加顶部阅读进度条reading_progress

  • 添加网页加载进度图标pace_corner_indicator

  • 添加gittalk支持 (gurh16/blogtalk)

  • 添加sidebar&文章底部的CC版权声明

  • 添加sidebar阅读进度/回到顶部按钮

  • 添加烟花鼠标点击效果

  • 添加sidebar旋转头像; Email. Telegram链接

  • 添加友情链接

  • 添加busuanzi浏览量统计

  • 添加页面底部跳动的心💓

3. 计划加入特性

  • 文章置顶功能
  • 转发分享按钮
  • 同步博客到github
  • 打包环境为docker

使用PlatformIO配置开发ESP8266


[TOC]

系统版本:Windows11 家庭中文版

VS Code 主题: Monokai Pro/Classic

Prerequisite:Arduino IDE, Python3.8

​ 眼球无法忍受Arduino IDE 的丑陋主题,遂使用VS Code + PlatformIO 插件进行开发。PlatformIO是一个专门用于开发嵌入式系统的VS Code插件,笔者只用了一次就深深的爱上了这个优秀便利的开发环境。但是在配置PlatformIO过程中却遇到了很多问题,耗费了大量时间才得以解决。下面记录本次完整的安装过程。

PlatformIO相关网址

​ 官网:A professional collaborative platform for embedded development · PlatformIO

​ PlatformIO core 安装脚本: Installation — PlatformIO latest documentation

1. 下载PlatformIO IDE 插件

​ 在VS Code 插件市场中搜索PlatformIO IDE 安装,在右下角提示安装内核时最小化VS Code, 使用PlatformIO core 安装脚本 get-platformio-core.py 进行安装, 语法为:python.exe get-platformio.py. 安装完成后重启VS Code。

2. 配置PlatformIO

​ 在首选项中搜索PlatformIO, 禁用builtin python3。在首选项中搜索Ardunio 并输入Ardunio Path。(填写文件夹路径即可)

3. 创建PlatformIO项目

​ 点击左侧按钮栏新出现的外星人图标,点击New Project。输入项目名称并选择开发板NodeMCU1.0 (12E). 第一次加载会联网下载所需库文件,时间会非常之长,但请务必不要挂代理!!! (开发者已经创建了中国CDN,挂代理反而会下载不了)。

4. platformio.ini

​ 这个文件是项目的配置文件,具体配置可以查阅 官方doc

5. 基本操作和主要文件

​ 程序源代码位于/src/main.cpp中, 可以在与/src同级目录下创建/data文件夹,用于存放准备上传到闪存中的文件。

​ 左下角的->为编译上传按钮,插头按钮为串口监视器,默认波特率9600。

​ 上传文件请使用Upload Filesystem Image功能, 位于外星人图标 ->PROJECT TASKS ->``Upload Filesystem Image

malloc在结构体中的应用


​ 在SEE222的第一个project中,我们被要求使用c语言+arduino mega2560 实现一个银行系统。关于addAccount()的实现部分,笔者思来想去,决定使用malloc函数实现结构体的动态实例化。此方式可以实现通过多次调用一个函数来实现多个结构体变量的实例化。

结构体:

1
2
3
4
5
6
7
8
struct accounts
{
char name[25];
char cardNumber[4];
char password;
char expiryDate[4];
int balance;
};
  • 首先在main函数外使用accounts *g_accounts[1024];声明一个结构体指针。

  • 创建计数函数g_count int g_count = 0;

  • 在addAccount的implementation中使用如下语句对accounts结构体进行实例化(第g_counter个实例变量)并分配空间:

1
g_accounts[g_counter] = (accounts*)malloc(sizeof(accounts));
  • 在操作某个实例的值时,使用g_accounts[g_counter]->成员来访问某一结构体实例中的某成员。

  • 最后别忘了加上g_counter++.


完整示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int g_counter = 0; //声明结计数变量
struct accounts //创建结构体
{
char name[25];
char cardNumber[4];
char password;
char expiryDate[4];
int balance;
};
accounts *g_accounts[1024]; //声明一个结构体指针

void addAccount(){
g_accounts[g_counter] = (accounts*)malloc(sizeof(accounts); //实例化并分配空间
scanf("%s",(g_accounts[g_counter]->name)); //操作结构体实例中的成员
}

在Windows10下利用WSL2运行Ubuntu的解决方案


WSL2是微软自带的一款超优秀的linux虚拟机,借助WSL2,可以在Win10中创建一个linux发行版子系统

前置需求:

Win10最新版本

管理员模式下的PowerShell或命令提示符

安装步骤:

  1. 在PowerShell中运行以下命令以安装WSL2:

    1
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  2. 启用虚拟机平台

    1
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

    重启计算机以完成安装

  3. 安装Linux内核更新包(备份在OneDrive中)

适用于x64的WSL2 Linux内核更新包

  1. 将WSL2设置为默认版本
1
wsl --set-default-version 2
  1. 安装Linux发行版

    在Microsoft Store中搜索Ubuntu并安装

    企业微信截图_16206569018073.png

  2. 启动软件,Ubuntu将自动安装

使用:

在PowerShell或命令提示符中输入wsl以启动Ubuntu.

记录一次博客失效的解决方案


今儿早上登录Blog的时候发现页面又变成了万恶的Movie Theater…… 2021年2月23号曾经出现过这种情况,产生原因至今未知。

出现原因:

/etc/nginx/nginx.conf 配置文件出现问题。

解决方案:

重新编写nginx.conf配置文件(解析如下)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;

server{
listen 443 ssl;
server_name www.gurh16.top;
ssl_certificate /home/wwwroot/www.gurh16.top/ssl/1_www.gurh16.top_bundle.crt;
ssl_certificate_key /home/wwwroot/www.gurh16.top/ssl/2_www.gurh16.top.key; #证书绝对路径
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA_AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /home/wwwroot/blog/public; #网站根目录绝对路径
index index.html index.htm;
try_files $uri $uri/ =404; #可不加,试错
}
}

server {
listen 443 ssl;
server_name blog.gurh16.top;
ssl_certificate /home/wwwroot/blog/ssl/1_blog.gurh16.top_bundle.crt; #ssl证书路径
ssl_certificate_key /home/wwwroot/blog/ssl/2_blog.gurh16.top.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA_AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /home/wwwroot/blog/public;
index index.html index.htm;
try_files $uri $uri/ =404;
}
}

server {
listen 80;
server_name www.gurh16.top;
rewrite ^/(.*)$ https://www.gurh16.top:443/$1 permanent; #将80重定向至443
}

server {
listen 80;
server_name blog.gurh16.top;
rewrite ^/(.*)$ https://blog.gurh16.top:443/$1 permanent;
}

# test
server {
listen 80 default_server;
server_name _;
location / {
root /home/wwwroot/blog/public;
index index.html index.htm;
try_files $uri $uri/ =404;
}
}
}

修改完成之后使用 nginx -s reload刷新配置文件。