零基础保姆级小白节点搭建教学,目前最安全最稳定的搭建方式,通过x-ui面板实现单端口多用户合租

教程完全零基础手把手教学,只要跟着步骤来一定能成功搭建。
使用X-UI面板搭建vmess+ws+tls+web或者vless+ws+tls+web的节点,这是目前最安全的搭建方式
并且为了更进一步的安全,有些步骤甚至有点繁琐,这都是值得的,只有安全了才能实现省时省心
非常适合想有自己专属稳定的节点又不太愿意折腾的朋友。跳出翻墙出来学翻墙的怪圈。

至于高速稳定只有靠钞能力解决了,作为电信用户的我,刨除高攀不起的专线,个人承受范围内最好的线路是CN2 GIA
本教程使用的是搬瓦工CN2GIA线路,经过了三网优化,电信、移动、联通用户都能获得非常稳定的体验,实现全天稳定丝滑的科学上网体验,告别晚高峰拥堵的情况
考虑到GIA线路比较贵,最后给大家提供一种使用x-ui面板通过WS路径分流实现单端口多用户的合租方案,可以和你的朋友合租来分摊费用

VPS购买

搬瓦工
优惠码: BWHNCXNVXV

系统:Ubuntu22.04

执行unminimize之后,中途如果出现的A new version提示信息,输入数字2,再回车即可

域名购买

namesilo
优惠码:oldtong

SSH工具

FinallShell

方法一:手动搭建

节点搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!!!重要!x-ui不要把xray版本升级到1.7.5以上,否则无法搭建vless节点!
#更新软件源
apt update
#启用 BBR TCP 拥塞控制算法
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

#安装x-ui:
bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)

#安装nginx
apt install nginx
#安装acme:
curl https://get.acme.sh | sh
#添加软链接:
ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
#切换CA机构:
acme.sh --set-default-ca --server letsencrypt
#申请证书:
acme.sh --issue -d 你的域名 -k ec-256 --webroot /var/www/html
#安装证书:
acme.sh --install-cert -d 你的域名 --ecc --key-file /etc/x-ui/server.key --fullchain-file /etc/x-ui/server.crt --reloadcmd "systemctl force-reload nginx"

寻找适合的伪装站

http站点优先,个人网盘符合单节点大流量特征

示例关键字:intext:登录 Cloudreve

配置nginx

配置文件路径:/etc/nginx/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
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 1024;
}

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip on;

server {
listen 443 ssl;

server_name nicename.co; #你的域名
ssl_certificate /etc/x-ui/server.crt; #证书位置
ssl_certificate_key /etc/x-ui/server.key; #私钥位置

ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

location / {
proxy_pass https://bing.com; #伪装网址
proxy_redirect off;
proxy_ssl_server_name on;
sub_filter_once off;
sub_filter "bing.com" $server_name;
proxy_set_header Host "bing.com";
proxy_set_header Referer $http_referer;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Accept-Encoding "";
proxy_set_header Accept-Language "zh-CN";
}


location /ray { #分流路径
proxy_redirect off;
proxy_pass http://127.0.0.1:10000; #Xray端口
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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location /xui { #xui路径
proxy_redirect off;
proxy_pass http://127.0.0.1:9999; #xui监听端口
proxy_http_version 1.1;
proxy_set_header Host $host;
}
}

server {
listen 80;
location /.well-known/ {
root /var/www/html;
}
location / {
rewrite ^(.*)$ https://$host$1 permanent;
}
}
}

每次修改nginx配置文件后必须使用 systemctl reload nginx 命令重新加载配置文件

多用户合租

通过修改nginx的配置文件实现ws path路径分流

1
2
3
4
5
6
7
8
9
10
location /ray {   #分流路径
proxy_redirect off;
proxy_pass http://127.0.0.1:10000; #Xray端口
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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

MITM节点

服务端配置

1
2
3
4
5
#安装x-ui
bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)

#无域名,生成自签证书
openssl req -new -x509 -nodes -newkey rsa:2048 -keyout /etc/x-ui/ca.key -out /etc/x-ui/ca.crt -subj "/CN=MITM" -days 36500

image-20230531163823796

x-ui模板

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
{
"log": {
"access": "",
"error": "",
"loglevel": "warning"
},
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "bulianglin"
},
{
"id": "bulianglin-mitm",
"email": "mitm@mitm.com"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"certificates": [
{
"certificateFile": "/etc/x-ui/ca.crt",
"keyFile": "/etc/x-ui/ca.key"
}
]
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
},
{
"tag": "mitm",
"protocol": "freedom",
"streamSettings": {
"security": "tls",
"tlsSettings": {
"alpn": [
"http/1.1"
]
}
}
}
],
"routing": {
"rules": [
{
"user": "mitm@mitm.com",
"outboundTag": "mitm",
"type": "field"
}
]
}
}

客户端配置

xray模板

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
{
"log": {
"access": "",
"error": "",
"loglevel": "warning"
},
"inbounds": [
{
"tag": "socks",
"port": 8888,
"listen": "127.0.0.1",
"protocol": "socks",
"settings": {
"udp": true
},
"sniffing": {
"enabled": true
}
},
{
"tag": "http",
"port": 9999,
"listen": "127.0.0.1",
"protocol": "http",
"sniffing": {
"enabled": true
}
},
{
"listen": "127.0.0.1",
"port": 11111,
"tag": "in-mitm",
"protocol": "dokodemo-door",
"settings": {
"port": 443,
"followRedirect": true
},
"streamSettings": {
"security": "tls",
"tlsSettings": {
"certificates": [
{
"usage": "issue",
"certificateFile": "ca.crt",
"keyFile": "ca.key"
}
],
"alpn": [
"http/1.1"
]
}
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "你的服务器ip",
"port": 443,
"users": [
{
"id": "bulianglin",
"encryption": "none",
"flow": ""
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"allowInsecure": true
}
}
},
{
"tag": "out-mitm",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "你的服务器ip",
"port": 443,
"users": [
{
"id": "bulianglin-mitm",
"encryption": "none",
"flow": ""
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"allowInsecure": true
}
}
},
{
"tag": "direct",
"protocol": "freedom"
},
{
"protocol": "freedom",
"settings": {
"redirect": "127.0.0.1:11111"
},
"tag": "re-entry"
}
],
"routing": {
"domainStrategy": "IPOnDemand",
"domainMatcher": "mph",
"rules": [
{
"type": "field",
"outboundTag": "direct",
"domain": [
"geosite:cn"
]
},
{
"type": "field",
"outboundTag": "direct",
"ip": [
"geoip:private",
"geoip:cn"
]
},
{
"type": "field",
"inboundTag": "in-mitm",
"outboundTag": "out-mitm"
},
{
"type": "field",
"port": "443",
"protocol": "tls",
"outboundTag": "re-entry"
}
]
}
}

新建config.json,粘贴模板,打开v2rayN(6.0以下的版本)文件所在目录,Xray内核和程序在同一目录下,将证书文件和私钥复制到过去,然后在v2rayN中添加自定义配置服务器,随便给个别名,将我们刚才创建的配置文件导入进来,内核选择Xray,点击确定,选中刚才创建的节点,在浏览器中设置代理,可以用配置文件中socks的8888,或者HTTP的9999,尝试访问谷歌,可以看到弹出了不安全的警告信息,这是MITM的正常表现,因为我们现在用的是自己签的ca,证书由于我们还没有信任Xray的根证书颁发机构,所以弹出来警告,尝试访问YouTube,也是同样的警告,接下来需要信任我们的CA证书,双击打开,点击安装证书 存储位置按需选择,我选择当前用户,将证书导入到受信任的根证书颁发机构,导入成功后重启浏览器,此时再来访问谷歌就可以正常访问了,并且消除了TIT的特征,可以看到谷歌的证书是由Xray的自签CA颁发的,我给大家的配置分流规则是,国内网站不走代理,所以百度并没有进行MITM,证书还是正常的证书,只是我们走代理的网站会进行MITM,这就是MITM节点的搭建过程,还是很简单的,如果你不想使用了,强烈建议把刚才导入的CA证书移除受信任,在开始菜单中搜索cer,由于刚才我们是将证书导入到当前用户,所以选择管理用户证书,如果你导入的是本地计算机,就选择下面的管理计算机证书,在受信任的根证书颁发机构里面,找到刚才导入的MITM证书,将其删除即可,删除之后,再重新使用MITM节点访问谷歌,又会弹出安全警告了,这就是MITM节点的搭建方法,我个人是不建议平时用这种方式进行科学上网的,因为你无法保证你的VPS绝对安全,当然具体还是得看你自己,毕竟每个人对安全都有自己不同的标准

naive节点

naive服务端配置

编译安装caddy+naive:

1
2
3
4
5
6
7
8
9
10
apt install software-properties-common
add-apt-repository ppa:longsleep/golang-backports
apt update
apt install golang-go

#测试
go version

go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive

Caddyfile配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
:443, naive.buliang0.tk #你的域名
tls example@example.com #你的邮箱
route {
forward_proxy {
basic_auth user pass #用户名和密码
hide_ip
hide_via
probe_resistance
}
#支持多用户
forward_proxy {
basic_auth user2 pass2 #用户名和密码
hide_ip
hide_via
probe_resistance
}
reverse_proxy https://demo.cloudreve.org { #伪装网址
header_up Host {upstream_hostport}
header_up X-Forwarded-Host {host}
}
}

caddy常用指令:

前台运行caddy:./caddy run
后台运行caddy:./caddy start
停止caddy:./caddy stop
重载配置:./caddy reload

caddy配置守护进程(开机自启):https://github.com/klzgrad/naiveproxy/wiki/Run-Caddy-as-a-daemon

自定义端口:

naive如果要用自定义端口,需要使用json的配置方式,新手可以直接跳过

启动方式:./caddy start --config config.json

config.json内容:

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
//需删除注释内容caddy才能加载
{
"apps": {
"http": {
"servers": {
"srv0": {
"listen": [
":4431" //监听端口
],
"routes": [
{
"handle": [
{
"auth_user_deprecated": "user", //用户名
"auth_pass_deprecated": "pass", //密码
"handler": "forward_proxy",
"hide_ip": true,
"hide_via": true,
"probe_resistance": {}
}
]
},
{
"handle": [
{
"handler": "reverse_proxy",
"headers": {
"request": {
"set": {
"Host": [
"{http.reverse_proxy.upstream.hostport}"
],
"X-Forwarded-Host": [
"{http.request.host}"
]
}
}
},
"transport": {
"protocol": "http",
"tls": {}
},
"upstreams": [
{
"dial": "demo.cloudreve.org:443" //伪装网址
}
]
}
]
}
],
"tls_connection_policies": [
{
"match": {
"sni": [
"naive.buliang0.tk" //域名
]
},
"certificate_selection": {
"any_tag": [
"cert0"
]
}
}
],
"automatic_https": {
"disable": true
}
}
}
},
"tls": {
"certificates": {
"load_files": [
{
"certificate": "/root/a.crt", //公钥路径
"key": "/root/a.key", //私钥路径
"tags": [
"cert0"
]
}
]
}
}
}
}

客户端配置

naive客户端:https://github.com/klzgrad/naiveproxy/releases/latest

客户端配置:

1
2
3
4
{
"listen": "socks://127.0.0.1:1080",
"proxy": "https://user:pass@example.com"
}

使用v2rayN加载naive内核需要将配置文件的log行删除,否则会断流

TLS指纹查看

jarm工具:https://github.com/salesforce/jarm

下载jarm:wget https://raw.githubusercontent.com/salesforce/jarm/master/jarm.py
查看网站jarm指纹:python3 jarm.py naive.buliang0.tk

网络空间资产搜索引擎:https://fofa.info

方法二:脚本搭建

更新软件和安装工具

1
2
3
4
5
#系统centos
yum update -y && yum upgrade -y && yum install curl -y && yum -y install wget

#系统debian
apt update && apt upgrade -y && apt install curl -y && apt -y install wget

安装脚本

一直默认回车就好,碰到y or n 也可以回车

1
wget -P /root -N --no-check-certificate "https://raw.githubusercontent.com/mack-a/v2ray-agent/master/install.sh" && chmod 700 /root/install.sh && /root/install.sh

开启BBR加速

选择2 和 11 安装,然后再reboot

1
wget --no-check-certificate -O tcpx.sh https://raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master/tcpx.sh && chmod +x tcpx.sh && ./tcpx.sh

反向面试

大部分翻译自:https://github.com/viraptor/reverse-interview ,亦有其他网友补充。

译者总结的一份适合突击记忆的简洁版 LeetCode 题解和面试问题,也欢迎 Star。https://github.com/yifeikong/interview

下面列表里的问题对于参加技术面试的人来说可能有些用。
列表里的问题并不一定适用于某个特定的职位或者工作类型,也没有排序
最开始的时候这只是我自己的问题列表,但是慢慢地添加了一些我觉得可能让我对这家公司亮红牌的问题。
我也注意到被我面试的人提问我的问题太少了,感觉他们挺浪费机会的。

如果你问过的问题没有被列出来,请提交一个 PR。

翻译:

English
Korean
Portuguese
繁體中文

预期使用方式

  • 检查一下哪些问题你感兴趣
  • 检查一下哪些是你可以自己在网上找到答案的
  • 找不到的话就向面试官提问

绝对不要想把这个列表里的每个问题都问一遍。(尊重面试官的时间,而且你可以通过查找已经发布的答案来显示
你的主动性)

请记住事情总是灵活的,组织的结构调整也会经常发生。拥有一个 bug 追踪系统并不会保证高效处理 bug。
CI/CD (持续集成系统) 也不一定保证交付时间会很短。

职责

  • On-call (电话值班)的计划或者规定是什么?值班或者遇到问题加班时候有加班费吗?
  • 我的日常工作是什么?
  • 有给我设定的特定目标吗?
  • 团队里面初级和高级工程师的比例是多少?(有计划改变吗)
  • 入职培训 (onboarding) 会是什么样的?
  • 每个开发者有多大的自由来做出决定?
  • 在你看来,这个工作做到什么程度算成功?
  • 你期望我在最初的一个月 / 三个月能够完成什么?
  • 试用期结束的时候,你会怎么样衡量我的绩效?
  • 自己单独的开发活动和按部就班工作的比例大概是怎样的?
  • 一个典型的一天或者一周的工作是怎样安排的?
  • 对我的申请你有什么疑虑么?
  • 在这份工作上,我将会和谁紧密合作?
  • 我的直接上级他们的上级都是什么样的管理风格?(事无巨细还是着眼宏观)
  • 我在这个岗位上应该如何发展?会有哪些机会?
  • 每天预期 / 核心工作时间是多少小时?
  • 我入职的岗位是新增还是接替之前离职的同事?(是否有技术债需要还)?(zh)
  • 入职之后在哪个项目组,项目是新成立还是已有的?(zh)

技术

  • 公司常用的技术栈是什么?
  • 你们怎么使用源码控制系统?
  • 你们怎么测试代码?
  • 你们怎么追踪 bug?
  • 你们怎样监控项目?
  • 你们怎么集成和部署代码改动?是使用持续集成和持续部署吗 (CI/CD)?
  • 你们的基础设施搭建在版本管理系统里吗?或者是代码化的吗?
  • 从计划到完成一项任务的工作流是什么样的?
  • 你们如何准备故障恢复?
  • 有标准的开发环境吗?是强制的吗?
  • 你们需要花费多长时间来给产品搭建一个本地测试环境?(分钟 / 小时 / 天)
  • 你们需要花费多长时间来响应代码或者依赖中的安全问题?
  • 所有的开发者都可以使用他们电脑的本地管理员权限吗?
  • 介绍一下你们的技术原则或者展望。
  • 你们的代码有开发文档吗?有没有单独的供消费者阅读的文档?
  • 你们有更高层次的文档吗?比如说 ER 图,数据库范式
  • 你们使用静态代码分析吗?
  • 你们如何管理内部和外部的数字资产?
  • 你们如何管理依赖?
  • 公司是否有技术分享交流活动?有的话,多久一次呢?(zh)
  • 你们的数据库是怎么进行版本控制的?(zh)
  • 业务需求有没有文档记录?是如何记录的?(zh)

团队

  • 工作是怎么组织的?
  • 团队内 / 团队间的交流通常是怎样的?
  • 你们使用什么工具来做项目组织?你的实际体会是什么?
  • 如果遇到不同的意见怎样处理?
  • 谁来设定优先级 / 计划?
  • 如果团队没能赶上预期发布日期怎么办?
  • 每周都会开什么类型的会议?
  • 会有定期的和上级的一对一谈话吗?
  • 产品 / 服务的规划是什么样的?(n 周一发布 / 持续部署 / 多个发布流 / …)
  • 生产环境发生事故了怎么办?是否有不批评人而分析问题的文化?
  • 有没有一些团队正在经历还尚待解决的挑战?
  • 你们如何跟踪进度?
  • 预期和目标是如何设定的?谁来设定?
  • Code Review 如何实施?
  • 给我介绍下团队里一个典型的 sprint
  • 你们如何平衡技术和商业目标?
  • 你们如何共享知识?
  • 团队有多大?
  • 公司技术团队的架构和人员组成?(zh)
  • 团队内开发、产品、运营哪一方是需求的主要提出方?哪一方更强势?(zh)

问未来的同事

  • 开发者倾向于从哪里学习?
  • 你对在这里工作最满意的地方是?
  • 最不满意的呢?
  • 如果可以的话,你想改变哪里?
  • 团队最老的成员在这里多久了?
  • 在小团队中,有没有出现成员性格互相冲突的情况?最后是如何解决的?

公司

  • 公司为什么在招人?(产品发展 / 新产品 / 波动…)
  • 有没有会议 / 旅行预算?使用的规定是什么?
  • 晋升流程是怎样的?要求 / 预期是怎样沟通的?
  • 绩效评估流程是怎样的?
  • 技术和管理两条职业路径是分开的吗?
  • 对于多元化招聘的现状或者观点是什么?
  • 有公司级别的学习资源吗?比如电子书订阅或者在线课程?
  • 有获取证书的预算吗?
  • 公司的成熟度如何?(早期寻找方向 / 有内容的工作 / 维护中 / …)
  • 我可以为开源项目做贡献吗?是否需要审批?
  • 你认为公司未来五年或者十年会发展成什么样子?
  • 公司的大多数员工是如何看待整洁代码的?
  • 你上次注意到有人成长是什么时候?他们在哪方面成长了?
  • 在这里成功的定义是什么?如何衡量成功?
  • 有体育活动或者团建么?
  • 有内部的黑客马拉松活动吗?
  • 公司支持开源项目吗?
  • 有竞业限制或者保密协议需要签吗?
  • 你们认为公司文化中的空白是什么?
  • 能够跟我说一公司处于不良情况,以及如何处理的故事吗?
  • 您在这工作了多久了?您觉得体验如何?(zh)
  • 大家为什么会喜欢这里?(zh)
  • 公司的调薪制度是如何的?(zh)

社会问题

  • 你们关于多元化招聘什么看法?
  • 你们的公司文化如何?你认为有什么空白么?
  • 这里的工作生活平衡地怎么样?
  • 公司对气候变化有什么态度吗?

冲突

  • 不同的意见如何处理?
  • 如果被退回了会怎样?(“这个在预计的时间内做不完”)
  • 当团队有压力并且在超负荷工作的时候怎么处理?
  • 如果有人注意到了在流程或者技术等其他方面又改进的地方,怎么办?
  • 当管理层的预期和工程师的绩效之间有差距的时候如何处理?
  • 能给我讲一个公司深处有毒环境以及如何处理的故事吗?
  • 如果在公司内你的同事因涉嫌性侵犯他人而被调查,请问你会如何处理?
  • 假设我自己很不幸是在公司内被性侵的受害者,在公司内部有没有争取合法权益的渠道?

商业

  • 你们现在盈利吗?
  • 如果没有的话,还需要多久?
  • 公司的资金来源是什么?谁影响或者制定高层计划或方向?
  • 你们如何挣钱?
  • 什么阻止了你们挣更多的钱?
  • 公司未来一年的增长计划怎样?五年呢?
  • 你们认为什么是你们的竞争优势?
  • 你们的竞争优势是什么?
  • 公司未来的商业规划是怎样的?有上市的计划吗?(zh)

远程工作

  • 远程工作和办公室工作的比例是多少?
  • 公司提供硬件吗?更新计划如何?
  • 使用自己的硬件办公可以吗?现在有政策吗?
  • 额外的附件和家具可以通过公司购买吗?这方面是否有预算?
  • 有共享办公或者上网的预算吗?
  • 多久需要去一次办公室?
  • 公司的会议室是否一直是视频会议就绪的?

办公室布局

  • 办公室的布局如何?(开放的 / 小隔间 / 独立办公室)
  • 有没有支持 / 市场 / 或者其他需要大量打电话的团队在我的团队旁边办公?

终极问题

  • 该职位为何会空缺?
  • 公司如何保证人才不流失?
  • 这份工作 / 团队 / 公司最好和最坏的方面是?
  • 你最开始为什么选择了这家公司?
  • 你为什么留在这家公司?

待遇

  • 如果有奖金计划的话,奖金如何分配?
  • 如果有奖金计划的话,过去的几年里通常会发百分之多少的奖金?
  • 有五险一金(zh)/401k(us)或者其他退休养老金等福利吗?
  • 五险一金中,补充公积金一般交多少比例?/401k一般交多少比例?我可以自己选择这一比例吗?
  • 有什么医疗保险吗?如果有的话何时开始?
  • 有额外商业保险吗?例如人寿保险和额外的养老/医疗保险?
  • 更换工作地点,公司付费吗?

休假

  • 带薪休假时间有多久?
  • 病假和事假是分开的还是一起算?
  • 我可以提前使用假期时间吗?也就是说应休假期是负的?
  • 假期的更新策略是什么样的?也就是说未休的假期能否滚入下一周期
  • 照顾小孩的政策如何?
  • 无薪休假政策是什么样的?
  • 学术性休假政策是怎么样的?

NexT version 8.18.2

开启第三方插件

编辑整个博客文件夹下的themes/next/_config.ymlctrl+F搜索pjaxfalse改为true

接下来就可以添加喜欢的第三方插件了

添加看板娘-live2d_widget

项目地址:live2d-widget

加强版的live2d看板娘,可对话,换装互动

常用配置说明

模型的大小、位置、格式和文本内容等配置,需要自行设置一些配置文件waifu-tips.jswaifu-tips.jsonwaifu.css,这里提一些各文件里常用的配置。

waifu-tips.js

这里是模型加载启动/点击工具栏相应按钮时的行为和文本内容定义,具体对应可以对照参考原模型的行为,比如

2183122-20210503112404379-1613061177

这个部分是用来显示用户点回本页面时显示的文本,其余同理。

waifu-tips.json

这里是除了上面js里定义的文本以外的其余文本内容,同样可以对照参考原模型猜测来进行修改。

2183122-20210503112404630-2003319113

值得注意的是,这个文件里分了几大块,架构大概是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"mouseover": [{ // 鼠标悬停在某个特定元素时显示的文本
"selector": "...",
"text": "..."
}],
"click": [{ // 鼠标点击某个特定元素时显示的文本
"selector": "...",
"text": "..."
}],
"seasons": [{ // 在特定日期显示的文本
"date": "01/01",
"text": "..."
}]
}

text这里很显然是填显示的文本。

date是指定的特定日期。

至于selector就类似于CSS里的CSS选择器,是用来指定元素类型的。

值得注意的,使用cdn来引用GitHub仓库的代码,只会记录第一次上传的代码,后续在github仓库上修改代码,是不会刷新jsdelivr缓存的,这个我暂时没办法解决,最后本地配置调整好在push到仓库上

配置

编辑themes/next/ayout/_layout.njk文件

建议把项目克隆到自己的仓库,这样就可以使用自己的cdn加速,也可以根据自己喜欢来修改配置

head头部添加

1
<link rel="stylesheet" type="text/css" href="https://fastly.jsdelivr.net/gh/AienH/blog_plugin/live2d/assets/waifu.css"/>

body添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="waifu">
<div class="waifu-tips"></div>
<canvas id="live2d" class="live2d"></canvas>
<div class="waifu-tool">
<span class="fui-home"></span>
<span class="fui-chat"></span>
<span class="fui-eye"></span>
<span class="fui-user"></span>
<span class="fui-photo"></span>
<span class="fui-info-circle"></span>
<span class="fui-cross"></span>
</div>

<script src="https://fastly.jsdelivr.net/gh/AienH/blog_plugin/live2d/assets/waifu-tips.js"></script>
<script src="https://fastly.jsdelivr.net/gh/AienH/blog_plugin/live2d/assets/live2d.js"></script>

<script type="text/javascript">
live2d_settings['modelId'] = 1;
live2d_settings['modelTexturesId'] = 87;
initModel("https://fastly.jsdelivr.net/gh/AienH/blog_plugin/live2d/assets/waifu-tips.json")
</script>

最后再次编辑整个博客文件夹下的themes/next/_config.yml文件

在最下面添加

1
2
live2d:
enable: true

音乐播放器插件-APlayer & MetingJS

项目地址:APlayer MetingJS

介绍

  • APlayer 是一个简洁漂亮、功能强大的 Html5 音乐播放器。
  • MetingJS 是为 APlayer 添加网易云、QQ音乐等支持的插件。

老规矩,最好把项目拉到自己的GitHub仓库,防止作者链接失效

head头部添加

1
2
3
4
5
6
<script src="https://fastly.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
<link rel="stylesheet" href="https://fastly.jsdelivr.net/npm/font-awesome/css/font-awesome.min.css">
<script src=" https://cdn.jsdelivr.net/npm/jquery-ui@1.13.2/dist/jquery-ui.min.js "></script>
<script rel="preload" src="https://fastly.jsdelivr.net/gh/AienH/blog_plugin@master/APlayer/dist/APlayer.min.js"></script>
<script rel="preload" src="https://fastly.jsdelivr.net/gh/AienH/blog_plugin@master/MetingJS/dist/Meting.min.js"></script>
<link rel="stylesheet" href="https://fastly.jsdelivr.net/gh/AienH/blog_plugin@master/APlayer/dist/APlayer.min.css">

body添加

1
2
3
4
5
6
7
8
9
10
11
<meting-js
server="netease"
type="playlist"
id="8269382559"
autoplay="true"
volume="0.7"
fixed="true"
order="list"
preload="metadata"
lrc-type="0">
</meting-js>

参数说明

  • 引用这两个插件的前提是要先引用jquery.min.jsfont-awesome.min.cssjquery-ui.min.js
1
2
3
<script src="https://fastly.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
<link rel="stylesheet" href="https://fastly.jsdelivr.net/npm/font-awesome/css/font-awesome.min.css">
<script src=" https://cdn.jsdelivr.net/npm/jquery-ui@1.13.2/dist/jquery-ui.min.js "></script>

不然音乐插件不会生效

  • MetingJS参数详情
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--
id='外链播放器id',必须参数
type=[song=单曲, playlist=歌单, album=专辑, search=搜索结果, artist=艺术家],必须参数
server=[netease=网易云音乐, tencent=QQ音乐, kugou=酷狗音乐, xiami=虾米音乐, baidu=百度音乐],必须参数
fixed=启用固定模式,固定在左下角,默认false
mini=启用迷你模式,默认false
preload=[none,metadata,auto]
mutex=[互斥锁,默认true],默认false
order=[random=随机播放,list=列表播放]
loop=[all=全部循环, one=循环一次 ,none=不循环]
volume=[音量,默认0.7]
lrc-type=[歌词类型,默认0]
list-folded=[列表是否折叠,默认false]
list-max-height=列表最大高度,默认340px
storage-name=本地存储存储密钥,用于存储播放器设置,默认metingjs
-->

简介

自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败。最重要的原因是我习惯本地编辑,完成以后再一起上传github。看过了几个教程,总结出最适合自己的比较简单的方法。

img

1. github在线上传文件夹

在线上传也可以上传完整的文件夹结构,直接拖拽到上传文件页面的框中即可。

1.1点击上传文件

img

1.2 直接拖拽

直接拖拽即可上传文件夹及文件夹里面的文件。如果点击* choose your files *就只能上传单个文件。

img

2. 通过git工具上传本地文件夹(本地项目)

2.1 下载git工具

img

2.2 下载完成后安装完成,注意在安装过程中可以选择创建桌面快捷方式

img

2.3 绑定用户

打开git-bash.exe(直接在桌面上点击右键,或者点击开始按钮找到Git Bash)

img

在打开的GIt Bash中输入以下命令(用户和邮箱为你github注册的账号和邮箱)

1
2
$ git config --global user.name "hanyuntao"
$ git config --global user.email "hanyuntaocn@163.com"

img

2.4 设置SSH key(git中sshkey有何作用?
2.4.1 生成ssh key

首先检查是否已生成密钥cd ~/.ssh,如果返回的ls有3个文件,则密钥已经生成。

img

如果没有密钥,则通过

1
$ ssh-keygen -t rsa -C "hanyuntaocn@163.com"

生成,生成过程中一路按3次回车键就好了。(默认路径,默认没有密码登录)
生成成功后,去对应目录C:/Users/hyt.ssh里(hyt为电脑用户名,每个人不同)用记事本打开id_rsa.pub,得到ssh key公钥。

img

2.4.2 为github账号配置ssh key

切换到github,展开个人头像的小三角,点击settings,然后打开SSH keys菜单, 点击Add SSH key新增密钥,填上标题(最好跟本地仓库保持一致)。

img

接着将id_rsa.pub文件中key粘贴到此,最后Add key生成密钥.

2.5 上传本地项目到github

2.5.1 创建一个本地项目

这是我自己创建的几个文件夹及文件。

img

2.5.2 建立本地仓库

1.首先进入text文件夹

1
cd d:text

img

2.执行指令:

1
git init

![img](../images/git上传方法/执行git init.png)

初始化成功后你会发现项目里多了一个隐藏文件夹.git

img

3.执行指令:

1
git add .

将所有文件添加到仓库

img

4.执行指令:

1
git commit -m "提交文件"

双引号内是提交注释。

img

2.5.3 关联github仓库

1.到github text仓库复制仓库地址

img

2.执行指令:

1
git remote add origin https://github.com/hanyuntao/text.git

img

2.5.4 上传本地代码

执行指令:

1
git push -u origin master

img

2.5.5完成

可以看到我们的本地项目已经上传到了github上了。

img

注意:git是不能管理空的文件夹的,文件夹里必须有文件才能上传。

前言

对NAS总是抱有好奇?对NAS的价格望而却步?
但是,如果你有树莓派(或者其它arm64架构的开发板也行),或者是Linux服务器,为什么不试试让它们变成自己的小型NAS?

NAS

NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。

大型的NAS,比如:群晖。可以有App,对手机照片进行备份,还可以对数据进行灾变处理,但是价格就比较贵了。而本次搭建NAS,主要满足:

  • 在线访问数据
  • 下载站
  • 挂载到电脑上,作为网络U盘

操作思路

1. 在线访问数据

比如:.flv、.mp4、.jpg等等,我们使用PHP实现网络浏览,这里我们使用_h5ai:

演示网站

官方文档

2. 下载站

DownloadToNAS
下载站,我们使用Aria2这个多线程下载器实现,难点是挂载到电脑上,也就是目录映射。最好能满足:

  • 加密传输,保证安全
  • 支持平台多,速度稳定

3. 挂载到本地磁盘

在Windwos上挂载在Windwos上挂载

其实,本地挂载树莓派、服务器磁盘的选择有很多。比如:SMB、FTP等。但是,考虑安全和利用情况下,我还是选择Webdav。

Windows和macOS都支持挂载Webdav,但是可能会出现无法写的情况。我建议使用第三方免费工具:

以上两款软件也都是免费的。

本文使用Webdav挂载,如果你使用宝塔,或者使用SMB,那么也完全可以选择非Webdav协议挂载磁盘。

(宝塔不可使用Nginx Webdav插件)

总结

综上,我们本次需要安装:

  • Nginx:用来提供Web目录访问
  • PHP:用来映射目录,实现_h5ai
  • Nginx模块:Webdav模块和Fancyindex模块,用来实现Webdav

前排提示

本次教程,适用所有架构的Linux(arm架构和x86都可以)。PHP、Nginx的配置,使用编译安装的方法。

不建议用宝塔安装Nginx和PHP,服务管理起来不方便,其它的懂的都懂

服务器要求

如果是树莓派(或者其它arm64架构的开发板也行),那么没什么具体要求,有个可以刷写SD卡的软件即可

但是,如果是服务器,最好选择高带宽的服务器,内存最好需要2G以上,否则编译PHP时,可能需要SWAP的支持。

我的是香橙派,也是arm64架构的开发板,系统用的Debian11,用其它linux系统的可以根据 命令自行修改一下即可

从下面开始我都是用root用户来进行,不想用root用户的可以在命令前面加上sudo

PHP

PHP官方下载地址

安装依赖

为下面编译参数做准备

1
apt install build-essential pkg-config openssl libssl-dev libsqlite3-dev zlib1g-dev libcurl4-openssl-dev libpng-dev libjpeg-dev libonig-dev libzip-dev ffmpeg imagemagick -y

下载PHP

1
2
3
wget https://www.php.net/distributions/php-8.2.6.tar.gz -P /usr/local/src
cd /usr/local/src && tar xf php-8.2.6.tar.gz
cd php-8.2.6

配置用户和用户组

orangepi是我开发板自带的用户,不想用自带的用户也可以创建一个别的用户和用户组

如果你在服务器上操作,建议创建一个www用户和www用户组:

1
2
3
4
5
6
7
8
# 创建一个www用户
sudo useradd www

# 创建一个www用户组
sudo groupadd www

# www用户归属于www用户组
sudo usermod -a -G www www

配置编译参数

这是我配置的编译参数,其他PHP版本可能略微不一样,需要自己判断),也可以参考我这篇文章部署LNMP教程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
./configure \
--prefix=/usr/local/php \
--with-curl \
--with-mysqli \
--with-openssl \
--with-pdo-mysql \
--with-jpeg \
--enable-gd \
--enable-fpm \
--with-fpm-user=orangepi \
--with-fpm-group=orangepi \
--enable-bcmath \
--enable-xml \
--with-zip \
--enable-mbstring \
--enable-sockets \
--with-zlib \
--enable-fileinfo \
--enable-exif
  • –with-fpm-user:fpm进程属于的用户
  • –with-fpm-group:fpm进程属于的用户组

编译安装

上面的configure配置没有问题,接下来就是编译和安装了,我图方便就一条命令来执行,新手可以把两条命令分开执行,先makemake install

1
make -j$(nproc) && make install -j$(nproc)

复制配置文件

1
2
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

测试运行

1
/usr/local/php7/sbin/php-fpm

查看服务进程和端口

1
2
ps aux | grep php-fpm
lsof -i:9000

Nginx

Nginx官方下载地址

安装依赖

为下面编译参数做准备

1
apt install build-essential libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev libxml2-dev libxslt-dev -y

额外模块

如果我们需要进行目录映射,需要更好看的、更实用的目录映射,需要额外的Fancyindex模块支持。

Nginx自带的Webdav支持不完善,需要额外的模块进行支持。

1
2
3
mkdir /usr/local/src/NginxModule/ && cd /usr/local/src/NginxModule
git clone https://github.com/arut/nginx-dav-ext-module.git
git clone https://github.com/aperezdc/ngx-fancyindex.git

下载Nginx

1
2
3
wget http://nginx.org/download/nginx-1.24.0.tar.gz -P /usr/local/src
cd /usr/local/src && tar xf nginx-1.24.0.tar.gz
cd nginx-1.24.0

配置用户和用户组

orangepi是我开发板自带的用户,不想用自带的用户也可以创建一个别的用户和用户组

如果你在服务器上操作,建议创建一个www用户和www用户组:

1
2
3
4
5
6
7
8
# 创建一个www用户
sudo useradd www

# 创建一个www用户组
sudo groupadd www

# www用户归属于www用户组
sudo usermod -a -G www www

配置编译参数

这是我配置的编译参数,其他Nginx版本可能略微不一样,需要自己判断),也可以参考我这篇文章部署LNMP教程

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
./configure \
--prefix=/usr/local/nginx \
--user=orangepi \
--group=orangepi \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--add-module=/usr/local/src/NginxModule/nginx-dav-ext-module \
--add-module=/usr/local/src/NginxModule/ngx-fancyindex
  • –user:nginx进程属于的用户
  • –group:nginx进程属于的用户组

编译安装

上面的configure配置没有问题,接下来就是编译和安装了,我图方便就一条命令来执行,新手可以把两条命令分开执行,先makemake install

1
make -j$(nproc) && make install -j$(nproc)

配置

因为上面配置参数指定缓存文件在/var/cache/nginx,日志文件在/var/log/nginx,所以需要创建

1
2
mkdir /var/cache/nginx
mkdir /var/log/nginx

测试运行

1
/usr/local/nginx/sbin/nginx

查看服务进程和端口

1
2
3
ps aux | grep nginx
lsof -i:80

配置_h5ai

H5AI,其实全称是:HTML5 Apache Index。最初是用来在Apache Web服务器上,完成资源映射,但是后来适配到Nginx等其他平台。配置很简单:下载_h5ai-修改Nginx配置文件-开始使用
注意_h5ai的映射逻辑:

1
2
3
4
网站根目录(需要映射的目录)
├─ _h5ai
├─ 你的其他文件1
└─ 你的其他文件1

下载_h5ai

因为是开源的工具,所以网上有很多修改版本,包含官方的:

  • 官方版本:官方的版本,功能全、稳定。
  • Dplayer版本:基于官方旧版本开发,支持更多格式的在线视频播放。
  • Mintimate’s _h5ai:基于Dplayer版本并合并官方最新版本代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
cd /home/orangepi
mkdir Downloads

cd Downloads
git clone https://github.com/Mintimate/h5ai_M

#将h5ai_M项目里的_h5ai移到Downloads目录下
cd h5ai_M
mv _h5ai ..

#因为是用root用户创建的,需要修改该文件夹的所属用户和组
cd /home/orangepi
chown -R orangpepi:orangepi Downloads

修改Nginx配置

备份原先的nginx配置文件

1
mv /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf.bak

新建一个配置文件

1
vim /usr/local/nginx/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
#所属用户
user orangepi;
worker_processes 1;
events {
worker_connections 1024;
}


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

sendfile on;

keepalive_timeout 65;

gzip on;

server {
listen 80;
server_name localhost;
#映射目录
root /home/orangepi/Downloads;


location / {
index index.html index.htm /_h5ai/public/index.php;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

#webdav配置
location ^~/webdav{
set $dest $http_destination;
if (-d \$request_filename) {
rewrite ^(.*[^/])$ $1/;
set $dest $dest/;
}
if ($request_method ~ MKCOL) {
rewrite ^(.*[^/])$ $1/ break;
}
# 映射目录
alias /home/pi/Downloads/;
autoindex on;
# Webdav设置
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
create_full_put_path on;
# 最大上传文件
client_max_body_size 3G;
dav_access user:rw group:rw all:rw;
auth_basic "Authorized Users Only";
# 验证用户
auth_basic_user_file webdavpasswd;
}

# php-fpm配置
location ~ [^/]\.php(/|$){
# try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}
}
}

使用

如果装了宝塔的,使用前记得开放对应端口,80端口和9000端口

直接用浏览器访问香橙派的IP,就可以访问_h5ai的映射目录

默认:

  • 用户名:admin
  • 密码:admin

然后进入这个地址:http://服务器的IP/_h5ai/public/index.php,这个界面是没有密码的,直接点击login

看到配置全绿就OK了

配置下载器

如果只配置了_h5ai,距离NAS基本算完成一大步了。但是,我认为还需要配置下载器,能把网上资源,直接下载到服务器才算是NAS。
这里我们使用Aria2作为下载器。

配置Aria2

一键脚本搭建:

AutoInstallAria2

因为一键安装脚本会在家目录下创建目录,所以切换到orangepi用户

1
2
su orangepi
wget "https://cdn.jsdelivr.net/gh/Mintimate/AutoInstallAria2@latest/AutoInstallAria2ForLinux.sh" && bash AutoInstallAria2ForLinux.sh

测试使用

这个时候,我们本地就可以使用Aria2的RPC进行下载了,首先Linux服务器上启动Aira2:

如果装了宝塔的,使用前记得开放对应端口,默认6800端口,可在配置中修改

1
2
cd ~
sudo ./aria2.sh

上面修改的Nginx配置,已经设置Webdav参数和目录,还设置了验证用户,所以还需要创建webdavpasswd这个验证文件。如果不需要验证,可以注释这一项,就可以使用本地的Webdav客户端访问了。

设置验证用户

1
2
3
4
cat << EOF > /usr/local/nginx/webdavpasswd
#设置登录用户名和密码
admin:$(openssl passwd 123)
EOF
  • admin是设置的用户名

  • 123是设置的密码

用户名密码可自行修改,之后重新加载配置文件和重启服务:

1
2
3
/usr/local/nginx/sbin/nginx -s reload
killall nginx
/usr/local/nginx/sbin/nginx

客户端登陆

macOS和Windows的文件管理器都可以登录,但是功能不全(无法上传),这里推荐:

以上软件,个人使用免费版本就可以了:

没用过mac,我用windows演示

image-20230607013014512

nginx默认80端口,如果80端口要跑其它服务,也可以修改nginx配置文件把80端口改成其它端口,路径要加/webdav,然后一定要取消勾选地址!!!

添加系统服务

还是可以参考我这篇文章部署LNMP教程

1
vim /usr/lib/systemd/system/nginx.service
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
1
sudo vim /usr/lib/systemd/system/php-fpm.service
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=php-fpm
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/php7/sbin/php-fpm
PrivateTmp=true

[Install]
WantedBy=multi-user.target
1
sudo vim /usr/lib/systemd/system/aria2.service
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Aria2
After=network.target

[Service]
User=pi
Type=simple
ExecStart=/etc/aria2/aria2c --conf-path=/etc/aria2/aria2.conf

[Install]
WantedBy=multi-user.target

建议还是给予执行权限:

1
2
3
chmod +x nginx.service
chmod +x php-fpm.service
chmod +x aria2.service

允许开机启动并激活:

1
2
3
systemctl enable nginx.service
systemctl enable php-fpm.service
systemctl enable aria2.service

连接Aria2进程

  • 使用AriaNG连接Aria2进程

AriaNG Native

个人推荐使用AriaNG Native连接服务器和本地的Aria2进程。

我们下载对应自己电脑版本的AriaNG Native:
之后,我们设置RPC:

设置的RPC要和在linux上aria2.conf配置文件中的RPC一致(rpc-secret:设置Aria2验证远程码)

设置RPC

刷新即可连接:
连接成功

搭建网页前端——AriaNg

这个一般是部署在服务器
项目地址(GitHub): https://github.com/mayswind/AriaNg/releases

浏览器的扩展程序

这是Chrome浏览器的扩展程序:

https://chrome.google.com/webstore/detail/aria2-explorer/mpkodccbngfoacfalldjimigbofkhgjn?utm_source=ext_app_menu

我图方便用的也是这种,用的火狐浏览器

image-20230607021439381

我下载的是第一个扩展

配置

打开管理扩展,点击选项

image-20230607021742222

点击RPC服务器后再点击默认服务器

image-20230607021835467

协议选http,填入服务器IP,密钥要和在linux上aria2.conf配置文件中的RPC一致,然后点保存

image-20230607022037734

使用

固定到工具栏

image-20230607022319769

点详情就可以使用了

image-20230607022411558

image-20230607022456123

连接到Aria2后就可以新建任务,把下载链接复制过去,就能把文件下载到Linux本地上了

介绍

我上一台手机是小米的mix2s,因为用了三年多了,也有一些毛病,存储也不太够,所以我就换手机了,我这台小米mix2s就成为了备用机,但用到的时候很少,我就想着能不能刷成linux,我找到了一篇文章:在骁龙(835 845 855等)设备通过UEFI运行Archlinux我要刷ubuntu,其实步骤差不多,只是rootfs用的是ubuntu,因为本人技术有限,没刷成,我就想着看有没有现成的,然后就找到两个适合我手机型号的开源系统,分别是

其中postmarketOS使用Alpine Linux,而Mobian使用Debian GNU/Linux作为其开发和运行环境。

postmarketOS上适配小米mix2s设备的是社区某个大佬移植,测试版,不是稳定版,功能很少,我用过postmarketOS,bug挺多的。

而mobian相比于postmarketOS,适配小米mix2s的功能更多,所以我使用了mobian。

在对应官网上查看支持的设备型号,看有没有支持自己型号的手机,在选择对应的系统,尽量选择稳定版(Main)的,测试版(Testing)的bug较多

除了这些支持的设备,可以在github上面找找,应该能找到非官方移植支持的其它设备,例如红米2刷Mobian体验原生Linux及软件安装问题处理[ 手机刷LINUX系列]为红米6 Pro移植mobian

Mobian简介

Mobian是一个社区驱动的项目,它基于Debian GNU / Linux操作系统设计,专为支持ARM架构而开发。作为一个非官方移植的操作系统,Mobian致力于在智能手机、平板电脑、单板计算机等设备上提供一种开放、自由和隐私保护的替代操作系统。

Mobian采用了GNOME桌面环境和Phosh用户界面,并集成了各种自由和开源应用程序,如Firefox浏览器、电话、信息、媒体播放器等。这样,用户可以方便地实现日常任务和消费需求。此外,Mobian还强调安全性和隐私性,为用户设备数据提供匿名性和私密性保障。通过添加各种安全控件和软件特性,Mobian确保用户在使用其操作系统时都有充分的保障和安全。

尽管Mobian是一个非官方移植,但已经获得了广泛的关注和支持。它由自愿参与的开发者和社区成员共同维护,不受任何公司或组织的控制。对于需要一个符合自己需求的操作系统的ARM设备用户来说,Mobian是一个令人兴奋的选择。

准备

刷镜像前要确保已经解了BL锁,解BL锁方法上网一搜随便都能找到,这里是我搜到一篇小米的:【玩机教程】小米手机详细官方解BL锁🔒教程

安装方法

mobian有支持我的设备,直接按官方方法刷入即可

下载镜像

SDM845

下载最新的版本,最新版本是debian12

安装adb-fastboot

首先电脑要安装adb-fastboot,这里我们下载windows版的

解压,进入解压的目录,打开platform-tools文件夹,可以看到有adbfastboot的exe文件,把整个platform-tools文件夹拖到你的任意盘里(建议弄个专门放工具的目录tools)

添加环境变量,这样我们就方便使用adbfastboot命令了,环境变量参数就是platform-tools文件夹的路径,例如E:\tools\platform-tools

刷入镜像

官方文档

我下载的目前最新的20230521包,是解压下载的tar.gz包,然后进入文件夹,在当前目录上面的路径显示框中输入cmd,然后回车即可。

如果不同型号也是骁龙845的,看官方文档来确定手机的代号,小米mix2s的代号是polaris

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#检查设备是否连接
fastboot devices

#刷入boot分区
fastboot flash boot mobian-sdm845-phosh-20230521.boot-polaris.img

#刷入system分区
fastboot flash system mobian-sdm845-phosh-20230521.boot.img

#刷入userdata分区
fastboot -S 100M flash userdata mobian-sdm845-phosh-20230521.rootfs.img

#清除缓存文件
fastboot erase dtbo

重启完就能使用mobian了

登录

默认用户:mobian

默认密码:1234

基础配置和使用

换源

1
sudo vim /etc/apt/sources.list
1
2
3
4
5
6
7
8
9
#中科大源
deb https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb-src https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb-src https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.ustc.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb-src https://mirrors.ustc.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware
deb-src https://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware

登录 root

1
sudo -i

下面的命令我都是用root用户进行,命令失败注意看权限

修改密码

1
passwd root
1
passwd mobian

更新源

1
apt update && apt upgrade -y

设置

设置firefox浏览器为中文

1
apt install firefox-esr-l10n-zh-cn -y 

安装基础工具

1
apt install cmake make wget curl git gcc g++ clang python3-pip openssh* lrzsz neofetch htop -y

允许root用户ssh远程登录

1
echo "PermitRootLogin yes " >> /etc/ssh/sshd_config | echo "PasswordAuthentication yes " >> /etc/ssh/sshd_config
1
systemctl restart sshd

安装docker

安装 apt 依赖包,用于通过 HTTPS 来获取仓库。

1
apt install apt-transport-https ca-certificates gnupg2 software-properties-common -y

添加 Docker 的官方 GPG 密钥:

1
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | apt-key add -

添加源

1
vim /etc/apt/sources.list.d/docker.list
1
2
3
#中科大源
deb [arch=arm64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian bookworm stable
#deb-src [arch=arm64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian bookworm stable
1
apt update

warning

会出现以下warning:

W: https://mirrors.ustc.edu.cn/docker-ce/linux/debian/dists/bookworm/InRelease: 密钥存储在过时的 trusted.gpg 密钥环中(/etc/apt/trusted.gpg),请参见 apt-key(8) 的 DEPRECATION 一节以了解详情。

解决warning

1
apt-key list

找到docker的公钥指纹,复制后八个字符0EBFCD88(不包括空格)

导入 /etc/apt/trusted.gpg.d 目录下专用文件中的 GPG 密钥:

这里是新创建了一个文件 docker.gpg

1
apt-key export 0EBFCD88 | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg

安装 Docker Engine-Community

1
apt install docker-ce docker-ce-cli containerd.io -y

配置镜像加速

1
vim /etc/docker/daemon.json

加入以下内容:

1
2
3
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
1
systemctl daemon-reload && systemctl restart docker

安装Zerotier-One

用脚本安装zerotier,脚本会将你的系统识别为buster,所以可以手动安装zerotier

1
vim /etc/apt/sources.list.d/zerotier.list

添加下面内容:

1
deb http://download.zerotier.com/debian/bookworm bookworm main
1
apt update
1
apt install zerotier-one -y

直接把mobian变为kali

安装Kali Linux的工具集

Kali Linux 2019.03开始对默认工具集进行重大更改,默认工具集将分为三个主要类别:

  • kali-linux-default,其中包含用于渗透测试的基本工具
  • kali-linux-large,具有更广泛的渗透测试工具集
  • kali-linux-everything,所有黑客工具

添加kali源

1
vim /etc/apt/sources.list.d/kali.list

添加以下内容:

1
2
3
#中科大源
deb https://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src https://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

添加kali公钥

1
curl -fsSL https://archive.kali.org/archive-key.asc | apt-key add - 
1
apt update

warning

会出现以下warning:

W: https://mirrors.ustc.edu.cn/kali/dists/kali-rolling/InRelease: 密钥存储在过时的 trusted.gpg 密钥环中(/etc/apt/trusted.gpg),请参见 apt-key(8) 的 DEPRECATION 一节以了解详情。

解决warning

1
apt-key list

找到kali的公钥指纹,复制后八个字符7D8D0BF6(不包括空格)

导入 /etc/apt/trusted.gpg.d 目录下专用文件中的 GPG 密钥:

这里是新创建了一个文件 kali-linux.gpg

1
apt-key export 7D8D0BF6 | gpg --dearmour -o /etc/apt/trusted.gpg.d/kali-linux.gpg
1
apt update

这样就可以安装一些kali的的工具集了

1
apt search kali-linux

例如安装kali-linux-default

1
apt install kali-linux-default -y

默认的工具集里面有些工具需要GUI,例如burpsuite,手机不好操作,所以我就没有安装了,只挑了几个工具安装

安装一些kali工具

1
apt install sqlmap nmap metasploit-framework set -y

前言

LNMP是一种常见的网站开发和运行环境,它由四个主要的软件组成:

  • Linux:操作系统,提供基础的运行平台
  • Nginx:高性能的Web服务器,负责处理HTTP请求和响应
  • MariaDB:开源的关系型数据库管理系统,负责存储和管理数据
  • PHP:脚本语言,负责处理业务逻辑和动态内容

在本教程中,我们将使用debian11作为操作系统,编译安装最新版本的nginx、mariadb和php,并且开启一些常用的和必要的模块。我们假设你已经有了一台安装了debian11的服务器,并且可以通过SSH远程登录。

步骤一:安装必要的依赖包

在开始编译安装之前,我们需要先安装一些必要的依赖包,这些包可以帮助我们编译、安装和运行LNMP的各个组件。我们可以使用apt命令来安装这些包,如下所示:

1
2
sudo apt update && apt upgrade -y
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev libxml2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libfreetype6-dev libmcrypt-dev libzip-dev libpam0g-dev libjudy-dev libsnappy-dev liblzma-dev bison libpmem-dev libbz2-dev -y

这里我们安装了以下几类包:

  • build-essential:包含了编译器、链接器等基本的开发工具
  • libpcre3、libpcre3-dev:提供了Perl兼容正则表达式的库,用于nginx的rewrite模块
  • zlib1g、zlib1g-dev:提供了压缩和解压缩的库,用于nginx的gzip模块
  • openssl、libssl-dev:提供了加密和解密的库,用于nginx的ssl模块
  • libxml2-dev、libcurl4-openssl-dev:提供了XML解析和HTTP客户端的库,用于php的curl、dom、simplexml等扩展
  • libjpeg-dev、libpng-dev、libfreetype6-dev:提供了图像处理的库,用于php的gd扩展
  • libmcrypt-dev:提供了加密算法的库,用于php的mcrypt扩展
  • libzip-dev:提供了ZIP文件处理的库,用于php的zip扩展

安装完成后,我们可以检查一下这些包是否正确安装:

1
dpkg -l | grep -E 'build-essential|libpcre3|zlib1g|openssl|libxml2|libcurl4|libjpeg|libpng|libfreetype6|libmcrypt|libzip'

如果没有报错,就说明这些包都已经成功安装。

要养成把源码包放到/usr/local/src目录下的好习惯

步骤二:下载并编译安装nginx

接下来,我们要下载并编译安装nginx。我们可以从官网下载最新版本的源码包:

1
2
3
wget https://nginx.org/download/nginx-1.24.0.tar.gz

cp nginx-1.24.0.tar.gz /usr/local/src

然后解压缩源码包:

1
tar zxvf nginx-1.24.0.tar.gz

进入源码目录:

1
cd nginx-1.24.0

执行configure命令来配置编译选项:

1
./configure --prefix=/usr/local/nginx --user=www-data --group=www-data --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre

这里我们指定了以下几个选项:

  • –prefix=/usr/local/nginx:指定了安装目录为/usr/local/nginx
  • –user=www-data –group=www-data:指定了运行nginx的用户和组为www-data(如果不存在,则会自动创建)
  • –with-http_ssl_module:开启了ssl模块,支持HTTPS协议
  • –with-http_gzip_static_module:开启了gzip_static模块,支持压缩静态文件
  • –with-http_stub_status_module:开启了stub_status模块,支持查看nginx状态信息
  • –with-pcre:使用pcre库支持rewrite模块

如果没有报错,就说明配置成功。然后执行make命令来编译源码:

  • 如果你服务器线程够多,可以在make 命令后面加个-j参数,编译会更快,安装也同理,如给四个线程 make -j4 ,或者直接最大线程 make -j$(nproc)
  • 如果make 或者make install 出现报错,则:
    1. 检查你的环境是否安装了需要的依赖包,比如编译工具、库文件等等。可以尝试使用 apt install package 安装相关依赖。
    2. 检查编译选项中是否有与当前系统不兼容的配置。可搜索相应错误信息来确认具体原因,然后酌情修改编译选项。
1
make -j$(nproc)

如果没有报错,就说明编译成功。最后执行make install命令来安装nginx:

1
sudo make install -j$(nproc)

如果没有报错,就说明安装成功。我们可以检查一下nginx是否正确安装:

1
sudo /usr/local/nginx/sbin/nginx -v

如果输出了nginx的版本信息,就说明nginx已经正确安装。我们可以查看一下nginx的配置文件:

1
sudo vim /usr/local/nginx/conf/nginx.conf

这里我们可以看到nginx的默认配置,包括监听端口、日志文件、虚拟主机等。我们可以根据自己的需要修改这些配置,或者添加新的配置。例如,我们可以开启gzip压缩功能,提高网站的性能:

1
2
3
4
5
6
7
8
9
http {
...
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain text/css text/javascript application/json application/javascript application/xml application/x-font-ttf image/svg+xml;
gzip_vary on;
...
}

保存并退出后,我们可以使用以下命令来测试配置文件是否正确:

1
sudo /usr/local/nginx/sbin/nginx -t

如果没有报错,就说明配置文件正确。然后我们可以使用以下命令来启动nginx:

1
sudo /usr/local/nginx/sbin/nginx

如果没有报错,就说明nginx已经启动。我们可以使用以下命令来查看nginx的进程:

1
ps aux | grep nginx

如果看到有一个master进程和几个worker进程,就说明nginx正常运行。我们也可以使用以下命令来查看nginx的状态信息:

1
curl http://localhost/nginx_status

如果看到类似以下的输出,就说明nginx状态信息正常:

1
2
3
4
Active connections: 1 
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 Waiting: 0

至此,我们已经完成了下载并编译安装nginx的步骤。

步骤三:下载并编译安装mariadb

安装前依赖解决

  • cmake

https://cmake.org/download/

  • boost

boost Boost库是一个可移植、提供源代码的C库,作为标准库的后备,是C标准化进程的开发引擎之 一

https://www.boost.org

1
2
#cmake命令 2.8 以上
cmake --version
1
2
3
4
5
6
7
wget https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.gz

cp boost_1_82_0.tar.gz /usr/local/src

tar -zxvf boost_1_82_0.tar.gz

mv boost_1_82_0 /usr/local/boost

接下来,我们要下载并编译安装mariadb。我们可以从官网下载最新版本的源码包:

1
2
wget https://mirrors.ustc.edu.cn/mariadb/mariadb-10.10.4/source/mariadb-10.10.4.tar.gz
cp mariadb-10.10.4.tar.gz /usr/local/src

然后解压缩源码包:

1
tar zxvf mariadb-10.10.4.tar.gz

进入源码目录:

1
cd mariadb-10.10.4

创建build目录,用来放编译后的缓存文件,然后进入build目录:

1
mkdir build && cd build

如果cmake 出错或者又需要添加别的库的支持,直接执行 rm -rf *命令,删除build当前目录下的所有编译文件

执行cmake命令来配置编译选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mariadb \
-DMYSQL_DATADIR=/usr/local/mariadb/data \
-DMYSQL_UNIX_ADDR=/usr/local/mariadb/mysql.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STPRAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWIYH_READLINE=1 \
-DWITH_LIBWRAP=0 \
-DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DMYSQL_TCP_PORT=3306 \
-DWITH_BOOST=/usr/local/boost -DBOOST_ROOT=/usr/local/boost \
-DMYSQL_USER=mysql \
-DWITHOUT_GSSAPI=ON

这里我们指定了以下几个选项:

  • -DCMAKE_INSTALL_PREFIX=/usr/local/mariadb:指定了安装目录为/usr/local/mariadb
  • -DMYSQL_DATADIR=/usr/local/mariadb/data:指定了数据文件的目录为/usr/local/mariadb/data
  • -DMYSQL_UNIX_ADDR=/usr/local/mariadb/mysql.sock:指定sock文件路径
  • -DWITH_INNOBASE_STORAGE_ENGINE=1:开启了InnoDB存储引擎支持,支持事务和外键等特性
  • -DWITH_ARCHIVE_STORAGE_ENGINE=1:开启了Archive存储引擎支持,支持高压缩比的存储
  • -DWITH_BLACKHOLE_STORAGE_ENGINE=1:开启了Blackhole存储引擎,支持不存储任何数据的存储
  • -DWITH_EMBEDDED_SERVER=1:开启嵌入式服务器支持,可以作为一个嵌入式服务器集成到其他程序中。生成一个libmysqld.a(.so)的库,这个库同时集成了mysql服务与客户端API
  • -DENABLED_LOCAL_INFILE=1:开启本地数据导入支持。
  • -DWITH_READLINE=1:使用readline库支持命令行编辑和历史记录功能
  • -DWITH_LIBWRAP=0:关闭libwrap库的支持,避免编译错误
  • -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci :安装所有字符集、默认字符集utf-8 、校验字符
  • -DWITH_SSL=system:使用系统自带的openssl库支持加密连接功能
  • -DWITH_ZLIB=system:使用系统自带的zlib库支持压缩功能
  • -DMYSQL_TCP_PORT=3306:指定了TCP端口号为3306
  • -DWITH_BOOST=/usr/local/boost -DBOOST_ROOT=/usr/local/boost :允许下载boost库文件
  • -DMYSQL_USER=mysql : 指定了运行mariadb的用户为mysql

以上参数需要和下文my.cnf同步(如果你需要修改我的编译参数,记得下文配置文件一并修改)

如果没有报错,就说明配置成功。然后执行make命令来编译源码:

1
make -j$(nproc)

如果没有报错,就说明编译成功。最后执行make install命令来安装mariadb:

1
sudo make install -j$(nproc)

如果没有报错,就说明安装成功。我们可以检查一下mariadb是否正确安装:

1
sudo /usr/local/mariadb/bin/mysql --version

如果输出了mariadb的版本信息,就说明mariadb已经正确安装。

编译并安装完成后,我们需要进行一些配置工作,以确保MariaDB能够正常运行。首先,我们需要创建一个mysql用户和组,并修改MariaDB目录的属主和属组:

1
2
3
sudo groupadd mysql
sudo useradd -r -g mysql mysql
sudo chown -R mysql:mysql /usr/local/mariadb

然后,我们需要复制初始化脚本到相应的位置,并设置相应的权限:

1
2
sudo cp /usr/local/mariadb/support-files/mysql.server /etc/init.d/mysqld
sudo chmod +x /etc/init.d/mysqld

查看MySQL/MariaDB将要从哪些配置文件中读取默认选项:

1
mysqld --help --verbose | grep "Default options are read" 

默认情况下会在以下位置读取:

1
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf $MARIADB_INSTALL_DIR/my.cnf

修改MariaDB配置文件,优化MariaDB

配置文件位于/etc/my.cnf ,没有则创建一个(直接用vim也会自动创建)

1
sudo vim /usr/local/mariadb/my.cnf

参考配置示例:

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
# Begin /etc/mysql/my.cnf
# The following options will be passed to all MySQL clients
[client]
port = 3306
socket = /tmp/mysql.sock

[mysqld]
user = mysql
port = 3306
socket = /tmp/mysql.sock
# MariaDB安装地址
basedir = /usr/local/mariadb/
datadir = /usr/local/mariadb/data/
pid-file = /usr/local/mariadb/mysqld.pid
log-error = /usr/local/mariadb/data/logs/mysqld.log

# 开启慢查询日志功能
slow_query_log = 1
slow_query_log_file = /usr/local/mariadb/data/logs/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1

#skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
sort_buffer_size = 512K
net_buffer_length = 16K
myisam_sort_buffer_size = 8M
skip-name-resolve = 0

# character set settings
character-set-server = utf8
collation-server = utf8_general_ci

# default storage engine
default-storage-engine = InnoDB

# innodb settings
innodb_buffer_pool_size = 32M
innodb_log_file_size = 48M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_thread_concurrency = 8
innodb_lock_wait_timeout = 50
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_force_recovery =1

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
# End /etc/my.cnf

保存并退出后,我们可以使用以下命令来初始化数据库:

1
sudo /usr/local/mariadb/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mariadb --datadir=/usr/local/mariadb/data

如果没有报错,就说明数据库初始化成功。然后我们可以使用以下命令来启动mariadb:

1
sudo /usr/local/mariadb/bin/mysqld_safe --user=mysql

如果没有报错,就说明mariadb已经启动。我们可以使用以下命令来查看mariadb的进程:

1
ps aux | grep mysqld

如果看到有一个mysqld_safe进程和一个mysqld进程,就说明mariadb正常运行。我们也可以使用以下命令来登录mariadb:

1
/usr/local/mariadb/bin/mysql -u root -p

如果看到类似以下的输出,就说明mariadb登录成功:

1
2
3
4
5
6
7
8
9
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.6.5-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

至此,我们已经完成了下载并编译安装mariadb的步骤。

步骤四:下载并编译安装php

接下来,我们要下载并编译安装php。我们可以从官网下载最新版本的源码包:

1
2
3
wget https://www.php.net/distributions/php-8.1.0.tar.gz

cp php-8.1.0.tar.gz /usr/local/src

然后解压缩源码包:

1
tar zxvf php-8.1.0.tar.gz

进入源码目录:

1
cd php-8.1.0

执行configure命令来配置编译选项:

1
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-mysqli=/usr/local/mariadb/bin/mysql_config --with-pdo-mysql=/usr/local/mariadb/bin/mysql_config --with-openssl --with-zlib --with-curl --with-gd --with-jpeg --with-png --with-freetype --enable-gd-jis-conv --with-zip --enable-mbstring

这里我们指定了以下几个选项:

  • –prefix=/usr/local/php:指定了安装目录为/usr/local/php
  • –with-config-file-path=/usr/local/php/etc:指定了配置文件的目录为/usr/local/php/etc
  • –enable-fpm:开启了fpm模式,支持与nginx配合使用
  • –with-fpm-user=www-data –with-fpm-group=www-data:指定了运行php-fpm的用户和组为www-data
  • –with-mysqli=/usr/local/mariadb/bin/mysql_config –with-pdo-mysql=/usr/local/mariadb/bin/mysql_config:开启了mysqli和pdo_mysql扩展,支持与mariadb交互
  • –with-openssl:开启了openssl扩展,支持加密功能
  • –with-zlib:开启了zlib扩展,支持压缩功能
  • –with-curl:开启了curl扩展,支持HTTP客户端功能
  • –with-gd:开启了gd扩展,支持图像处理功能
  • –with-jpeg –with-png –with-freetype:指定了gd扩展使用的图像库
  • –enable-gd-jis-conv:开启了gd扩展的日文转换功能
  • –with-zip:开启了zip扩展,支持ZIP文件处理功能
  • –enable-mbstring:开启了mbstring扩展,支持多字节字符串处理功能

如果没有报错,就说明配置成功。然后执行make命令来编译源码:

1
sudo make -j$(nproc)

如果没有报错,就说明编译成功。最后执行make install命令来安装php:

1
sudo make install -j$(nproc)

如果没有报错,就说明安装成功。我们可以检查一下php是否正确安装:

1
sudo /usr/local/php/bin/php -v

如果输出了php的版本信息,就说明php已经正确安装。我们可以查看一下php的配置文件:

1
sudo vim /usr/local/php/etc/php.ini

这里我们可以看到php的默认配置,包括错误报告、内存限制、文件上传、时区等。我们可以根据自己的需要修改这些配置,或者添加新的配置。例如,我们可以开启错误显示功能,方便调试:

1
2
3
4
[PHP]
...
display_errors = On
...

保存并退出后,我们可以使用以下命令来复制php-fpm的配置文件:

1
2
sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

然后我们可以使用以下命令来启动php-fpm

1
sudo /usr/local/php/sbin/php-fpm

如果没有报错,就说明php-fpm已经启动。我们可以使用以下命令来查看php-fpm的进程:

1
ps aux | grep php-fpm

如果看到有一个master进程和几个worker进程,就说明php-fpm正常运行。我们也可以使用以下命令来测试php是否能够处理请求:

1
curl http://localhost/index.php

如果看到类似以下的输出,就说明php能够处理请求:

1
Hello, world!

至此,我们已经完成了下载并编译安装php的步骤。

步骤五:配置nginx和php-fpm的通信

最后,我们要配置nginx和php-fpm的通信,让nginx能够将PHP请求转发给php-fpm处理,并将结果返回给客户端。我们可以使用以下命令来编辑nginx的虚拟主机配置文件:

1
sudo vim /usr/local/nginx/conf/vhost/default.conf

这里我们可以添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name localhost;
root /usr/local/nginx/html;
index index.html index.php;

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

这里我们指定了以下几个参数:

  • listen 80:指定了监听端口为80
  • server_name localhost:指定了服务器名称为localhost
  • root /usr/local/nginx/html:指定了网站根目录为/usr/local/nginx/html
  • index index.html index.php:指定了默认首页为index.html或index.php
  • location ~ .php$:匹配所有以.php结尾的请求
  • fastcgi_pass 127.0.0.1:9000:指定了将请求转发给本地9000端口的php-fpm进程
  • fastcgi_index index.php:指定了默认PHP文件为index.php
  • fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name:指定了PHP脚本文件的完整路径
  • include fastcgi_params:包含了一些通用的fastcgi参数

保存并退出后,我们可以使用以下命令来测试配置文件是否正确:

1
sudo /usr/local/nginx/sbin/nginx -t

如果没有报错,就说明配置文件正确。然后我们可以使用以下命令来重载nginx:

1
sudo /usr/local/nginx/sbin/nginx -s reload

如果没有报错,就说明nginx已经重载。我们可以使用以下命令来测试nginx是否能够处理PHP请求:

1
curl http://localhost/index.php

如果看到类似以下的输出,就说明nginx能够处理PHP请求:

1
Hello, world!

至此,我们已经完成了配置nginx和php-fpm的通信的步骤。

步骤六:把所有的服务能通过systemctl来管理启动

为了方便管理和控制我们的LNMP服务,我们可以把它们都注册为systemd的服务单元,这样我们就可以使用systemctl命令来启动、停止、重启、查看状态等操作。我们可以使用以下命令来创建服务单元文件:

创建nginx.service文件

1
sudo vim /lib/systemd/system/nginx.service

然后添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

创建mariadb.service文件

1
sudo vim /lib/systemd/system/mariadb.service

然后添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# mariadb.service
[Unit]
Description=MariaDB database server
Documentation=https://mariadb.com/kb/en/
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/mariadb/mariadb.pid
ExecStart=/usr/local/mariadb/bin/mysqld_safe --user=mysql --basedir=/usr/local/mariadb --datadir=/usr/local/mariadb/data
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

创建php-fpm.service文件

1
sudo vim /lib/systemd/system/php-fpm.service

然后添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# php-fpm.service
[Unit]
Description=PHP FastCGI Process Manager
Documentation=https://www.php.net/manual/en/install.fpm.php
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

这里我们指定了以下几个参数:

  • Description:服务的描述信息
  • Documentation:服务的文档链接
  • After:服务的启动顺序,表示在哪些服务之后启动
  • Wants:服务的启动依赖,表示需要哪些服务同时启动
  • Type:服务的类型,表示如何启动和停止服务,这里我们使用forking类型,表示服务会创建子进程并返回主进程的PID
  • PIDFile:服务的PID文件位置,用于记录主进程的PID,方便管理和控制服务
  • ExecStart:服务的启动命令,用于执行服务的主程序或脚本,可以指定一些参数或选项
  • ExecStartPre:服务的启动前置命令,用于执行一些准备工作,例如检查配置文件等
  • ExecReload:服务的重载命令,用于重新加载配置文件或刷新缓存等,不会中断服务的运行
  • ExecStop:服务的停止命令,用于终止服务的运行,通常是发送一个信号给主进程
  • PrivateTmp:服务的私有临时目录选项,表示是否为每个服务创建一个独立的/tmp目录,避免文件冲突或泄露等问题
  • WantedBy:服务的安装目标,表示在哪些运行级别下启用该服务,这里我们使用multi-user.target,表示在多用户模式下启用该服务

保存并退出后,我们可以使用以下命令来重新加载systemd:

1
sudo systemctl daemon-reload

然后给添加的服务给予执行权限:

1
2
3
chmod a+x /lib/systemd/system/nginx.service
chmod a+x /lib/systemd/system/mariadb.service
chmod a+x /lib/systemd/system/php-fpm.service

如果没有报错,就说明systemd已经重新加载。然后我们可以使用以下命令来启动、停止、重启、查看状态等操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo systemctl start nginx # 启动nginx服务
sudo systemctl stop nginx # 停止nginx服务
sudo systemctl restart nginx # 重启nginx服务
sudo systemctl reload nginx # 重载nginx服务
sudo systemctl status nginx # 查看nginx服务状态

sudo systemctl start mariadb # 启动mariadb服务
sudo systemctl stop mariadb # 停止mariadb服务
sudo systemctl restart mariadb # 重启mariadb服务
sudo systemctl status mariadb # 查看mariadb服务状态

sudo systemctl start php-fpm # 启动php-fpm服务
sudo systemctl stop php-fpm # 停止php-fpm服务
sudo systemctl restart php-fpm # 重启php-fpm服务
sudo systemctl reload php-fpm # 重载php-fpm服务
sudo systemctl status php-fpm # 查看php-fpm服务状态

如果没有报错,就说明systemctl能够正常管理和控制我们的LNMP服务。我们也可以使用以下命令来设置LNMP服务为开机自启动:

1
2
3
sudo systemctl enable nginx # 设置nginx服务为开机自启动
sudo systemctl enable mariadb # 设置mariadb服务为开机自启动
sudo systemctl enable php-fpm # 设置php-fpm服务为开机自启动

如果没有报错,就说明LNMP服务已经设置为开机自启动。我们可以使用以下命令来查看LNMP服务的开机自启动状态:

1
2
3
sudo systemctl is-enabled nginx # 查看nginx服务是否开机自启动
sudo systemctl is-enabled mariadb # 查看mariadb服务是否开机自启动
sudo systemctl is-enabled php-fpm # 查看php-fpm服务是否开机自启动

如果输出了enabled,就说明LNMP服务已经开机自启动。

至此,我们已经完成了把所有的服务能通过systemctl来管理启动的步骤。

结语

恭喜你,你已经成功地用debian11来部署了LNMP(nginx+mariadb+php)环境,并且把它们都注册为systemd的服务单元,方便管理和控制。你现在可以使用这个环境来开发和运行你的网站项目了。希望这个教程文档对你有帮助,如果你有任何问题或者建议,可以随时跟我说哦。谢谢你的阅读和支持。😘

Linux crontab 命令

Linux crontab 是用来定期执行程序的命令。

当安装完成操作系统之后,默认便会启动此任务调度命令。

crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。

而 linux 任务调度的工作主要分为以下两类:

  • 1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
  • 2、个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

/etc/crontab文件中可以看到所有用户的crontab任务,我自己实测直接修改/etc/crontab来添加crontab任务没有生效(可能是权限问题,我没深究),所以没有修改该文件来创建crontab任务

/etc/cron.deny #该文件中所列的用户不允许使用Crontab命令

/etc/cron.allow #该文件中所列的用户允许使用Crontab命令

crontab命令格式详解

每项工作 (每行) 的格式都是具有六个栏位,这六个栏位的意义为:

代表意义 分钟 小时 日期(天) 月份 命令
数字范围 0-59 0-23 1-31 1-12 0-7 呀就命令啊
1
crontab -u {username} -e  #不加-u参数默认为当前用户创建定时任务

输入命令后会显示编辑一个文件,直接在下面添加参数,username可以不加,则默认给当前用户添加定时任务

1
2
3
4
5
6
7
8
*    *    *    *    * {username} 命令/要执行shell脚本的路径
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

修改定时任务crontab -e的时候,控制台输出“crontab: installing new crontab”,表示任务添加成功,且之后三分钟不会执行对应的任务,所以在调试定时器的时候,要把这三分钟考虑进去,如果执行的时间在三分钟内的话,对应的任务则不会生效。

定时执行命令

例如安装的Tomcat服务器需要每次开机后都要重启一次

1
2
3
4
5
#在crontab -e命令后添加的参数

#系统重启后执行重启
@reboot systemctl restart tomcat
# @reboot [nohup] systemctl restart tomcat

nohup 是用来让运行的程序忽略 SIGHUP 指令(因为在父程序退出后,所有的子程序会受到 SIGHUP 指令)从而保证运行的程序不退出, 根据实际情况决定是否使用该参数(本人实际操作过程中,加入该参数时无法成功执行任务,请自测)
@reboot 只针对可登录服务器的用户生效, 如果使用不可登录服务器的用户执行该类型crontab任务,将会遭到忽略,执行失败

定时关机

1
2
3
4
#每天 23:00 关机
* 23 * * * root /sbin/shutdown -h now
#每天 23:00 十分钟后关机
* 23 * * * root /sbin/shutdown -h at 23:10

因为直接crontab来执行命令,可能有些命令太复杂或者太长可能会执行失败,这时候就会用到shell脚本

定时执行shell脚本

执行时间 格式
每分钟定时执行一次 * * * * *
每小时定时执行一次 0 * * * *
每天定时执行一次 0 0 * * *
每周定时执行一次 0 0 * * 0
每月定时执行一次 0 0 1 * *
每月最后一天定时执行一次 0 0 L * *
每年定时执行一次 0 0 1 1 *
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
#在crontab -e命令后添加的参数


#每天 02:00 执行任务
0 2 * * * /bin/sh backup.sh

#每天 5:00和17:00执行任务
0 5,17 * * * /scripts/script.sh

#每分钟执行一次任务
* * * * * /scripts/script.sh

#每周日 17:00 执行任务
0 17 * * 7 /scripts/script.sh

#每 10min 执行一次任务
*/10 * * * * /scripts/monitor.sh

#在每周五、周日的17点执行任务
0 17 * * sun,fri /script/scripy.sh

#每四个小时执行一个任务
0 */4 * * * /scripts/script.sh

#每周一、周日的4:00和17:00执行任务
0 4,17 * * sun,mon /scripts/script.sh

比较有趣的是那个『周』喔!周的数字为0或7时,都代表『星期天』的意思!另外, 还有一些辅助的字符,大概有底下这些:

特殊字符 代表意义
*(星号) 代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表著『不论何月、何日的礼拜几的 12:00 都运行后续命令』的意思!
,(逗号) 代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是: 0 3,6 * * * command 时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!
-(减号) 代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作: 20 8-12 * * * command 仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!
/n(斜线) 那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则: */5 * * * * command 很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

周与日月不可同时并存

另一个需要注意的地方在於:『你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作』。 这个意思是说,你不可以这样编写一个工作排程:

1
30 12 11 9 5 root echo "just test"  <==这是错误的写法

本来你以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 9 月 11 号分别进行,如此一来与你当初的规划就不一样了~所以罗,得要注意这个地方!上述的写法是不对的!

使crontab任务生效

1
2
3
4
5
#查看crontab任务
crontab -l

#加载配置文件
/etc/init.d/cron reload

centos的定时任务service是crond

脚本无法执行问题

如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。

解决方法:

  • 1、所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。

  • 2、在 shell 脚本开头使用以下代码:

    1
    2
    3
    4
    #!/bin/bash

    . /etc/profile
    . ~/.bashrc
  • 3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:

    1
    20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh

介绍

如何用docker部署openwrt(本人一般用于挂代理)

下载镜像

打开dockerhub

无账号的可以注册一个

image-20230508004922422

点击第二个,复制右边的命令,回到操作系统里粘贴

image-20230509195820116

找到适合自己架构拉取镜像即可,我的是aarch64,所以拉取tag为armv8的

1
docker pull sulinggg/openwrt:armv8

查看镜像

1
docker images

打开网卡混杂模式

1
sudo ip link set eth0 promisc on 

创建网络

1
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.254 -o parent=eth0 macnet

须结合实际网络情况,不能照抄命令

–subnet=192.168.1.0/24 #eth0网卡正所处在192.168.1.x网段

–gateway=192.168.1.254 #eth0网卡的网关(即路由器ip)

parent=eth0 #这个是物理网卡名字

macvlan #这是创建的一个驱动程序管理网络(已经创建了192.168.254这个网络段给它)

macnet #macnet创建的网络名字

查看创建的macnet网络

1
docker network ls

创建并启动容器

1
docker run --restart always --name openwrt -d --network macnet --privileged sulinggg/openwrt:armv8 /sbin/init

进入容器并修改相关参数

1
docker exec -it openwrt bash

执行此命令后我们便进入 OpenWrt 的命令行界面,首先,我们需要编辑 OpenWrt 的网络配置文件:

1
vim /etc/config/network

我们需要更改 Lan 口设置:

1
2
3
4
5
6
7
8
9
10
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.1.100' #自己设置一个ip,这个ip是你即将要访问的openwrt控制面板,假如本机IP也处于192.168.1.0/24网段,设置的IP不要和本机IP重合
option gateway '192.168.1.254' #设置网关
option broadcast '192.168.1.255'
option dns '8.8.8.8'

所有的 192.168.1.x 需要根据eth0网卡所处网段修改,option gateway填写eth0的网关。

option ipaddr 项目定义了 OpenWrt 的 IP 地址,在完成网段设置后,IP最后一段可根据自己的爱好修改(前提是符合规则且不和现有已分配 IP 冲突)。

重启网络

1
/etc/init.d/network restart

输入完成这段命令之后,按住键盘的ctrl+p+q就能退出openwrt容器的命令行界面。

管理页面

进入控制面板

在浏览器中输入option ipaddr 项目中的 IP 进入 Luci 控制面板,若option ipaddr 的参数为 192.168.1.100,则可以在浏览器输入 http://192.168.1.100进入控制面板。

用户名:root

密码:password

image-20230509200127717

登进去后建议修改账号密码,不然别人直接不用密码能ssh连接你这个容器

简介

zerotier one是众多内网穿透工具平衡性最好的。方便速度快部署简单的比他贵的多,速度比他快比他便宜的部署麻烦,比他便宜部署容易的使用体验又不好。

不过zerotier one的虚拟网络是由官方控制器控制的,虚拟内网被别人控制总感觉不会不舒服。好在zerotier是开源的,因此zerotier有脱离官方控制器的第三方控制器

ztncui是zerotier one众多开源第三方控制器中的一个,之所以选它是因为它是唯一一个拥有图形界面的。通过配置客户端的planet就可以跳过官方节点,使用ztncui完成各个节点之间的通讯和打洞。

优点

  • 官方的节点通道(Planet服务器)是在国外,一般延迟都在四五百ms左右,使用ztncui搭建的zerotier one不走官方节点的通道,走的是用自己公网服务器搭建的节点通道,延迟较低
  • 官方编译的Zerotier搭建的moon服务器不能在Android设备上使用,而私有化搭建的moon服务器则能在Android端(需要配合Zerotier FIX来)使用
  • 相比于用FRP部署的内网穿透,zerotier使用简单,且不像FRP让服务器在公网被来回扫,安全性较高。

FRP部署内网穿透—->可看这篇文章《自建内网穿透服务器》

准备工作

Zerotier不支持以域名方式和控制器通讯,所以你需要准备一个具有固定公网ip的云服务器,最好同时具备固定ipv6。

对于android设备,需要使用kaaass大神的Zerotier FIX才可以使用自定义控制器和自定义moon服务器,IOS设备无解。

Zerotier FIX项目地址

云服务器

我这里用的阿里云领的7个月ECS,系统是debian11,,带宽是1Mbps(到后面用搭建的moon,Android端用数据延迟能到一百左右,理论上带宽比我这个大的延迟会更低),没有申请SSL证书

Debian默认ssh不能root连接,首先在你买服务器的官网的控制台用他们自带的远程连接先连进去,编辑ssh配置文件vim /etc/ssh/sshd_config 添加一个参数:PermitRootLogin yes,这样ssh就能用root连接了

1
2
3
vim /etc/ssh/sshd_config
echo "PermitRootLogin yes " >> /etc/ssh/sshd_config
echo "PasswordAuthentication yes " >> /etc/ssh/sshd_config

配置安全组(无SSL证书)

image-20230505000328395

配置安全组(有SSL证书)

image-20230505000753998

3000端口和3443端口为ztncui Web控制面板使用的端口

3000是http的,3443是https的

TCP:9993端口为Zerotier节点与控制器通讯的端口

UDP:9993端口为MOON节点与控制器通讯的中继端口

端口可自行选择,根据自己选择的端口配置安全组

Server端

Zerotier安装

1
2
#ztncui依赖于zerotier,所以需要先安装zerotier
root@Debian:~# curl -s https://install.zerotier.com | sudo bash

ztncui安装

centos redhat系列下载, root权限执行

1
root@centos:~# wget https://gitee.com/opopop880/zerotier_planet/raw/master/zertotier_planet.sh && chmod +x zertotier_planet.sh && ./zertotier_planet.sh

debain ubuntu 系列下载 root权限执行

1
root@Debian:~# wget https://gitee.com/opopop880/zerotier_planet/raw/master/zerotier_planet_debain.sh && chmod +x zerotier_planet_debain.sh && ./zerotier_planet_debain.sh

我执行完 ./zerotier_planet_debain.sh这个脚本后,编译安装时会失败,缺少依赖库”fatal error: nlohmann/json.hpp : No such file or directory”
#include “nlohmann/json.hpp

安装依赖

1
root@Debian:~# apt-get install nlohmann-json3-dev

在执行一次脚本

1
root@Debian:~# ./zerotier_planet_debain.sh

配置moon服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#进入zerotier one文件夹
root@Debian:~# cd /var/lib/zerotier-one

#生成moon.json文件
root@Debian:/var/lib/zerotier-one# zerotier-idtool initmoon identity.public >> moon.json

#编辑moon.json文件
root@Debian:/var/lib/zerotier-one# vim moon.json
#修改里面的stableEndpoints参数,修改完后保存退出
"stableEndpoints": ["你的公网IP/9993" ]

#生成客户端用的moon配置文件
root@Debian:/var/lib/zerotier-one# zerotier-idtool genmoon moon.json
wrote 00000016089ddab3.moon (signed world with timestamp 1683210080062)

#在/var/lib/zerotier-one目录下,手动新建一个moons.d文件夹,并把刚生成的moon配置文件放到该文件夹下
root@Debian:/var/lib/zerotier-one# mkdir moons.d && mv 00000016089ddab3.moon moons.d/

#刚刚是在/root的目录下安装的ztncui,把moon.json文件拷贝到/root目录下,这个文件在配置ztncui时有用
root@Debian:/var/lib/zerotier-one# cp moon.json /root

配置ztncui

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#查看ZT_TOKEN值并复制
root@Debian:~# cat /var/lib/zerotier-one/authtoken.secret

#检查ztncui的配置文件,看到ZT_TOKEN=的值是否和上面的一样,不一样则替换成上面复制的值(一般都一样)
root@Debian:~# vim /opt/key-networks/ztncui/.env

#下载mkmoonworld主程序(自己解决github代理)
root@Debian:~# wget https://github.com/kaaass/ZeroTierOne/releases/download/mkmoonworld-1.0/mkmoonworld-x86

#赋予执行权限
root@Debian:~# ls
root@Debian:~# chmod 777 mkmoonworld-x86

# 生成planet文件(即world.bin文件)
root@Debian:~# ./mkmoonworld-x86 ./moon.json

# 若要设置多个planet节点,将其他节点的moon.json 写入到另外的文件,如 moon1.json moon2.json
root@Debian:~# ./mkmoonworld-x86 ./moon1.json ./moon2.json

!!!注意!!!,要配置Android端的Zerotier,需要用到world.bin文件,所以要先备份一份,一起把world.bin文件和000000XXXXX.moon打包文件发到桌面

1
2
# 令planet文件生效
root@Debian:~# mv world.bin planet && systemctl restart zerotier-one

重启完zerotier-one服务moon服务器就已经生效了

备份moon文件

将生成的000000XXXXX.moon文件打包,留着准备发给各个zerotier one客户端

这里我用windows上的xshell连的服务器,上传和下载文件可能比较麻烦,用finalshell和filezilla传文件方便(我有,但不习惯用,还是习惯用xshell)

1
2
3
4
5
6
7
8
root@Debian:~# apt install lrzsz -y

root@Debian:~# cd /var/lib/zerotier-one

root@Debian:/var/lib/zerotier-one# tar -zcvf moons.d.tat.gz moons.d/

root@Debian:/var/lib/zerotier-one# sz moons.d.tar.gz
#然后选择桌面(弹出来的框路径随便你选)

ztncui管理界面配置

访问http://你的公网IP:3000

登录用户名:admin

默认密码: password

添加网络

image-20230505011824909

配置网络

image-20230505012139481

image-20230505012503870

Client端

Linux的client端

同样安装Zerotier

1
root@orangepi5:~# curl -s https://install.zerotier.com | sudo bash

将打包好的moon服务器放进Zerotier目录下

1
2
3
4
5
6
root@orangepi5:~# cd /var/lib/zerotier-one

#选择之前下载到桌面的moons.d.tat.gz
root@orangepi5:/var/lib/zerotier-one# rz

root@orangepi5:/var/lib/zerotier-one# tar -xf moons.d.tat.gz && rm -rf moons.d.tat.gz

配置完moon服务器后重启Zerotier

1
root@orangepi5:~# systemctl restart zerotier-one

加入网络

1
2
3
4
5
#加入在ztncui上的网络
root@orangepi5:~# zerotier-cli join #Network ID

#离开网络的命令是
zerotier-cli leave #Network ID

在ztncui管理界面允许加入

image-20230505015057633

列出网络

1
root@orangepi5:~# zerotier-cli listnetworks

查看moon服务器

1
root@orangepi5:~# zerotier-cli listpeers

列出的moon节点出现自己配置的公网IP则moon服务器已配置成功

Android的client端

先安装Zerotier FIX,然后打开Zerotier FIX,点+号先加入Network ID

将服务器上的world.bin和000000XXXXX.moon文件下载到本地,将world.bin更名为palnet。然后上传到手机

第一步,安装好Zerotier FIX,打开软件——右上角——设置——启动自定义planet——选择从文件导入——选择刚才的palnet文件。提示导入成功既切换planet成功。

第二步,加入moon服务器,打开软件——右上角——入轨——右下角加号——从文件导入——选择刚才的moon文件。提示成功,会在入轨界面看到moon服务的id。

image-20230505015941496

只有完成上面这两步,才能在ztncui管理的网络界面点刷新看到手机的ID,然后在ztncui上授权加入

Windows的client端

ZeroTier官网下载windows的ZeroTier One客户端

下载的zerotier是msi文件,默认会安装到C盘,安装完后会自动运行,在任务栏里会看到zerotier的UI界面,可以把它关掉退出

安装完后在我的电脑打开C盘,点击查看,把隐藏的项目打勾

image-20230520200642469

打开路径C:\ProgramData\ZeroTier\One,直接把之前备份的moons.d整个目录复制一份进去(目录里面有个000000XXXXX.moon文件)

在任务栏的搜索框输入cmd,会搜索到命令提示符,鼠标右键以管理员身份运行

弹出的命令框输入下面的命令进入ZeroTier的目录

1
CD C:\ProgramData\ZeroTier\One\

查看命令帮助

1
zerotier-one_x64.exe -h

可以看到加了-q参数就可以跟linux端一样操作了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ZeroTier One version 1.10.6
Copyright (c) 2020 ZeroTier, Inc.
Licensed under the ZeroTier BSL 1.1 (see LICENSE.txt)
Usage: zerotier-one_x64.exe [-switches] [home directory]

Available switches:
-h - Display this help
-v - Show version
-U - Skip privilege check and do not attempt to drop privileges
-p<port> - Port for UDP and TCP/HTTP (default: 9993, 0 for random)
-C - Run from command line instead of as service (Windows)
-I - Install Windows service (Windows)
-R - Uninstall Windows service (Windows)
-D - Remove all instances of Windows tap device (Windows)
-i - Generate and manage identities (zerotier-idtool)
-q - Query API (zerotier-cli)

加入网络

1
2
#加入在ztncui上的网络
zerotier-one_x64.exe -q join #Network ID

列出网络

1
zerotier-one_x64.exe -q listnetworks

重启 ZeroTier

按“WIN+R”键,打开运行窗口;2 输入”services.msc”,回车,运行的服务中找到ZeroTier one,选中点击右键,选择重新启动。

查看moon服务器

1
zerotier-one_x64.exe -q listpeers

列出的moon节点出现自己配置的公网IP则moon服务器已配置成功

安全问题

进入ztncui控制面板需要通过访问公网服务器的3000端口来管理网络,所以要一直开着公网服务器的3000端口,很不安全,我们可以把节点控制器也加入到网络中,加入后就可以通过zerotier分配的IP来访问ztncui控制面板。

加入方法和linux client端加入网络类似

ssh连接到公网服务器

加入网络

1
2
#加入在ztncui上创建网络的ID
root@orangepi5:~# zerotier-cli join #Network ID

授权加入网络

image-20230520204946512

授权后点刷新,网络就会给控制器分配IP了

这样配置完成后我们就可以在其它授权设备上访问http://控制器IP:3000来登录控制面板了,访问成功后就可以去公网服务器的安全组把放行的3000端口关掉了

0%