攻击者向局域网特定网络设备持续的发送ARP欺骗数据包,对该网络设备进行网关欺骗,使其认为网关为攻击者设备,如果攻击者不对被攻击者的网络请求进行处理的话,会造成被攻击者断网。
inet为一个列表,存储发起ARP攻击要使用的网卡,分别存储网卡名称和网卡MAC地址,net为当前选中网卡序号。
host为一个备注字典表,键,值分别对应MAC地址和备注。
1 | from scapy.all import * |
1 |
|
N2N是一款开源的P2P软件,可以用来构建虚拟局域网,也就是说,每个N2N虚拟网络內的用户都可以通过N2N网络访问其他用户主机,即相互ping通。
Supernode 超级节点:它在Edge节点间建立握手,或为Edge节点中转数据。能够直通的节点间通讯是P2P的,则由超级节点注册网络路径,超级节点一旦帮助双方完成首次握手,剩余的数据流就会在两个Edge节点间传送,而无需超级节点介入。如果有一方Edge节点的NAT属于对称型(symmetrical),超级节点还需继续为双方提供数据转发服务。
Edge 节点:用户主机上用以与建立N2N网络的软件。几乎每个Edge节点都需建立一个tun/tap虚拟网卡设备,作为接入N2N网络的入口。
地址
由于v2s版本直连概率比较高,所以本文只介绍v2s版本。同时服务端使用 ubuntu,客户端使用 windows。
安装方法
先从服务端开始,在ubuntu上从github下载源码进行编译安装,由此获得两个可执行文件,supernode和edge。1
2
3
4
5
6
7git clone https://github.com/meyerd/n2n
cd n2n/n2n_v2
mkdir build
cd build
cmake ..
make
make install
然后服务端运行supernode,服务端防火墙记得开放UDP监听端口,这里假设UDP监听端口为1234。1
supernode -l 1234
接下来创建DHCP服务器。1
2
3
4
5
6
7
8
9
10
11
12
13
14sudo apt-get install isc-dhcp-server
```bash
配置 `/etc/dhcp/dhcpd.conf`,写入以下内容,也可以找到相应位置,取消注释,然后修改内容.
```bash
ddns-update-style interim;
ignore client-updates;
default-lease-time 604800;
max-lease-time 1209600;
subnet 10.0.0.0 netmask 255.255.255.0 {
option subnet-mask 255.255.255.0;
range dynamic-bootp 10.0.0.10 10.0.0.100;
}
编辑/etc/default/isc-dhcp-server
,添加一行。假设虚拟网卡名为tun0。1
INTERFACES="tun0"
然后启动DHCP服务,可以使用dhclient tun0
测试是否从DHCP服务器获取到IP。1
service isc-dhcp-server start
接下来配置服务端Edge节点,创建DHCP服务器用得着,否则也可以不用配置。
假设设定的n2n网络IP为10.0.0.1,如果需要可以加上-k 自定义加密key值
。1
edge -d tun0 -a 10.0.0.1 -l 127.0.0.1:1234
上面步骤会创建名为tun0的虚拟网卡,如果创建失败,可以按照下面方法手动创建。1
2sudo apt-get install uml-utilities
tunctl -t tun0
这样,其他Edge节点启动后就可以由10.0.0.1分配IP地址。
windows客户端直接下载编译好的EXE文件,或是自行从github仓库下载源码编译。
同时,windows需先安装tap-window虚拟网卡软件。
然后在命令行(管理员模式)运行,注意中文路径及特殊符号路径。
以下为DHCP获取IP地址的指令。(不知道为什么,我每次DHCP启动或关闭都会断网一瞬间)1
edge -r -a dhcp:10.0.0.1 -l 服务端IP:1234
以下为以指定IP(10.0.0.2)启动,各个Edge节点指定IP启动的IP需各不相同。1
edge -a 10.0.0.2 -l 服务端IP:1234
1 | import os |
C++编写的Clocl GUI
1 |
|
DOMjudge
自带的添加队伍的不是很方便,所以还是自己写个python脚本生成 csv
导入数据库,配合 phpmyadmin
使用。$Vesion1.0$ 个人赛账号生成脚本
1 | def import_team(team_id, Users): |
C++课程设计作业,包含人工智障$AI$
1 |
|
模组: RaspberryJamMod
Python库: mcpi
游戏版本: 1.8 ~ 1.12.2
1 | from mcpi import minecraft, block |
效果如下:
1 | from concurrent.futures import ThreadPoolExecutor |
1 | from turtle import * |
面重点来了,字不重要,看图!!!
Version1.0使用文件操作不断将随机测试数据写入code/0.in,通过管道输入到两个可执行文件,然后获取输出进行比较,直到找到不同的输出时停止,此时0.in内的内容即为结果。
1 | import os |
Python作业,用turtle绘制校庆宣传画。
1 | import turtle |
效果如下:
端口映射就是将外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。端口映射有动态和静态之分。
通俗来讲,端口映射是将一台主机的内网(LAN)IP地址映射成一个公网(WAN)IP地址,当用户访问提供映射端口主机的某个端口时,服务器将请求转移到本地局域网内部提供这种特定服务的主机;利用端口映射功能还可以将一台外网IP地址机器的多个端口映射到内网不同机器上的不同端口。 端口映射功能还可以完成一些特定代理功能,比如代理POP,SMTP,TELNET等协议。理论上可以提供65535(总端口数)-1024(保留端口数)=64511个端口的映射。
内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端口,能让外网的电脑找到处于内网的电脑,提高下载速度。不管是内网穿透还是其他类型的网络穿透,都是网络穿透的统一方法来研究和解决。
假如你有一个有公网IP的服务器,并且网速不是太差的话,frp就是一个不错的选择,当然如果没有的话,可以用后面的方法。
frp项目地址:https://github.com/fatedier/frp
进入realses界面下载需要的版本,下载完成后分别解压到服务器和客户端上。
这里以linux(服务器),windows(客户端)为例。
下载并解压文件。1
2
3
4wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
tar xzvf frp_0.29.0_linux_amd64.tar.gz
# 可以给文件夹改个短点的名字
mv frp_0.29.0_linux_amd64 frp
配置服务端frp配置文件。1
2cd frp
vim frps.ini
按 $I$ 键进入插入模式,输入以下内容。1
2
3[common]
bind_port = 7000 # 默认监听端口,为服务器和客户端通信的端口,可以根据实际情况进行更改。
token = 12345678 # 认证秘钥,客户端需与服务端一致才可以连接,可以不写这一行。
按 $Esc$ 退出插入模式,并输入”:wq”保存(w)并退出(q),不包括引号。
至此,服务端已配置完毕,接下来运行即可。1
2./frps -c frps.ini # 运行时需保持终端打开,否则会结束运行。Ctrl+C手动结束运行。
nohup ./frps -c frps.ini # 放到后台运行,服务器重启需重新执行。
以上方式运行未免还是有些不方便,所以最好将其写入到systemd服务。1
sudo vim /etc/systemd/system/frps.service
写入以下内容。1
2
3
4
5
6
7
8
9
10
11
12
13[Unit]
Description=frps daemon # 服务名称,随便填写即可
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini # 修改为你的frps的绝对路径
Restart= always
RestartSec=1min
[Install]
WantedBy=multi-user.target
启动服务,并设置开及自动运行。1
2
3sudo systemctl daemon-reload # 重新加载服务
sudo systemctl enable frps.service # 开机自启
sudo systemctl start frps # 启动服务
配置客户端frp配置文件,编辑 frpc.ini。1
2
3
4
5
6
7
8
9
10[common]
server_addr = 0.0.0.0 # 服务器IP地址或域名
server_port = 7000 # 服务器监听端口
token = 12345678
[mc] # 此处名称随意
type = tcp # 协议类型,如udp,http,https,stpx,xtcp
local_port = 25565 # 本地监听端口
remote_port = 25565 # 服务器转发端口
custom_domains = domain # 服务器域名
至此,客户端也配置完毕了,进入到frp文件夹,在此处打开cmd,或powershell。1
.\frpc -c frpc.ini
运行以上内容即可,窗口关闭即结束,也可以写入到 run.bat 双击执行。
接下来就可以愉快的玩耍了。
注:详细配置文件参照frps_full.ini和frpc_full.ini
一次性付费开通服务,1Mbps带宽,每月1G流量。
免费,仅限三人互相访问,1Mbps带宽。
还有其他免费平台自行百度即可,此处就不多赘述。
]]>1 | sudo apt update # 首先还是先更新下软件包源 |
1 | sudo apt install mysql-server mysql-client |
1 | sudo apt install php7.0 |
1 | sudo service apache2 restart |
1 | sudo apt-get install phpmyadmin |
1 | sudo a2enmod rewrite |
1 | sudo mysql -u root -p |
1 | wget https://cn.wordpress.org/latest-zh_CN.tar.gz |
C++课程作业
非文件操作: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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
typedef long long ll;
using namespace std;
int K=0;
class STU
{
private:
ll Num;
char Name[10];
char Sex;
double Score;
bool flag;
public:
void TITLE_STU();
void ADD_STU();
void CHANGE_STU();
void DEL_STU();
void SHOW_STU();
void SORT_STU();
void MAX_STU();
friend bool CMP(STU,STU);
STU()
{
flag=0;
}
~STU(){}
}Boy[1000];
bool CMP(STU a,STU b)
{
if (a.Score == b.Score)
return a.Num<b.Num;
return a.Score>b.Score;
}
void STU::TITLE_STU()
{
cout<<"\t1:\tADD A STUDENT"<<endl;
cout<<"\t2:\tCHANGE STUDENTS\'S INFORMATION"<<endl;
cout<<"\t3:\tDELETE A STUDENT"<<endl;
cout<<"\t4:\tSHOW STUDENTS INFORMATION"<<endl;
cout<<"\t5:\tSORT BY SCORE"<<endl;
cout<<"\t6:\tSHOW THE MAX SCORE\' STUDENT"<<endl;
cout<<"\t0:\tEXIT THE STUDENTS INFORMATION MANAGE SYSTEM"<<endl;
cout<<endl<<"\tPLEASE ENTER SELECTED CHOICES FROM ABOVE LISTS"<<endl;
}
void STU::ADD_STU()
{
cout<<"请输入要添加的学生人数"<<endl;
int T;cin>>T;
cout<<"请输入"<<T<<"行学生的学号,姓名,性别,成绩"<<endl;
for(int i=0;i<T;i++,K++)
{
cin>>Boy[K].Num>>Boy[K].Name>>Boy[K].Sex>>Boy[K].Score;
Boy[K].flag=0;
}
cout<<endl<<"学生信息导入成功"<<endl;
}
void STU::CHANGE_STU()
{
cout<<"请输入要修改的学生学号,输入0停止删除"<<endl;
ll num;
while(cin>>num)
{
int flag=0;
for(int i=0;i<K;i++)
{
if(num==Boy[i].Num)
{
cout<<"请再次输入学生的学号,姓名,性别,成绩"<<endl;
cin>>Boy[i].Num>>Boy[i].Name>>Boy[i].Sex>>Boy[i].Score;
Boy[i].flag=0;
flag=1;
cout<<"学生信息修改成功"<<endl;
}
}
if(num==0)break;
if(flag==0)cout<<"NO SUCH STUDENTS"<<endl;
}
}
void STU::DEL_STU()
{
cout<<"请输入要删除的学生学号,输入0停止删除"<<endl;
ll num;
while(cin>>num)
{
int flag=0;
for(int i=0;i<K;i++)
{
if(num==Boy[i].Num)
{
Boy[i].flag=1;
flag=1;
cout<<"DELETE SUCCESS!"<<endl;
break;
}
}
if(num==0)break;
if(flag==0)cout<<"NO SUCH STUDENTS"<<endl;
}
}
void STU::SHOW_STU()
{
cout<<endl<<"\tThe Lists Of Students Are Here"<<endl;
cout<<"-----------------------------------------------"<<endl;
cout<<" 学号\t姓名\t\t性别\t成绩"<<endl;
cout<<"-----------------------------------------------"<<endl;
cout.setf(std::ios::left);
for(int i=0;i<K;i++)
{
if(Boy[i].flag==0)
{
cout<<Boy[i].Num<<'\t';
cout<<setw(8)<<Boy[i].Name;
cout<<"\t "<<Boy[i].Sex<<'\t';
cout<<setiosflags(ios::fixed)<<setprecision(2)<<Boy[i].Score<<endl;
}
}
cout<<"-----------------------------------------------"<<endl;
}
void STU::SORT_STU()
{
sort(Boy,Boy+K,CMP);
cout<<"学生信息排序成功"<<endl;
}
void STU::MAX_STU()
{
int Maxn=0,Flag=0;
for(int i=0;i<K;i++)
{
if(Boy[i].Score>=Boy[Maxn].Score)
{
Maxn=i;
Flag=1;
}
}
if(Flag==0)cout<<"NO STUDENT"<<endl;
else
{
cout<<"-----------------------------------------------"<<endl;
cout<<" 学号\t姓名\t\t性别\t成绩"<<endl;
cout<<"-----------------------------------------------"<<endl;
cout.setf(std::ios::left);
cout<<Boy[Maxn].Num<<'\t';
cout<<setw(8)<<Boy[Maxn].Name;
cout<<"\t "<<Boy[Maxn].Sex<<'\t';
cout<<setiosflags(ios::fixed)<<setprecision(2)<<Boy[Maxn].Score<<endl;
cout<<"-----------------------------------------------"<<endl;
}
}
int main()
{
STU S;
S.TITLE_STU();
int choice;
while(cin>>choice)
{
if(choice==1)S.ADD_STU();
else if(choice==2)S.CHANGE_STU();
else if(choice==3)S.DEL_STU();
else if(choice==4)S.SHOW_STU();
else if(choice==5)S.SORT_STU();
else if(choice==6)S.MAX_STU();
else if(choice==0)break;
system("PAUSE&CLS");
S.TITLE_STU();
}
return 0;
}
文件操作: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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
typedef long long ll;
using namespace std;
int K = 0;
class STU
{
private:
ll Num;
char Name[10];
char Sex;
double Score;
bool flag;
public:
void READ_STU();
void WRITE_STU();
void TITLE_STU();
void ADD_STU();
void CHANGE_STU();
void DEL_STU();
void SHOW_STU();
void SORT_STU();
void MAX_STU();
friend bool CMP1(STU, STU);
friend bool CMP2(STU, STU);
friend bool CMP3(STU, STU);
STU()
{
flag = 0;
}
~STU() {}
}Boy[1000];
void STU::READ_STU()
{
FILE *fp = fopen("STU.dat", "r");
while (fscanf(fp, "%lld %s %c %lf", &Boy[K].Num, &Boy[K].Name, &Boy[K].Sex, &Boy[K].Score) != EOF)
{
Boy[K].flag = 0;
K++;
}
fclose(fp);
}
void STU::WRITE_STU()
{
FILE *fp = fopen("STU.dat", "w");
for (int i = 0; i < K; i++)
{
if(Boy[i].flag==0)
fprintf(fp, "%lld %s %c %lf\n", Boy[i].Num, Boy[i].Name, Boy[i].Sex, Boy[i].Score);
}
fclose(fp);
}
bool CMP1(STU a, STU b)
{
return a.Num<b.Num;
}
bool CMP2(STU a, STU b)
{
if (strcmp(a.Name,b.Name)==0)
return a.Num<b.Num;
return strcmp(a.Name,b.Name)<0;
}
bool CMP3(STU a, STU b)
{
if (a.Score == b.Score)
return a.Num<b.Num;
return a.Score>b.Score;
}
void STU::TITLE_STU()
{
cout << "\t1:\tADD A STUDENT" << endl;
cout << "\t2:\tCHANGE STUDENTS\'S INFORMATION" << endl;
cout << "\t3:\tDELETE A STUDENT" << endl;
cout << "\t4:\tSHOW STUDENTS INFORMATION" << endl;
cout << "\t5:\tSORT THE STUDENTS" << endl;
cout << "\t6:\tSHOW THE MAX SCORE\' STUDENT" << endl;
cout << "\t0:\tEXIT THE STUDENTS INFORMATION MANAGE SYSTEM" << endl;
cout << endl << "\tPLEASE ENTER SELECTED CHOICES FROM ABOVE LISTS" << endl;
}
void STU::ADD_STU()
{
cout << "请输入要添加的学生人数" << endl;
int T; cin >> T;
cout << "请输入" << T << "行学生的学号,姓名,性别,成绩" << endl;
for (int i = 0; i<T; i++, K++)
{
cin >> Boy[K].Num >> Boy[K].Name >> Boy[K].Sex >> Boy[K].Score;
Boy[K].flag = 0;
}
cout << endl << "学生信息导入成功" << endl;
}
void STU::CHANGE_STU()
{
cout << "请输入要修改的学生学号,输入0停止删除" << endl;
ll num;
while (cin >> num)
{
int flag = 0;
for (int i = 0; i<K; i++)
{
if (num == Boy[i].Num)
{
cout << "请再次输入学生的学号,姓名,性别,成绩" << endl;
cin >> Boy[i].Num >> Boy[i].Name >> Boy[i].Sex >> Boy[i].Score;
Boy[i].flag = 0;
flag = 1;
cout << "学生信息修改成功" << endl;
}
}
if (num == 0)break;
if (flag == 0)cout << "NO SUCH STUDENTS" << endl;
}
}
void STU::DEL_STU()
{
cout << "请输入要删除的学生学号,输入0停止删除" << endl;
ll num;
while (cin >> num)
{
int flag = 0;
for (int i = 0; i<K; i++)
{
if (num == Boy[i].Num)
{
Boy[i].flag = 1;
flag = 1;
cout << "DELETE SUCCESS!" << endl;
break;
}
}
if (num == 0)break;
if (flag == 0)cout << "NO SUCH STUDENTS" << endl;
}
}
void STU::SHOW_STU()
{
cout << endl << "\tThe Lists Of Students Are Here" << endl;
cout << "-----------------------------------------------" << endl;
cout << " 学号\t姓名\t\t性别\t成绩" << endl;
cout << "-----------------------------------------------" << endl;
cout.setf(std::ios::left);
for (int i = 0; i<K; i++)
{
if (Boy[i].flag == 0)
{
cout << Boy[i].Num << '\t';
cout << setw(8) << Boy[i].Name;
cout << "\t " << Boy[i].Sex << '\t';
cout << setiosflags(ios::fixed) << setprecision(2) << Boy[i].Score << endl;
}
}
cout << "-----------------------------------------------" << endl;
}
void STU::SORT_STU()
{
int x=0;
cout << "1.按学号排序" << endl;
cout << "2.按姓名排序" << endl;
cout << "3.按成绩排序" << endl << endl;;
cout << "请选择排序规则!" << endl;
cin >> x;
if(x==1)sort(Boy, Boy + K, CMP1);
else if(x==2)sort(Boy, Boy + K, CMP2);
else if (x == 3)sort(Boy, Boy + K, CMP3);
else cout << "输入错误,排序失败" << endl << endl;;
if (x == 1 || x == 2 || x == 3)cout << "学生信息排序成功" << endl << endl;
}
void STU::MAX_STU()
{
int Maxn = 0, Flag = 0;
for (int i = 0; i<K; i++)
{
if (Boy[i].Score >= Boy[Maxn].Score)
{
Maxn = i;
Flag = 1;
}
}
if (Flag == 0)cout << "NO STUDENT" << endl;
else
{
cout << "-----------------------------------------------" << endl;
cout << " 学号\t姓名\t\t性别\t成绩" << endl;
cout << "-----------------------------------------------" << endl;
cout.setf(std::ios::left);
cout << Boy[Maxn].Num << '\t';
cout << setw(8) << Boy[Maxn].Name;
cout << "\t " << Boy[Maxn].Sex << '\t';
cout << setiosflags(ios::fixed) << setprecision(2) << Boy[Maxn].Score << endl;
cout << "-----------------------------------------------" << endl;
}
}
int main()
{
STU S;
S.TITLE_STU();
S.READ_STU();
int choice;
while (cin >> choice)
{
if (choice == 1)S.ADD_STU();
else if (choice == 2)S.CHANGE_STU();
else if (choice == 3)S.DEL_STU();
else if (choice == 4)S.SHOW_STU();
else if (choice == 5)S.SORT_STU();
else if (choice == 6)S.MAX_STU();
else if (choice == 0)
{
S.WRITE_STU();
break;
}
system("PAUSE&CLS");
S.TITLE_STU();
}
return 0;
}
1 | class Program |
标准键盘
1 | /** |
PC
1 | +------------------------------------------------------------------------+ |
**佛祖保佑,永无BUG
1 | // _ooOoo_ |
**神兽护体,永无BUG
1 | // ┏┓ ┏┓ |
1 | /** |
程序员打油诗
1 | /** |
1 | /** |
单身狗
1 | <!-- |
骷髅头
1 | /** |
顶
1 | /** |
**BUG泛滥,我已瘫痪
1 | /** |
啪
1 | /** |
注册一个 GitHub 账号,创建一个新的仓库,仓库名称严格命名为todest.github.io
,todest
为用户名,修改成你自己的。
从此处 Git官网 下载并安装,右键打开Git Bash
。
1 | ssh-keygen -t rsa -C "邮件地址"# 连续回车 |
将"C:\Users\你的用户名\.ssh\id_rsa.pub"
的内容复制下来,打开GitHub设置->SSH and GPG keys->New SSH key
,粘贴到此处确定。1
2
3
4ssh -T git@github.com
# 测试SSH是否配置好
# 看到You've successfully authenticated, but GitHub does not provide shell access.
# 则说明配置好了,否则无法使用hexo d
从 Node.js官网 下载安装。
1 | npm install hexo-cli -g |
install
可简写为 i
。
1 | hexo init Blog# Blog可以修改成其他的名字 |
1 | npm install hexo-deployer-git --save |
以下g
是generate
的缩写,s
是start
的缩写,d
是deploy
的缩写。1
2
3hexo clean
hexo g# 生成 此条和后一条可简写为 hexo s -g
hexo s# 预览hexo s
是开启本地预览服务,打开浏览器访问 http://localhost:4000 即可看到内容。
上传之前,打开站点配置文件_config.yml
,位于站点根目录下,修改最后一部分为如下部分。1
2
3
4deploy:
type: git
repository: git@github.com:todest/todest.github.io.git # 修改为你的GitHub用户名
branch: master
上传到GitHub Pages
。1
2
3hexo clean
hexo g# 此条和后一条可简写为 hexo d -g
hexo d
主题位置themes
目录下,默认为landscape
主题。可从官网 https://hexo.io/themes/ 下载,推荐NexT
主题,以下为安装方法。
安装过程就一行代码,站点根目录下运行。1
git clone https://github.com/theme-next/hexo-theme-next themes/next
打开站点配置文件_config.yml
,找到theme: landscape
,修改为next
就可以了。
sample
是待备份文件夹
windows1
2@echo off
if "%time:~0,1%" EQU " " (
linux1
2time=$(date '+%Y%m%d%H%M%S' )
tar -cvf ./backup/$time.tar ./sample/
新建缓存目录
1 | mkdir -pv /home/nginx/cache |
修改 nginx.conf
在 http{} 里添加1
proxy_cache_path /home/nginx/cache levels=1:2 keys_zone=frp_cache:50m max_size=5g inactive=3d;
在 server{} 里添加1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect http://$host/ http://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
location ~* \.(jpg|jpeg|gif|png|svg|css|scss|js|ico|xml|woff|woff2|ttf|otf|eot)$ {
proxy_pass http://127.0.0.1:8080;
proxy_redirect http://$host/ http://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_cache frp_cache;
proxy_cache_key $uri$is_args$args;
proxy_cache_valid 200 206 301 302 304 3d;
expires 3d;
}