This repository has been archived by the owner on Dec 10, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
5389 lines (5060 loc) · 881 KB
/
search.xml
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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Hexo 后台运行</title>
<url>/OLD_BLOG/2021/07/14/Hexo-%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于需要hexo-damin支持编写博客,所以需要将hexo服务进行一直开启,但是由于ssh有相关连接限制,又不想修改ssh配置文件,所以出此博客</p>
<span id="more"></span>
<h1 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h1><h2 id="安装pm2模块"><a href="#安装pm2模块" class="headerlink" title="安装pm2模块"></a>安装pm2模块</h2><h3 id="什么是pm2模块"><a href="#什么是pm2模块" class="headerlink" title="什么是pm2模块"></a>什么是pm2模块</h3><p>PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。 下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和配置。</p>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>输入指令<br><code> npm install -g pm2</code>来进行安装</p>
<h2 id="在博客根目录下创建run-js文件"><a href="#在博客根目录下创建run-js文件" class="headerlink" title="在博客根目录下创建run.js文件"></a>在博客根目录下创建<code>run.js</code>文件</h2><p>在博客根目录下创建一个<code>run.js</code>的文件,并在里面输入如下内容:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">//将hexo保持后台运行</span><br><span class="line">const { <span class="built_in">exec</span> } = require(<span class="string">'child_process'</span>)</span><br><span class="line"><span class="built_in">exec</span>(<span class="string">'hexo server'</span>,(error, stdout, stderr) => {</span><br><span class="line"> <span class="keyword">if</span>(error){</span><br><span class="line"> console.log(<span class="string">'exec error: ${error}'</span>)</span><br><span class="line"> <span class="built_in">return</span></span><br><span class="line"> }</span><br><span class="line"> console.log(<span class="string">'stdout: ${stdout}'</span>);</span><br><span class="line"> console.log(<span class="string">'stderr: ${stderr}'</span>);</span><br><span class="line">})</span><br></pre></td></tr></table></figure>
<h2 id="之后在根目录下运行"><a href="#之后在根目录下运行" class="headerlink" title="之后在根目录下运行"></a>之后在根目录下运行</h2><p>输入:<code>pm2 start run.js </code></p>
<h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h2 id="如何关停pm2"><a href="#如何关停pm2" class="headerlink" title="如何关停pm2"></a>如何关停pm2</h2><p>输入<code>pm2 stop all</code>来关停所有的pm2运行项目</p>
<h2 id="pm2相关命令汇总"><a href="#pm2相关命令汇总" class="headerlink" title="pm2相关命令汇总"></a>pm2相关命令汇总</h2><figure class="highlight crmsh"><table><tr><td class="code"><pre><span class="line">pm2 <span class="literal">start</span> app.js <span class="comment"># 启动app.js应用程序</span></span><br><span class="line"> pm2 <span class="literal">start</span> app.js -i <span class="number">4</span> <span class="comment"># cluster mode 模式启动4个app.js的应用实例</span></span><br><span class="line"><span class="comment"># 4个应用程序会自动进行负载均衡</span></span><br><span class="line"> pm2 <span class="literal">start</span> app.js --<span class="attr">name=</span><span class="string">"api"</span> <span class="comment"># 启动应用程序并命名为 "api"</span></span><br><span class="line"> pm2 <span class="literal">start</span> app.js --watch <span class="comment"># 当文件变化时自动重启应用</span></span><br><span class="line"> pm2 <span class="literal">start</span> script.sh <span class="comment"># 启动 bash 脚本</span></span><br><span class="line"></span><br><span class="line"> pm2 list <span class="comment"># 列表 PM2 启动的所有的应用程序</span></span><br><span class="line"> pm2 monit <span class="comment"># 显示每个应用程序的CPU和内存占用情况</span></span><br><span class="line"> pm2 show [app-name] <span class="comment"># 显示应用程序的所有信息</span></span><br><span class="line"></span><br><span class="line"> pm2 logs <span class="comment"># 显示所有应用程序的日志</span></span><br><span class="line"> pm2 logs [app-name] <span class="comment"># 显示指定应用程序的日志</span></span><br><span class="line">pm2 flush</span><br><span class="line"></span><br><span class="line"> pm2 <span class="literal">stop</span> all <span class="comment"># 停止所有的应用程序</span></span><br><span class="line"> pm2 <span class="literal">stop</span> <span class="number">0</span> <span class="comment"># 停止 id为 0的指定应用程序</span></span><br><span class="line"> pm2 restart all <span class="comment"># 重启所有应用</span></span><br><span class="line"> pm2 reload all <span class="comment"># 重启 cluster mode下的所有应用</span></span><br><span class="line"> pm2 gracefulReload all <span class="comment"># Graceful reload all apps in cluster mode</span></span><br><span class="line"> pm2 delete all <span class="comment"># 关闭并删除所有应用</span></span><br><span class="line">pm2 delete <span class="number">0</span> <span class="comment"># 删除指定应用 id 0</span></span><br><span class="line"> pm2 scale api <span class="number">10</span> <span class="comment"># 把名字叫api的应用扩展到10个实例</span></span><br><span class="line"> pm2 reset [app-name] <span class="comment"># 重置重启数量</span></span><br><span class="line"></span><br><span class="line"> pm2 startup <span class="comment"># 创建开机自启动命令</span></span><br><span class="line"> pm2 save <span class="comment"># 保存当前应用列表</span></span><br><span class="line"> pm2 resurrect <span class="comment"># 重新加载保存的应用列表</span></span><br><span class="line"> pm2 update <span class="comment"># Save processes, kill PM2 and restore processes</span></span><br><span class="line"> pm2 generate <span class="comment"># Generate a sample json configuration file</span></span><br><span class="line">pm2 <span class="literal">start</span> app.js --<span class="keyword">node</span><span class="title">-args</span>=<span class="string">"--max-old-space-size=1024"</span></span><br><span class="line"></span><br><span class="line">作者:冰冰大象</span><br><span class="line">链接:https://www.jianshu.com/p/<span class="number">6</span>b3b506f7d0a</span><br><span class="line">来源:简书</span><br><span class="line">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>hexo</tag>
</tags>
</entry>
<entry>
<title>Linux下如何挂载磁盘[Arch系统]</title>
<url>/OLD_BLOG/2021/07/12/Linux%E4%B8%8B%E5%A6%82%E4%BD%95%E6%8C%82%E8%BD%BD%E7%A3%81%E7%9B%98-Arch%E7%B3%BB%E7%BB%9F/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>嫌弃开机后要自己手动挂载,不是懒人的亚子,因此。。。<br><strong>请注意:此教程会对电脑系统配置文件进行修改,如果操作时出现问题,可能会导致电脑无法开启,请认真观看</strong></p>
<span id="more"></span>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="挂载磁盘"><a href="#挂载磁盘" class="headerlink" title="挂载磁盘"></a>挂载磁盘</h2><p>首先,我们应当查询一下自己的挂载点,或者是自己设置一个挂载信息,为了方便,我会在配置前,手动将磁盘进行挂载,方便后面获取信息</p>
<h2 id="查询自己的盘符信息"><a href="#查询自己的盘符信息" class="headerlink" title="查询自己的盘符信息"></a>查询自己的盘符信息</h2><p>需要挂载硬盘,那么我们应当首先知道,硬盘的一些信息<br>因此我们需要输入<code>lsblk -o +UUID,fstype</code>命令,来查询一下我们的硬盘信息<br><img src="https://img-blog.csdnimg.cn/20210702235004557.png" alt="122"><br>以上是显示的信息,当然不全,后面资料涉及电脑隐私,不方便展示<br>我们需要知道磁盘的UUID,然后磁盘的挂载位置(MOUNTPOINTS)然后还有磁盘的类别(FSTYPE)</p>
<h2 id="更改磁盘挂载信息"><a href="#更改磁盘挂载信息" class="headerlink" title="更改磁盘挂载信息"></a>更改磁盘挂载信息</h2><p>知道以上信息之后,我们需要修改相关配置文件,之后我们在终端中输入<code>sudo vim /etc/fstab</code>来进行修改电脑配置文件<br><img src="https://img-blog.csdnimg.cn/20210702235635108.png" alt="1221"><br>然后我们会获得下述信息<br>我们需要在下方输入如下内容:<br><img src="https://img-blog.csdnimg.cn/20210702235818325.png" alt="1212"><br>按照上面查找的内容,输入信息(空格随意,最好要有区分度)<br>UUID为上面查询的内容,挂载位置为上文查询的MOUNTPOINTS,磁盘类型是上文的FSTYPE,相关选项一般填写defaults(默认),后面那个一般填写0 2<br>最后检查一下你的填写信息,就可以保存退出,之后重启电脑试验了</p>
<h2 id="提示"><a href="#提示" class="headerlink" title="提示"></a>提示</h2><p>当你不确定你填写信息是否正确的时候,可以将defaults修改成<code>nofail,x-systemd.device-timeout=1ms</code>这样的话,当系统在1ms内无法挂载你的磁盘的时候,就会放弃本次挂载,继续启动,但是要是重要的系统盘为进行挂载的话,也会出现问题</p>
<h1 id="尾言"><a href="#尾言" class="headerlink" title="尾言"></a>尾言</h1><p>请注意:本次教程只针对对于系统可以成功进入,相关盘符可以直接挂载的人使用的,如果是系统盘,则需要根据官方文档来进行操作</p>
]]></content>
<categories>
<category>linux</category>
</categories>
<tags>
<tag>linux</tag>
<tag>study</tag>
</tags>
</entry>
<entry>
<title>Arduino安装教程</title>
<url>/OLD_BLOG/2021/07/14/esp8266%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>记录一下自己安装Arduino的心路历程以及相关过程</p>
<span id="more"></span>
<h1 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h1><h2 id="什么是Arduino"><a href="#什么是Arduino" class="headerlink" title="什么是Arduino"></a>什么是Arduino</h2><blockquote>
<p>Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(IDE)。Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。它有着高度分装,方便调用的代码,可以和各类传感器轻松互动,实现我们的创客梦想!<br>知乎 </p>
</blockquote>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>由于此软件由国外开发者所开发,因此软件的安装包也在国外地区,不过国内团队已经提供了一个比较好的安装平台为大家进行选择<br><a href="http://www.taichi-maker.com/homepage/download/#software-download">点我</a><br>通过这个方式,能够很好的下载IDE</p>
<h2 id="配置esp8266的环境"><a href="#配置esp8266的环境" class="headerlink" title="配置esp8266的环境"></a>配置esp8266的环境</h2><p>由于编写是为了编写esp8266,因此我们需要配置它的环境<br>点击<kbd>文件</kbd>—><kbd>首选项</kbd>,在后面<kbd>附加开发板管理器网址</kbd>处输入以下内容:<br><code>http://arduino.esp8266.com/stable/package_esp8266com_index.json</code> 或<br><code>http://wechat.doit.am/package_esp8266com_index.json</code></p>
<p><img src="/images/pasted-8.png" alt="upload successful"></p>
<p><img src="/images/pasted-9.png" alt="upload successful"></p>
<p><img src="/images/pasted-10.png" alt="upload successful"></p>
<blockquote>
<p>博主小提醒:<br>由于配置时也是参考了别人的博客,因此测试了一下这两个,发现:<br>第一个需要翻墙进行访问(但是是官方的,会比国内的要很多,虽然会很慢,但是推荐)<br>第二个好像资源已经被删除或者被移动到了其他的地方,将文件地址输入到网站上会显示404界面<br>因此博主采用直接下载的方法进行安装</p>
</blockquote>
<p>之后对ide进行重启。之后我们点击<kbd>工具</kbd>—><kbd>开发板</kbd>—><kbd>开发板管理器</kbd><br>,在界面中输入esp8266进行搜索安装</p>
<p><img src="/images/pasted-12.png" alt="upload successful"></p>
<p><img src="/images/pasted-13.png" alt="upload successful"></p>
<p><img src="/images/pasted-14.png" alt="upload successful"></p>
<p>如果发生安装失败的方法,可以看上文,并<a href="#wrong1">点击我来进行跳转</a><br>之后便是重新启动ide软件,会发现esp8266的相关库已经安装成功了</p>
<p><img src="/images/pasted-15.png" alt="upload successful"></p>
<h1 id="错误汇总"><a href="#错误汇总" class="headerlink" title="错误汇总"></a>错误汇总</h1><h2 id="通过博客流程无法正常安装esp8266相关库"><a href="#通过博客流程无法正常安装esp8266相关库" class="headerlink" title="通过博客流程无法正常安装esp8266相关库"></a><div id="wrong1">通过博客流程无法正常安装esp8266相关库</div></h2><p>这里提供一个链接,通过<a href="https://www.arduino.cn/thread-76029-1-1.html">点我</a>来进行下载由大佬<code>奈何col</code>所提供的源码。[请注意,此版本为esp8266 2.7版本]<br>下载完成之后双击安装即可</p>
<h2 id="安装完包之后发现有更新,点击之后相关库消失了"><a href="#安装完包之后发现有更新,点击之后相关库消失了" class="headerlink" title="安装完包之后发现有更新,点击之后相关库消失了"></a>安装完包之后发现有更新,点击之后相关库消失了</h2><p>建议安装完第三方库不要进行更新,因为可能会出现库的匹配问题,有一定几率会删除之前安装的库</p>
<h2 id="安装过程报错"><a href="#安装过程报错" class="headerlink" title="安装过程报错"></a>安装过程报错</h2><p>这种情况在安装的时候我也出现过,解决方法就是多次点击安装,可能会出现的错误有<code>未通过验证</code>或者<code>在github上未找到相关包</code></p>
<h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>如有其他问题,欢迎留言</p>
]]></content>
<categories>
<category>study</category>
<category>硬件</category>
</categories>
<tags>
<tag>esp8266</tag>
</tags>
</entry>
<entry>
<title>git的相关代码</title>
<url>/OLD_BLOG/2021/07/12/git%E7%9A%84%E7%9B%B8%E5%85%B3%E4%BB%A3%E7%A0%81/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>从自己csdn上搬过来的,比较有用的</p>
<span id="more"></span>
<h3 id="本地相关操作"><a href="#本地相关操作" class="headerlink" title="本地相关操作"></a>本地相关操作</h3><h4 id="基操"><a href="#基操" class="headerlink" title="基操"></a>基操</h4><ul>
<li>添加工作区文件到暂存区</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git <span class="title function_">add</span> <span class="params">(文件名称/./--all/-a)</span></span><br><span class="line">其中第一个为添加指定文件到暂存区,后面三个是添加当前根目录下全部文件到暂存区</span><br></pre></td></tr></table></figure>
<ul>
<li>暂存区文件提交到版本库</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git commit -m <span class="string">"提交信息内容"</span></span><br></pre></td></tr></table></figure>
<ul>
<li>查看当前根目录下文件状态</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure>
<ul>
<li>查看当前仓库内版本记录</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git <span class="built_in">log</span></span><br><span class="line">git <span class="built_in">log</span> --graph 有图形界面</span><br><span class="line">git <span class="built_in">log</span> --graph --pretty=format:<span class="string">"%h %s"</span> </span><br><span class="line">在图形界面的基础上简化显示,只显示版本号以及提交信息</span><br></pre></td></tr></table></figure>
<ul>
<li>回滚文件到之前版本</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git reset --hard 版本号</span><br><span class="line">PS:版本号用git <span class="built_in">log</span>查看</span><br></pre></td></tr></table></figure>
<h4 id="分支"><a href="#分支" class="headerlink" title="分支"></a>分支</h4><ul>
<li>查看分支</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git branch</span><br></pre></td></tr></table></figure>
<ul>
<li>创建分支</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git branch 分支名称</span><br></pre></td></tr></table></figure>
<ul>
<li>切换分支</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git checkout 分支名称</span><br></pre></td></tr></table></figure>
<ul>
<li>删除分支</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git branch -d 分支名称</span><br></pre></td></tr></table></figure>
<ul>
<li>合并分支(将别的分支合并到当前分支)</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git merge 需要合并过来的分支</span><br></pre></td></tr></table></figure>
<h3 id="云端操作"><a href="#云端操作" class="headerlink" title="云端操作"></a>云端操作</h3><h4 id="基操-1"><a href="#基操-1" class="headerlink" title="基操"></a>基操</h4><ul>
<li>云端克隆仓库到本地</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git clone 仓库SSH地址</span><br></pre></td></tr></table></figure>
<ul>
<li>更新本地仓库(从云端信息)</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git pull origin 分支名称</span><br></pre></td></tr></table></figure>
<ul>
<li>将版本库的版本上传到云端</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git push -u origin master</span><br></pre></td></tr></table></figure>
<ul>
<li>从远程仓库获取文件到版本区</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git fetch origin 分支</span><br></pre></td></tr></table></figure>
<ul>
<li>将版本库的代码提取到工作区</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git merge origin/分支</span><br></pre></td></tr></table></figure>
<h4 id="创建一个新的本地仓库并且送到云端"><a href="#创建一个新的本地仓库并且送到云端" class="headerlink" title="创建一个新的本地仓库并且送到云端"></a>创建一个新的本地仓库并且送到云端</h4><ol>
<li>在本地创建一个新的仓库</li>
</ol>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git init </span><br><span class="line">PS:进入目标文件夹之后进行</span><br></pre></td></tr></table></figure>
<p>2.添加文件到暂存区</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git <span class="title function_">add</span> <span class="params">(文件名称)</span></span><br></pre></td></tr></table></figure>
<p>3.链接本地仓库以及远程仓库</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git remote add origin 远程地址</span><br></pre></td></tr></table></figure>
<p>4.暂存区文件到版本区</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git commit -m <span class="string">"相关描述"</span></span><br></pre></td></tr></table></figure>
<p>5.上传文件到相关分支</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git push -u origin master</span><br><span class="line">PS:-u可以不需要加(暂时没研究不加以及加的区别)</span><br><span class="line">PPS:master 上传到远程仓库的主分支,这个可以换成其他的</span><br></pre></td></tr></table></figure>
<h4 id="本地已经有仓库"><a href="#本地已经有仓库" class="headerlink" title="本地已经有仓库"></a>本地已经有仓库</h4><p>本地有仓库需要提交到云端的话只需要执行上面的3、5两个步骤即可</p>
<h4 id="git取消与远程仓库的的连接"><a href="#git取消与远程仓库的的连接" class="headerlink" title="git取消与远程仓库的的连接"></a>git取消与远程仓库的的连接</h4><p>连接远程仓库<br><code>git remote add origin 仓库地址</code></p>
<p>查看远程连接<br><code>git remote -v</code></p>
<p>git取消与远程仓库的连接<br><code>git remote remove origin</code></p>
<h4 id="git-rebase"><a href="#git-rebase" class="headerlink" title="git rebase"></a>git rebase</h4><ul>
<li>将之前一部分提交合并到一起</li>
</ul>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git rebase -i 想要合并的版本号</span><br><span class="line">从当前到你所选的版本号进行合并</span><br></pre></td></tr></table></figure>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">git rebase -i HEAD~数字 </span><br><span class="line">从当前开始找最近的三条记录合并到一起</span><br></pre></td></tr></table></figure>
<p>输入完上述之后会出现<br><img src="https://img-blog.csdnimg.cn/20210113211935327.png" alt="出现内容"><br>将下面的pick换成s<br><img src="https://img-blog.csdnimg.cn/2021011321202839.png" alt="变换"><br>PS:参数s代表将此版本与上面的版本进行合并<br>之后会出现如下内容<br><img src="https://img-blog.csdnimg.cn/20210113212222460.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIWUNhcmdl,size_16,color_FFFFFF,t_70" alt="整合提交信息"><br>此操作是将三次提交信息进行整合,修改为如下样子<br><img src="https://img-blog.csdnimg.cn/20210113212317876.png" alt="修改"><br>注意:如果版本已经上传到远程仓库,则尽可能避免合并此分支</p>
<h4 id="git修改分支名称"><a href="#git修改分支名称" class="headerlink" title="git修改分支名称"></a>git修改分支名称</h4><p>假设分支名称为master,然后我们需要将其改写成为dev<br><strong>当前操作在本地进行,并未进行云端同步</strong></p>
<figure class="highlight crmsh"><table><tr><td class="code"><pre><span class="line">git branch -m <span class="keyword">master</span> <span class="title">dev</span></span><br></pre></td></tr></table></figure>
<p>如果已经推送到远程分支,并且本地和远程分支的名称是对应的</p>
<ol>
<li>重命名远程分支所对应的本地分支<figure class="highlight crmsh"><table><tr><td class="code"><pre><span class="line">git branch -m <span class="keyword">master</span> <span class="title">dev</span> </span><br></pre></td></tr></table></figure></li>
<li>删除远程分支<figure class="highlight maxima"><table><tr><td class="code"><pre><span class="line">git <span class="built_in">push</span> --<span class="built_in">delete</span> <span class="built_in">origin</span> master </span><br></pre></td></tr></table></figure></li>
<li>上传新命名完成之后的本地分支<figure class="highlight maxima"><table><tr><td class="code"><pre><span class="line">git <span class="built_in">push</span> <span class="built_in">origin</span> dev</span><br></pre></td></tr></table></figure></li>
<li>将修改后的本地分支与远程分支相关联<figure class="highlight delphi"><table><tr><td class="code"><pre><span class="line">git branch --<span class="keyword">set</span>-upstream-<span class="keyword">to</span> origin/dev</span><br></pre></td></tr></table></figure>
借鉴来源:<a href="https://www.jianshu.com/p/cc740394faf5">git修改分支名称——简书</a></li>
</ol>
<blockquote>
<p>注意:<br>1.最后远程修改并未经过实践,也许并不可以实用,本人只使用到本地分支更改名称</p>
</blockquote>
<blockquote>
<p>其他:<strong>git brach</strong>的相关使用方法<br/><br><strong>删除:</strong><br> git push origin :branchName # 删除远程分支<br>git push origin –delete new # 删除远程分支new<br>git branch -d branchName # 删除本地分支,强制删除用-D<br>git branch -d test # 删除本地test分支<br>git branch -D test # 强制删除本地test分支<br>git remote prune origin # 远程删除了,本地还能看到远程存在,这条命令删除远程不存在的分支<br/><br><strong>查看:</strong><br>git branch # 列出本地分支<br>git branch -r # 列出远端分支<br>git branch -a # 列出所有分支<br>git branch -v # 查看各个分支最后一个提交对象的信息<br>git branch –merge # 查看已经合并到当前分支的分支<br>git branch –no-merge # 查看为合并到当前分支的分支<br>git remote show origin # 可以查看remote地址,远程分支<br/><br><strong>新建:</strong><br>git branch test # 新建test分支<br>git branch newBrach 3defc69 # 指定哈希3defc69,新建分支名字为newBrach<br>git checkout -b newBrach origin/master # 取回远程主机的更新以后,在它的基础上创建一个新的分支<br>git checkout -b newBrach 3defc69 # 以哈希值3defc69,新建 newBrach 分支,并切换到该分支<br/><br><strong>连接:</strong><br>git branch –set-upstream dev origin/dev # 将本地dev分支与远程dev分支之间建立链接<br>git branch –set-upstream master origin/next # 手动建立追踪关系 <br/><br><strong>分支切换:</strong><br>git checkout test # 切换到test分支<br>git checkout -b test # 新建+切换到test分支<br>git checkout -b test dev # 基于dev新建test分支,并切换 <br/><br><strong>远端:</strong><br>git fetch <远程主机名> <分支名> # fetch取回所有分支(branch)的更新<br>git fetch origin remotebranch[:localbranch] # 从远端拉去分支[到本地指定分支]<br>git merge origin/branch # 合并远端上指定分支<br>git pull origin remotebranch:localbranch # 拉去远端分支到本地分支<br>git push origin branch # 将当前分支,推送到远端上指定分支<br>git push origin localbranch:remotebranch # 推送本地指定分支,到远端上指定分支<br>git push origin :remotebranch # 删除远端指定分支<br>git checkout -b [–track] test origin/dev # 基于远端dev分支,新建本地test分支[同时设置跟踪] <br/><br><strong>以上内容粘贴自linux文档,搬运工ing</strong></p>
</blockquote>
]]></content>
</entry>
<entry>
<title>git配置以及与gitee联动</title>
<url>/OLD_BLOG/2021/07/12/git%E9%85%8D%E7%BD%AE%E4%BB%A5%E5%8F%8A%E4%B8%8Egitee%E8%81%94%E5%8A%A8/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>新系统配置完成之后,怎能缺少git呢</p>
<span id="more"></span>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><p>首先配置git的全局信息,代码如下</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git config --global user.name <span class="string">"username"</span></span><br><span class="line">填写你的全局用户名</span><br><span class="line">git config --global user.email <span class="string">"email"</span></span><br><span class="line">填写你的邮箱号(其实可以不写邮箱,只是一个标识)</span><br></pre></td></tr></table></figure>
<p>之后在终端中输入:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ssh-keygen -t rsa –C <span class="string">"你的邮箱号"</span></span><br></pre></td></tr></table></figure>
<p>如图所示,之后就是多次输入回车,便可获得以下内容<br><img src="https://img-blog.csdnimg.cn/2021032921000723.png" alt="生成ssh文件"><br><img src="https://img-blog.csdnimg.cn/20210329210044299.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIWUNhcmdl,size_16,color_FFFFFF,t_70" alt="成功"><br>之后你的SSH公钥就存放在<code>~/.ssh/id_rsa.pub</code>中,因此我们直接输入</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">cat</span> ~/.ssh/id_rsa.pub</span><br></pre></td></tr></table></figure>
<p>进行查看,之后复制到gitee的相关公钥粘贴便可<br>之后我们需要在终端中输入:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ssh -T 你的gitee账户@gitee.com</span><br></pre></td></tr></table></figure>
<p>之后会显示<br><img src="https://img-blog.csdnimg.cn/20210329210821217.png" alt="你好"><br>之后显示这个代表配置完成<br><img src="https://img-blog.csdnimg.cn/20210329210912932.png" alt="完成"></p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>git</tag>
</tags>
</entry>
<entry>
<title>hexo中创建博客文章</title>
<url>/OLD_BLOG/2021/07/12/hexo%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E6%96%87%E7%AB%A0/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>搭建完成博客之后,当然是要写东西的</p>
<span id="more"></span>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><ol>
<li>在博客根目录下,输入<code>hexo n "博客主题"</code>便可以输出一篇文章</li>
<li>然后通过使用markdown等相关编写软件,来对md文件进行编写</li>
<li>输入<code>hexo g & hexo d</code>来对博客进行上载(上载到github,或者<code>hexo g & hexo s</code>在<code>localhost:4000</code>上进行查看<h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1>这么写一篇博客,看着我都好累,因此有个比较好的插件进行推荐<h2 id="插件安装"><a href="#插件安装" class="headerlink" title="插件安装"></a>插件安装</h2>在博客根目录下输入<code> npm install --save hexo-admin</code>来进行安装插件<br>之后启动网站在浏览器中输入<code>localhost:4000/admin</code>进行编写,界面相对来讲简单很多</li>
</ol>
<p><img src="/images/pasted-2.png" alt="upload successful"><br>之后有许许多多的文件来进行讲解,具体贴个链接得了<br><a href="ttps://blog.csdn.net/smileyan9/article/details/86666824">链接点我</a></p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>hexo</tag>
</tags>
</entry>
<entry>
<title>nginx.conf的详细配置介绍(转载)</title>
<url>/OLD_BLOG/2021/07/13/nginx-conf%E7%9A%84%E8%AF%A6%E7%BB%86%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E9%A1%B5%E9%9D%A2/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>本文为转载文章,由于博主文章很好,故转载保存<br>作者:程序员自由之路<br>出处:<a href="https://www.cnblogs.com/54chensongxia/p/12938929.html">https://www.cnblogs.com/54chensongxia/p/12938929.html</a><br>版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可</p>
<span id="more"></span>
<h1 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h1><h3 id="前言-1"><a href="#前言-1" class="headerlink" title="前言"></a>前言</h3><p>Nginx的主配置文件是nginx.conf,这个配置文件一共由三部分组成,分别为全局块、events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。</p>
<p>配置文件支持大量可配置的指令,绝大多数指令不是特定属于某一个块的。同一个指令放在不同层级的块中,其作用域也不同,一般情况下,高一级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。如果某个指令在两个不同层级的块中同时出现,则采用“就近原则”,即以较低层级块中的配置为准。比如,某指令同时出现在http全局块中和server块中,并且配置不同,则应该以server块中的配置为准。</p>
<p>整个配置文件的结构大致如下:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">#全局块</span></span><br><span class="line"><span class="comment">#user nobody;</span></span><br><span class="line">worker_processes 1;</span><br><span class="line"></span><br><span class="line"><span class="comment">#event块</span></span><br><span class="line">events {</span><br><span class="line"> worker_connections 1024;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">#http块</span></span><br><span class="line">http {</span><br><span class="line"> <span class="comment">#http全局块</span></span><br><span class="line"> include mime.types;</span><br><span class="line"> default_type application/octet-stream;</span><br><span class="line"> sendfile on;</span><br><span class="line"> keepalive_timeout 65;</span><br><span class="line"> <span class="comment">#server块</span></span><br><span class="line"> server {</span><br><span class="line"> <span class="comment">#server全局块</span></span><br><span class="line"> listen 8000;</span><br><span class="line"> server_name localhost;</span><br><span class="line"> <span class="comment">#location块</span></span><br><span class="line"> location / {</span><br><span class="line"> root html;</span><br><span class="line"> index index.html index.htm;</span><br><span class="line"> }</span><br><span class="line"> error_page 500 502 503 504 /50x.html;</span><br><span class="line"> location = /50x.html {</span><br><span class="line"> root html;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">#这边可以有多个server块</span></span><br><span class="line"> server {</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="全局块"><a href="#全局块" class="headerlink" title="全局块"></a>全局块</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 指定可以运行nginx服务的用户和用户组,只能在全局块配置</span></span><br><span class="line"><span class="comment"># user [user] [group]</span></span><br><span class="line"><span class="comment"># 将user指令注释掉,或者配置成nobody的话所有用户都可以运行</span></span><br><span class="line"><span class="comment"># user nobody nobody;</span></span><br><span class="line"><span class="comment"># user指令在Windows上不生效,如果你制定具体用户和用户组会报小面警告</span></span><br><span class="line"><span class="comment"># nginx: [warn] "user" is not supported, ignored in D:\software\nginx-1.18.0/conf/nginx.conf:2</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定工作线程数,可以制定具体的进程数,也可使用自动模式,这个指令只能在全局块配置</span></span><br><span class="line"><span class="comment"># worker_processes number | auto;</span></span><br><span class="line"><span class="comment"># 列子:指定4个工作线程,这种情况下会生成一个master进程和4个worker进程</span></span><br><span class="line"><span class="comment"># worker_processes 4;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定pid文件存放的路径,这个指令只能在全局块配置</span></span><br><span class="line"><span class="comment"># pid logs/nginx.pid;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定错误日志的路径和日志级别,此指令可以在全局块、http块、server块以及location块中配置。(在不同的块配置有啥区别??)</span></span><br><span class="line"><span class="comment"># 其中debug级别的日志需要编译时使用--with-debug开启debug开关</span></span><br><span class="line"><span class="comment"># error_log [path] [debug | info | notice | warn | error | crit | alert | emerg] </span></span><br><span class="line"><span class="comment"># error_log logs/error.log notice;</span></span><br><span class="line"><span class="comment"># error_log logs/error.log info;</span></span><br></pre></td></tr></table></figure>
<h3 id="events块"><a href="#events块" class="headerlink" title="events块"></a>events块</h3><p>events块涉及的指令主要影响Nginx服务器与用户的网络连接。常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等。<br>这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就有可能出现这样的问题。</span></span><br><span class="line"><span class="comment"># 开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢</span></span><br><span class="line"><span class="comment"># 默认是开启状态,只能在events块中进行配置</span></span><br><span class="line"><span class="comment"># accept_mutex on | off;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接。 </span></span><br><span class="line"><span class="comment"># 如果nginx使用kqueue连接方法,那么这条指令会被忽略,因为这个方法会报告在等待被接受的新连接的数量。</span></span><br><span class="line"><span class="comment"># 默认是off状态,只能在event块配置</span></span><br><span class="line"><span class="comment"># multi_accept on | off;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定使用哪种网络IO模型,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport,一般操作系统不是支持上面所有模型的。</span></span><br><span class="line"><span class="comment"># 只能在events块中进行配置</span></span><br><span class="line"><span class="comment"># use method</span></span><br><span class="line"><span class="comment"># use epoll</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置允许每一个worker process同时开启的最大连接数,当每个工作进程接受的连接数超过这个值时将不再接收连接</span></span><br><span class="line"><span class="comment"># 当所有的工作进程都接收满时,连接进入logback,logback满后连接被拒绝</span></span><br><span class="line"><span class="comment"># 只能在events块中进行配置</span></span><br><span class="line"><span class="comment"># 注意:这个值不能超过超过系统支持打开的最大文件数,也不能超过单个进程支持打开的最大文件数,具体可以参考这篇文章:https://cloud.tencent.com/developer/article/1114773</span></span><br><span class="line"><span class="comment"># worker_connections 1024;</span></span><br></pre></td></tr></table></figure>
<h3 id="http块"><a href="#http块" class="headerlink" title="http块"></a>http块</h3><p>http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。<br>前面已经提到,http块中可以包含自己的全局块,也可以包含server块,server块中又可以进一步包含location块,在本书中我们使用“http全局块”来表示http中自己的全局块,即http块中不包含在server块中的部分。<br>可以在http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 常用的浏览器中,可以显示的内容有HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># include指令,用于包含其他的配置文件,可以放在配置文件的任何地方,但是要注意你包含进来的配置文件一定符合配置规范,比如说你include进来的配置是worker_processes指令的配置,而你将这个指令包含到了http块中,着肯定是不行的,上面已经介绍过worker_processes指令只能在全局块中。</span></span><br><span class="line"><span class="comment"># 下面的指令将mime.types包含进来,mime.types和ngin.cfg同级目录,不同级的话需要指定具体路径</span></span><br><span class="line"><span class="comment"># include mime.types;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置默认类型,如果不加此指令,默认值为text/plain。</span></span><br><span class="line"><span class="comment"># 此指令还可以在http块、server块或者location块中进行配置。</span></span><br><span class="line"><span class="comment"># default_type application/octet-stream;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># access_log配置,此指令可以在http块、server块或者location块中进行设置</span></span><br><span class="line"><span class="comment"># 在全局块中,我们介绍过errer_log指令,其用于配置Nginx进程运行时的日志存放和级别,此处所指的日志与常规的不同,它是指记录Nginx服务器提供服务过程应答前端请求的日志</span></span><br><span class="line"><span class="comment"># access_log path [format [buffer=size]]</span></span><br><span class="line"><span class="comment"># 如果你要关闭access_log,你可以使用下面的命令</span></span><br><span class="line"><span class="comment"># access_log off;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># log_format指令,用于定义日志格式,此指令只能在http块中进行配置</span></span><br><span class="line"><span class="comment"># log_format main '$remote_addr - $remote_user [$time_local] "$request" '</span></span><br><span class="line"><span class="comment"># '$status $body_bytes_sent "$http_referer" '</span></span><br><span class="line"><span class="comment"># '"$http_user_agent" "$http_x_forwarded_for"';</span></span><br><span class="line"><span class="comment"># 定义了上面的日志格式后,可以以下面的形式使用日志</span></span><br><span class="line"><span class="comment"># access_log logs/access.log main;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 开启关闭sendfile方式传输文件,可以在http块、server块或者location块中进行配置</span></span><br><span class="line"><span class="comment"># sendfile on | off;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置sendfile最大数据量,此指令可以在http块、server块或location块中配置</span></span><br><span class="line"><span class="comment"># sendfile_max_chunk size;</span></span><br><span class="line"><span class="comment"># 其中,size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值(这里是128k,所以每次不能超过128k);如果设置为0,则无限制。默认值为0。</span></span><br><span class="line"><span class="comment"># sendfile_max_chunk 128k;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置连接超时时间,此指令可以在http块、server块或location块中配置。</span></span><br><span class="line"><span class="comment"># 与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间</span></span><br><span class="line"><span class="comment"># timeout,服务器端对连接的保持时间。默认值为75s;header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout”。报文中的这个指令可以被Mozilla或者Konqueror识别。</span></span><br><span class="line"><span class="comment"># keepalive_timeout timeout [header_timeout]</span></span><br><span class="line"><span class="comment"># 下面配置的含义是,在服务器端保持连接的时间设置为120 s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100 s。</span></span><br><span class="line"><span class="comment"># keepalive_timeout 120s 100s</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置单连接请求数上限,此指令可以在http块、server块或location块中配置。</span></span><br><span class="line"><span class="comment"># Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数。默认是100</span></span><br><span class="line"><span class="comment"># keepalive_requests number;</span></span><br></pre></td></tr></table></figure>
<h3 id="server块"><a href="#server块" class="headerlink" title="server块"></a>server块</h3><p>server块和“虚拟主机”的概念有密切联系。<br>虚拟主机,又称虚拟服务器、主机空间或是网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的。这里的“主机”或“空间”是由实体的服务器延伸而来,硬件系统可以基于服务器群,或者单个服务器等。虚拟主机技术主要应用于HTTP、FTP及EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的。<br>在使用Nginx服务器提供Web服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的Nginx服务器,也无需为每个网站对应运行一组Nginx进程。虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。<br>在前面提到过,每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。<br>和http块相同,server块也可以包含自己的全局块,同时可以包含多个location块。在server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或IP配置。</p>
<h3 id="listen指令"><a href="#listen指令" class="headerlink" title="listen指令"></a>listen指令</h3><p>server块中最重要的指令就是listen指令,这个指令有三种配置语法。这个指令默认的配置值是:listen *:80 | *:8000;只能在server块种配置这个指令。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">//第一种</span><br><span class="line">listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [<span class="built_in">bind</span>] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];</span><br><span class="line"></span><br><span class="line">//第二种</span><br><span class="line">listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [<span class="built_in">bind</span>] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];</span><br><span class="line"></span><br><span class="line">//第三种(可以不用重点关注)</span><br><span class="line">listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [<span class="built_in">bind</span>] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];</span><br></pre></td></tr></table></figure>
<p>listen指令的配置非常灵活,可以单独制定ip,单独指定端口或者同时指定ip和端口。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">listen 127.0.0.1:8000; <span class="comment">#只监听来自127.0.0.1这个IP,请求8000端口的请求</span></span><br><span class="line">listen 127.0.0.1; <span class="comment">#只监听来自127.0.0.1这个IP,请求80端口的请求(不指定端口,默认80)</span></span><br><span class="line">listen 8000; <span class="comment">#监听来自所有IP,请求8000端口的请求</span></span><br><span class="line">listen *:8000; <span class="comment">#和上面效果一样</span></span><br><span class="line">listen localhost:8000; <span class="comment">#和第一种效果一致</span></span><br></pre></td></tr></table></figure>
<p>关于上面的一些重要参数做如下说明:</p>
<ul>
<li>address:监听的IP地址(请求来源的IP地址),如果是IPv6的地址,需要使用中括号“[]”括起来,比如[fe80::1]等。</li>
<li>port:端口号,如果只定义了IP地址没有定义端口号,就使用80端口。这边需要做个说明:要是你压根没配置listen指令,那么那么如果nginx以超级用户权限运行,则使用*:80,否则使用*:8000。多个虚拟主机可以同时监听同一个端口,但是server_name需要设置成不一样;</li>
<li>default_server:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理。具体的可以参考<a href="https://segmentfault.com/a/1190000015681272">这篇文章</a>,写的不错。</li>
<li>backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511。</li>
<li>accept_filter=filter,设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。filter可以设置为dataready或httpready,感兴趣的读者可以参阅Nginx的官方文档。</li>
<li>bind:标识符,使用独立的bind()处理此address:port;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接。</li>
<li>ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。<br>listen指令的使用看起来比较复杂,但其实在一般的使用过程中,相对来说比较简单,并不会进行太复杂的配置。<h3 id="server-name指令"><a href="#server-name指令" class="headerlink" title="server_name指令"></a>server_name指令</h3>用于配置虚拟主机的名称。语法是:</li>
</ul>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Syntax: server_name name ...;</span><br><span class="line">Default: </span><br><span class="line">server_name <span class="string">""</span>;</span><br><span class="line">Context: server</span><br></pre></td></tr></table></figure>
<p>对于name 来说,可以只有一个名称,也可以由多个名称并列,之间用空格隔开。每个名字就是一个域名,由两段或者三段组成,之间由点号“.”隔开。比如</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">server_name myserver.com www.myserver.com</span><br></pre></td></tr></table></figure>
<p>在该例中,此虚拟主机的名称设置为myserver.com或www. myserver.com。Nginx服务器规定,第一个名称作为此虚拟主机的主要名称。</p>
<p>在name 中可以使用通配符“*”,但通配符只能用在由三段字符串组成的名称的首段或尾段,或者由两段字符串组成的名称的尾段,如:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">server_name myserver.* *.myserver.com</span><br></pre></td></tr></table></figure>
<p>另外name还支持正则表达式的形式。这边就不详细展开了。</p>
<p>由于server_name指令支持使用通配符和正则表达式两种配置名称的方式,因此在包含有多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配成功。那么,来自这个名称的请求到底要交给哪个虚拟主机处理呢?Nginx服务器做出如下规定:</p>
<ol>
<li><p>对于匹配方式不同的,按照以下的优先级选择虚拟主机,排在前面的优先处理请求。<br>① 准确匹配server_name<br>② 通配符在开始时匹配server_name成功<br>③ 通配符在结尾时匹配server_name成功<br>④ 正则表达式匹配server_name成功 </p>
</li>
<li><p>在以上四种匹配方式中,如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求。<br>有时候我们希望使用基于IP地址的虚拟主机配置,比如访问192.168.1.31有虚拟主机1处理,访问192.168.1.32由虚拟主机2处理。<br>这时我们要先网卡绑定别名,比如说网卡之前绑定的IP是192.168.1.30,现在将192.168.1.31和192.168.1.32这两个IP都绑定到这个网卡上,那么请求这个两个IP的请求才会到达这台机器。<br>绑定别名后进行以下配置即可:</p>
</li>
</ol>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">http</span><br><span class="line">{</span><br><span class="line"> {</span><br><span class="line"> listen: 80;</span><br><span class="line"> server_name: 192.168.1.31;</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line"> {</span><br><span class="line"> listen: 80;</span><br><span class="line"> server_name: 192.168.1.32;</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="location块"><a href="#location块" class="headerlink" title="location块"></a>location块</h3><p>每个server块中可以包含多个location块。在整个Nginx配置文档中起着重要的作用,而且Nginx服务器在许多功能上的灵活性往往在location指令的配置中体现出来。<br>location块的主要作用是,基于Nginx服务器接收到的请求字符串(例如, server_name/uri-string),对除虚拟主机名称(也可以是IP别名,后文有详细阐述)之外的字符串(前例中“/uri-string”部分)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。<br>在Nginx的官方文档中定义的location的语法结构为:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">location [ = | ~ | ~* | ^~ ] uri { ... }</span><br></pre></td></tr></table></figure>
<p>其中,uri变量是待匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php等;也可以是包含有正则表达的字符串,如 .php$(表示以.php结尾的URL)等。为了下文叙述方便,我们约定,不含正则表达的uri称为“标准uri”,使用正则表达式的uri称为“正则uri”。<br>其中方括号里的部分,是可选项,用来改变请求字符串与 uri 的匹配方式。在介绍四种标识的含义之前,我们需要先了解不添加此选项时,Nginx服务器是如何在server块中搜索并使用location块的uri和请求字符串匹配的。<br>在不添加此选项时,Nginx服务器首先在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。<br>了解了上面的内容,就可以解释可选项中各个标识的含义了:</p>
<ul>
<li><p>“=”,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。</p>
</li>
<li><p>“^~”,用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。</p>
</li>
<li><p>“~”,用于表示uri包含正则表达式,并且区分大小写。</p>
</li>
<li><p>“~<em>”,用于表示uri包含正则表达式,并且不区分大小写。注意如果uri包含正则表达式,就必须要使用“~”或者“~</em>”标识。</p>
<blockquote>
<p>我们知道,在浏览器传送URI时对一部分字符进行URL编码,比如空格被编码为“%20”,问号被编码为“%3f”等。“~”有一个特点是,它对uri中的这些符号将会进行编码处理。比如,如果location块收到的URI为“/html/%20/data”,则当Nginx服务器搜索到配置为“~ /html/ /data”的location时,可以匹配成功。</p>
</blockquote>
</li>
</ul>
<h3 id="root指令"><a href="#root指令" class="headerlink" title="root指令"></a>root指令</h3><p>这个指令用于设置请求寻找资源的跟目录,此指令可以在http块、server块或者location块中配置。由于使用Nginx服务器多数情况下要配置多个location块对不同的请求分别做出处理,因此该指令通常在location块中进行设置。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">root path</span><br></pre></td></tr></table></figure>
<p>path变量中可以包含Nginx服务器预设的大多数变量,只有documentroot和realpath_root不可以使用。</p>
<h3 id="一个配置文件的列子"><a href="#一个配置文件的列子" class="headerlink" title="一个配置文件的列子"></a>一个配置文件的列子</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">######Nginx配置文件nginx.conf中文详解#####</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#定义Nginx运行的用户和用户组</span></span><br><span class="line">user www www;</span><br><span class="line"></span><br><span class="line"><span class="comment">#nginx进程数,建议设置为等于CPU总核心数。</span></span><br><span class="line">worker_processes 8;</span><br><span class="line"> </span><br><span class="line"><span class="comment">#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]</span></span><br><span class="line">error_log /usr/local/nginx/logs/error.log info;</span><br><span class="line"></span><br><span class="line"><span class="comment">#进程pid文件</span></span><br><span class="line">pid /usr/local/nginx/logs/nginx.pid;</span><br><span class="line"></span><br><span class="line"><span class="comment">#指定进程可以打开的最大描述符:数目</span></span><br><span class="line"><span class="comment">#工作模式与连接数上限</span></span><br><span class="line"><span class="comment">#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。</span></span><br><span class="line"><span class="comment">#现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。</span></span><br><span class="line"><span class="comment">#这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。</span></span><br><span class="line">worker_rlimit_nofile 65535;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">events</span><br><span class="line">{</span><br><span class="line"> <span class="comment">#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型</span></span><br><span class="line"> <span class="comment">#是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。</span></span><br><span class="line"> <span class="comment">#补充说明:</span></span><br><span class="line"> <span class="comment">#与apache相类,nginx针对不同的操作系统,有不同的事件模型</span></span><br><span class="line"> <span class="comment">#A)标准事件模型</span></span><br><span class="line"> <span class="comment">#Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll</span></span><br><span class="line"> <span class="comment">#B)高效事件模型</span></span><br><span class="line"> <span class="comment">#Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。</span></span><br><span class="line"> <span class="comment">#Epoll:使用于Linux内核2.6版本及以后的系统。</span></span><br><span class="line"> <span class="comment">#/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。</span></span><br><span class="line"> <span class="comment">#Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。</span></span><br><span class="line"> use epoll;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#单个进程最大连接数(最大连接数=连接数*进程数)</span></span><br><span class="line"> <span class="comment">#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。</span></span><br><span class="line"> worker_connections 65535;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#keepalive超时时间。</span></span><br><span class="line"> keepalive_timeout 60;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。</span></span><br><span class="line"> <span class="comment">#分页大小可以用命令getconf PAGESIZE 取得。</span></span><br><span class="line"> <span class="comment">#[root@web001 ~]# getconf PAGESIZE</span></span><br><span class="line"> <span class="comment">#4096</span></span><br><span class="line"> <span class="comment">#但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。</span></span><br><span class="line"> client_header_buffer_size 4k;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。</span></span><br><span class="line"> open_file_cache max=65535 inactive=60s;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#这个是指多长时间检查一次缓存的有效信息。</span></span><br><span class="line"> <span class="comment">#语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.</span></span><br><span class="line"> open_file_cache_valid 80s;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。</span></span><br><span class="line"> <span class="comment">#语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.</span></span><br><span class="line"> open_file_cache_min_uses 1;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件时记录cache错误.</span></span><br><span class="line"> open_file_cache_errors on;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="comment">#设定http服务器,利用它的反向代理功能提供负载均衡支持</span></span><br><span class="line">http</span><br><span class="line">{</span><br><span class="line"> <span class="comment">#文件扩展名与文件类型映射表</span></span><br><span class="line"> include mime.types;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#默认文件类型</span></span><br><span class="line"> default_type application/octet-stream;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#默认编码</span></span><br><span class="line"> <span class="comment">#charset utf-8;</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#服务器名字的hash表大小</span></span><br><span class="line"> <span class="comment">#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.</span></span><br><span class="line"> server_names_hash_bucket_size 128;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。</span></span><br><span class="line"> client_header_buffer_size 32k;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。</span></span><br><span class="line"> large_client_header_buffers 4 64k;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#设定通过nginx上传文件的大小</span></span><br><span class="line"> client_max_body_size 8m;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。</span></span><br><span class="line"> <span class="comment">#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。</span></span><br><span class="line"> sendfile on;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#开启目录列表访问,合适下载服务器,默认关闭。</span></span><br><span class="line"> autoindex on;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用</span></span><br><span class="line"> tcp_nopush on;</span><br><span class="line"> </span><br><span class="line"> tcp_nodelay on;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#长连接超时时间,单位是秒</span></span><br><span class="line"> keepalive_timeout 120;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。</span></span><br><span class="line"> fastcgi_connect_timeout 300;</span><br><span class="line"> fastcgi_send_timeout 300;</span><br><span class="line"> fastcgi_read_timeout 300;</span><br><span class="line"> fastcgi_buffer_size 64k;</span><br><span class="line"> fastcgi_buffers 4 64k;</span><br><span class="line"> fastcgi_busy_buffers_size 128k;</span><br><span class="line"> fastcgi_temp_file_write_size 128k;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#gzip模块设置</span></span><br><span class="line"> gzip on; <span class="comment">#开启gzip压缩输出</span></span><br><span class="line"> gzip_min_length 1k; <span class="comment">#最小压缩文件大小</span></span><br><span class="line"> gzip_buffers 4 16k; <span class="comment">#压缩缓冲区</span></span><br><span class="line"> gzip_http_version 1.0; <span class="comment">#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)</span></span><br><span class="line"> gzip_comp_level 2; <span class="comment">#压缩等级</span></span><br><span class="line"> gzip_types text/plain application/x-javascript text/css application/xml; <span class="comment">#压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。</span></span><br><span class="line"> gzip_vary on;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#开启限制IP连接数的时候需要使用</span></span><br><span class="line"> <span class="comment">#limit_zone crawler $binary_remote_addr 10m;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">#负载均衡配置</span></span><br><span class="line"> upstream jh.w3cschool.cn {</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。</span></span><br><span class="line"> server 192.168.80.121:80 weight=3;</span><br><span class="line"> server 192.168.80.122:80 weight=2;</span><br><span class="line"> server 192.168.80.123:80 weight=3;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#nginx的upstream目前支持4种方式的分配</span></span><br><span class="line"> <span class="comment">#1、轮询(默认)</span></span><br><span class="line"> <span class="comment">#每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。</span></span><br><span class="line"> <span class="comment">#2、weight</span></span><br><span class="line"> <span class="comment">#指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。</span></span><br><span class="line"> <span class="comment">#例如:</span></span><br><span class="line"> <span class="comment">#upstream bakend {</span></span><br><span class="line"> <span class="comment"># server 192.168.0.14 weight=10;</span></span><br><span class="line"> <span class="comment"># server 192.168.0.15 weight=10;</span></span><br><span class="line"> <span class="comment">#}</span></span><br><span class="line"> <span class="comment">#2、ip_hash</span></span><br><span class="line"> <span class="comment">#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。</span></span><br><span class="line"> <span class="comment">#例如:</span></span><br><span class="line"> <span class="comment">#upstream bakend {</span></span><br><span class="line"> <span class="comment"># ip_hash;</span></span><br><span class="line"> <span class="comment"># server 192.168.0.14:88;</span></span><br><span class="line"> <span class="comment"># server 192.168.0.15:80;</span></span><br><span class="line"> <span class="comment">#}</span></span><br><span class="line"> <span class="comment">#3、fair(第三方)</span></span><br><span class="line"> <span class="comment">#按后端服务器的响应时间来分配请求,响应时间短的优先分配。</span></span><br><span class="line"> <span class="comment">#upstream backend {</span></span><br><span class="line"> <span class="comment"># server server1;</span></span><br><span class="line"> <span class="comment"># server server2;</span></span><br><span class="line"> <span class="comment"># fair;</span></span><br><span class="line"> <span class="comment">#}</span></span><br><span class="line"> <span class="comment">#4、url_hash(第三方)</span></span><br><span class="line"> <span class="comment">#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。</span></span><br><span class="line"> <span class="comment">#例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法</span></span><br><span class="line"> <span class="comment">#upstream backend {</span></span><br><span class="line"> <span class="comment"># server squid1:3128;</span></span><br><span class="line"> <span class="comment"># server squid2:3128;</span></span><br><span class="line"> <span class="comment"># hash $request_uri;</span></span><br><span class="line"> <span class="comment"># hash_method crc32;</span></span><br><span class="line"> <span class="comment">#}</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#tips:</span></span><br><span class="line"> <span class="comment">#upstream bakend{#定义负载均衡设备的Ip及设备状态}{</span></span><br><span class="line"> <span class="comment"># ip_hash;</span></span><br><span class="line"> <span class="comment"># server 127.0.0.1:9090 down;</span></span><br><span class="line"> <span class="comment"># server 127.0.0.1:8080 weight=2;</span></span><br><span class="line"> <span class="comment"># server 127.0.0.1:6060;</span></span><br><span class="line"> <span class="comment"># server 127.0.0.1:7070 backup;</span></span><br><span class="line"> <span class="comment">#}</span></span><br><span class="line"> <span class="comment">#在需要使用负载均衡的server中增加 proxy_pass http://bakend/;</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#每个设备的状态设置为:</span></span><br><span class="line"> <span class="comment">#1.down表示单前的server暂时不参与负载</span></span><br><span class="line"> <span class="comment">#2.weight为weight越大,负载的权重就越大。</span></span><br><span class="line"> <span class="comment">#3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误</span></span><br><span class="line"> <span class="comment">#4.fail_timeout:max_fails次失败后,暂停的时间。</span></span><br><span class="line"> <span class="comment">#5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#nginx支持同时设置多组的负载均衡,用来给不用的server来使用。</span></span><br><span class="line"> <span class="comment">#client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug</span></span><br><span class="line"> <span class="comment">#client_body_temp_path设置记录文件的目录 可以设置最多3层目录</span></span><br><span class="line"> <span class="comment">#location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> <span class="comment">#虚拟主机的配置</span></span><br><span class="line"> server</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">#监听端口</span></span><br><span class="line"> listen 80;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#域名可以有多个,用空格隔开</span></span><br><span class="line"> server_name www.w3cschool.cn w3cschool.cn;</span><br><span class="line"> index index.html index.htm index.php;</span><br><span class="line"> root /data/www/w3cschool;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#对******进行负载均衡</span></span><br><span class="line"> location ~ .*.(php|php5)?$</span><br><span class="line"> {</span><br><span class="line"> fastcgi_pass 127.0.0.1:9000;</span><br><span class="line"> fastcgi_index index.php;</span><br><span class="line"> include fastcgi.conf;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#图片缓存时间设置</span></span><br><span class="line"> location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$</span><br><span class="line"> {</span><br><span class="line"> expires 10d;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#JS和CSS缓存时间设置</span></span><br><span class="line"> location ~ .*.(js|css)?$</span><br><span class="line"> {</span><br><span class="line"> expires 1h;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#日志格式设定</span></span><br><span class="line"> <span class="comment">#$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;</span></span><br><span class="line"> <span class="comment">#$remote_user:用来记录客户端用户名称;</span></span><br><span class="line"> <span class="comment">#$time_local: 用来记录访问时间与时区;</span></span><br><span class="line"> <span class="comment">#$request: 用来记录请求的url与http协议;</span></span><br><span class="line"> <span class="comment">#$status: 用来记录请求状态;成功是200,</span></span><br><span class="line"> <span class="comment">#$body_bytes_sent :记录发送给客户端文件主体内容大小;</span></span><br><span class="line"> <span class="comment">#$http_referer:用来记录从那个页面链接访问过来的;</span></span><br><span class="line"> <span class="comment">#$http_user_agent:记录客户浏览器的相关信息;</span></span><br><span class="line"> <span class="comment">#通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。</span></span><br><span class="line"> log_format access <span class="string">'$remote_addr - $remote_user [$time_local] "$request" '</span></span><br><span class="line"> <span class="string">'$status $body_bytes_sent "$http_referer" '</span></span><br><span class="line"> <span class="string">'"$http_user_agent" $http_x_forwarded_for'</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#定义本虚拟主机的访问日志</span></span><br><span class="line"> access_log /usr/local/nginx/logs/host.access.log main;</span><br><span class="line"> access_log /usr/local/nginx/logs/host.access.404.<span class="built_in">log</span> log404;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#对 "/" 启用反向代理</span></span><br><span class="line"> location / {</span><br><span class="line"> proxy_pass http://127.0.0.1:88;</span><br><span class="line"> proxy_redirect off;</span><br><span class="line"> proxy_set_header X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP</span></span><br><span class="line"> proxy_set_header X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#以下是一些反向代理的配置,可选。</span></span><br><span class="line"> proxy_set_header Host <span class="variable">$host</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#允许客户端请求的最大单文件字节数</span></span><br><span class="line"> client_max_body_size 10m;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#缓冲区代理缓冲用户端请求的最大字节数,</span></span><br><span class="line"> <span class="comment">#如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。</span></span><br><span class="line"> <span class="comment">#无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误</span></span><br><span class="line"> client_body_buffer_size 128k;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#表示使nginx阻止HTTP应答代码为400或者更高的应答。</span></span><br><span class="line"> proxy_intercept_errors on;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#后端服务器连接的超时时间_发起握手等候响应超时时间</span></span><br><span class="line"> <span class="comment">#nginx跟后端服务器连接超时时间(代理连接超时)</span></span><br><span class="line"> proxy_connect_timeout 90;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#后端服务器数据回传时间(代理发送超时)</span></span><br><span class="line"> <span class="comment">#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据</span></span><br><span class="line"> proxy_send_timeout 90;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#连接成功后,后端服务器响应时间(代理接收超时)</span></span><br><span class="line"> <span class="comment">#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)</span></span><br><span class="line"> proxy_read_timeout 90;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#设置代理服务器(nginx)保存用户头信息的缓冲区大小</span></span><br><span class="line"> <span class="comment">#设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小</span></span><br><span class="line"> proxy_buffer_size 4k;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#proxy_buffers缓冲区,网页平均在32k以下的设置</span></span><br><span class="line"> <span class="comment">#设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k</span></span><br><span class="line"> proxy_buffers 4 32k;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#高负荷下缓冲大小(proxy_buffers*2)</span></span><br><span class="line"> proxy_busy_buffers_size 64k;</span><br><span class="line"></span><br><span class="line"> <span class="comment">#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长</span></span><br><span class="line"> <span class="comment">#设定缓存文件夹大小,大于这个值,将从upstream服务器传</span></span><br><span class="line"> proxy_temp_file_write_size 64k;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> <span class="comment">#设定查看Nginx状态的地址</span></span><br><span class="line"> location /NginxStatus {</span><br><span class="line"> stub_status on;</span><br><span class="line"> access_log on;</span><br><span class="line"> auth_basic <span class="string">"NginxStatus"</span>;</span><br><span class="line"> auth_basic_user_file confpasswd;</span><br><span class="line"> <span class="comment">#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#本地动静分离反向代理配置</span></span><br><span class="line"> <span class="comment">#所有jsp的页面均交由tomcat或resin处理</span></span><br><span class="line"> location ~ .(jsp|jspx|<span class="keyword">do</span>)?$ {</span><br><span class="line"> proxy_set_header Host <span class="variable">$host</span>;</span><br><span class="line"> proxy_set_header X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line"> proxy_set_header X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line"> proxy_pass http://127.0.0.1:8080;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#所有静态文件由nginx直接读取不经过tomcat或resin</span></span><br><span class="line"> location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|</span><br><span class="line"> pdf|xls|mp3|wma)$</span><br><span class="line"> {</span><br><span class="line"> expires 15d; </span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> location ~ .*.(js|css)?$</span><br><span class="line"> {</span><br><span class="line"> expires 1h;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="comment">######Nginx配置文件nginx.conf中文详解#####</span></span><br></pre></td></tr></table></figure>
<p>作者:程序员自由之路</p>
<p>出处:<a href="https://www.cnblogs.com/54chensongxia/p/12938929.html">https://www.cnblogs.com/54chensongxia/p/12938929.html</a></p>
<p>版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。</p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>转载</tag>
<tag>nginx</tag>
</tags>
</entry>
<entry>
<title>nginx配置界面</title>
<url>/OLD_BLOG/2021/07/13/nginx%E9%85%8D%E7%BD%AE%E7%95%8C%E9%9D%A2/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于本博客使用的是hexo的配置环境,每次需要进行”三连“才可以部署,因此调试了一个服务器并且使用hexo-admin进行编写博客,本文仅介绍nginx的相关配置【注意:<strong>本文章只记录了相关调试方式,并没有搭建</strong>】</p>
<span id="more"></span>
<p>由于服务器采用的是CentOS的系统,因此仅代表该系统下进行调试成功</p>
<p>本篇博客在编写初期已经实现</p>
<ol>
<li>正常的网站访问(默认界面)</li>
<li>系统中安装拥有<code>locate</code> 、<code>vim</code>等相关基本命令</li>
</ol>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="nginx-conf文件介绍"><a href="#nginx-conf文件介绍" class="headerlink" title="nginx.conf文件介绍"></a>nginx.conf文件介绍</h2><p>由于在编写的时候发现了一篇比较好的,能够比较高级的讲解相关的配置方法,因此引用此文章</p>
<p><a href="https://www.cnblogs.com/54chensongxia/p/12938929.html">点我</a></p>
<p>此文章另会转载到本网站进行保存收录</p>
<h2 id="配置过程"><a href="#配置过程" class="headerlink" title="配置过程"></a>配置过程</h2><ol>
<li>首先我们需要查找配置文件的位置所在,使用<code>locate nginx.conf</code>进行查找相关位置,使用vim打开conf文件进行设置</li>
<li>之后我们需要更改网站的根目录,让其满足我们的需求。找到</li>
</ol>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">server { </span><br><span class="line">listen 127.0.0.1:80; </span><br><span class="line">server_name 你的域名信息;</span><br><span class="line">root /你的网站根目录; </span><br><span class="line">index index.php index.html index.htm;</span><br><span class="line">} </span><br></pre></td></tr></table></figure>
<p>修改 root的值,将你的网站根目录输入到此处</p>
<blockquote>
<p>网站根目录查询可以在有index.html的界面处,输入<code>pwd</code>来进行查询</p>
</blockquote>
<ol start="3">
<li>之后保存退出,重启nginx服务器即可</li>
</ol>
<blockquote>
<p>重启服务器指令:<code>cd /usr/sbin</code>–><code>./nginx</code>进行重启</p>
</blockquote>
<h1 id="相关错误"><a href="#相关错误" class="headerlink" title="相关错误"></a>相关错误</h1><h2 id="发现寻找不到nginx-pid"><a href="#发现寻找不到nginx-pid" class="headerlink" title="发现寻找不到nginx.pid"></a>发现寻找不到<code>nginx.pid</code></h2><p>这个就离谱,之前明明好好的,但是不知道为什么不可以了,这里有两个方法,网上大多类似(第二种好像我没有实现出来,因此采用第一种比较好)</p>
<h3 id="它没有,就给它创"><a href="#它没有,就给它创" class="headerlink" title="它没有,就给它创"></a>它没有,就给它创</h3><p>创建目录 <code>/var/run/nginx/ </code></p>
<p>就直接<code>cd /var/run</code>然后<code>ls</code>当前目录,发现莫得nginx这个文件夹,因此<code>mkdir nginx</code>,之后执行<code>nginx -s reload</code>,发现还不得,采用</p>
<p><code>cd /usr/sbin</code>–><code>./nginx</code>进行重启,之后就好了,神奇的事情2333</p>
<h3 id="修改-nginx-conf-文件,指定-pid文件-所在目录"><a href="#修改-nginx-conf-文件,指定-pid文件-所在目录" class="headerlink" title="修改 nginx.conf 文件,指定 pid文件 所在目录"></a>修改 <strong>nginx.conf</strong> 文件,指定 <strong>pid文件</strong> 所在目录</h3><ol>
<li>进入到配置文件中,解开pid前面的相关参数</li>
<li>并修改成为<code>pid /usr/local/nginx/logs/nginx.pid;</code></li>
<li>在 <code>/usr/local/nginx</code> 目录下创建 <strong>logs 目录</strong>:<code>mkdir /usr/local/nginx/logs</code></li>
<li>之后执行上步骤的重启便可以进行解决</li>
</ol>
<h2 id="发现访问的时候是403错误"><a href="#发现访问的时候是403错误" class="headerlink" title="发现访问的时候是403错误"></a>发现访问的时候是403错误</h2><p>403代表着访问错误,说明可能没有相关权限去进行访问,因此我们首先需要启动nginx,之后在命令行中输入<code>ps -ef | grep nginx</code>来查询相关nginx的服务项</p>
<p>发现我的用户名全是root,因此在nginx的配置文件的第一项将user的内容输入为root,否则即使配置了下面的相关权限,也会未必有用</p>
<p>之后输入<code>chmod 755 文件夹路径</code>来修改文件的配置权限</p>
<p>之后重启服务器,应该就得了</p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>nginx</tag>
</tags>
</entry>
<entry>
<title>此文章用于测试网站密码部分</title>
<url>/OLD_BLOG/2021/07/12/text/</url>
<content><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="好像密码不正确呢?再试试吧" data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
<script id="hbeData" type="hbeData" data-hmacdigest="2fdb0f6b858b9c02e36ec39ed1c586ae6037946b389b11b7b5c527a3d2370f2a">165d50f05814027fb7fe5e4ae8a088d8cabf1ea2d88ccf0f53dc7b0b289f3333fa6e7cbafdf3745db874905024d44b1cbbb59a175a69e9ef948cd6a0229125caa533180b66b24acfeed260595d55ec5d5492d9fbae1e361055ddd3984639752431cf8bc2ac4b012e3b5b7fb91e9ae439163f04a1bf7b63ac6242a70760a5aa9af48d3a9d65d6168caddd0159be43886f09237530382699b7cffbb4cbc8173253d25f81896da272ae0533169b3a64492793c12015118037458bd6d690214fc111e529c2da2b1095b16696a48d188d18d8b69b97fc3696b8ebc8ee75b888a2132a91f35c2f753c4479a7e16599822d42472c78015407d845d94fae7fe694bf01bd7b7ded2651aa3d010097b1ac19e8fa70</script>
<div class="hbe hbe-content">
<div class="hbe hbe-input hbe-input-wave">
<input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">
<label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">
<span class="hbe hbe-input-label-content hbe-input-label-content-wave">输入正确密码查看正确文章</span>
</label>
<svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">
<path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>
</svg>
</div>
</div>
</div>
<script data-pjax src="/OLD_BLOG/lib/hbe.js"></script><link href="/OLD_BLOG/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>有密码</tag>
</tags>
</entry>
<entry>
<title>ubuntu换源</title>
<url>/OLD_BLOG/2021/07/12/ubuntu%E6%8D%A2%E6%BA%90/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>本篇博客简单介绍一下如何对ubuntu进行换源操作</p>
<span id="more"></span>
<p>由于国内访问国外原因,因此有些时候官方源文件会出现获取不到现象,因此需要我们进行更换,将国外源文件更换为国内源文件</p>
<h1 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h1><p><a href="https://blog.csdn.net/weixin_43852091/article/details/105983547">ubuntu进行换源</a></p>
<h1 id="系统要求"><a href="#系统要求" class="headerlink" title="系统要求"></a>系统要求</h1><p>系统为Ubuntu20.04系统,如果系统不对,请自行去寻找系统所对应的源,否则会出现依赖问题</p>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="查看版本"><a href="#查看版本" class="headerlink" title="查看版本"></a>查看版本</h2><p>由于每个版本对应着不同的源,因此需要在换源之前查询自己的系统版本(盲目换源会出现依赖问题)<br>命令:<code> lsb_release -a</code><br>截图如下:<br><img src="https://cdn.jsdelivr.net/gh/ZHYCarge/photo/image-20210926132624046.png" alt="image-20210926132624046"></p>
<p>之后根据自己查询到的版本以及codename进行查找所需要的源</p>
<h2 id="备份"><a href="#备份" class="headerlink" title="备份"></a>备份</h2><p>为了防止操作出错,因此我们需要先备份一下之前的源<br><code>sudo cp /etc/apt/sources.list /etc/apt/sources.list.back</code></p>
<h2 id="更换"><a href="#更换" class="headerlink" title="更换"></a>更换</h2><ol>
<li><p>使用vim进行修改下载源</p>
<p><code>sudo vi /etc/apt/sources.list</code></p>
</li>
<li><p>将里面的内容全部删除(输入<code>dd</code>来删除当前行)或者进行注释</p>
</li>
<li><p>将以下内容输入到文件中(使用<code>i</code>进行编辑,按<kbd>Esc</kbd>并且输入<code>:wq</code>进行保存并退出)</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">#清华源</span></span><br><span class="line"><span class="comment"># 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse</span></span><br><span class="line"><span class="comment"># 预发布软件源,不建议启用,也可取消注释</span></span><br><span class="line"><span class="comment"># deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse</span></span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li>
</ol>
<h2 id="结束"><a href="#结束" class="headerlink" title="结束"></a>结束</h2><p>使用以下命令进行更新apt库文件</p>
<figure class="highlight ebnf"><table><tr><td class="code"><pre><span class="line"><span class="attribute">apt update</span></span><br><span class="line"><span class="attribute">apt upgrade</span></span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>linux</category>
</categories>
<tags>
<tag>study</tag>
</tags>
</entry>
<entry>
<title>一点感想</title>
<url>/OLD_BLOG/2021/07/12/%E4%B8%80%E7%82%B9%E6%84%9F%E6%83%B3/</url>
<content><![CDATA[<p>本博客搭建于2021-7-12日,耗时一天完成,作为一个小型博客,主要作用于个人的博客撰写以及记录一些事情吧,弃用csdn ing</p>
]]></content>
<tags>
<tag>about</tag>
</tags>
</entry>
<entry>
<title>使用excel的函数来对数据进行匹配</title>
<url>/OLD_BLOG/2021/07/12/%E4%BD%BF%E7%94%A8excel%E7%9A%84%E5%87%BD%E6%95%B0%E6%9D%A5%E5%AF%B9%E6%95%B0%E6%8D%AE%E8%BF%9B%E8%A1%8C%E5%8C%B9%E9%85%8D/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>使用excel中我们会遇到许许多多的问题,下面介绍如何通过公式来匹配相关数据,简化工作流程</p>
<span id="more"></span>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><p><img src="https://img-blog.csdnimg.cn/20210630211352686.png" alt="123"><br>左侧为元数据,右侧为待匹配数据<br>1.<br>在待匹配数据中输入<code>=vl</code>,选择vloop函数<br><img src="https://img-blog.csdnimg.cn/20210630211456979.png" alt="122"></p>
<p>2.在函数中首先选中需要匹配的数据,及后面的姓名行(一个就可)<br><img src="https://img-blog.csdnimg.cn/20210630211533976.png" alt="12"><br>3.之后选择要进行匹配的序列,记得要绝对引用,使用$来进行固定引用单元格<br><img src="https://img-blog.csdnimg.cn/20210630211647883.png" alt="122"><br>4.之后输入2,因为要获取的内容是成绩类,在所需筛选的区域的第二列<br><img src="https://img-blog.csdnimg.cn/20210630211733441.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIWUNhcmdl,size_16,color_FFFFFF,t_70" alt="23"><br>5.之后输入<code>)</code>就好,最后一项可以不用管<br><img src="https://img-blog.csdnimg.cn/20210630211906559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIWUNhcmdl,size_16,color_FFFFFF,t_70" alt="2223"></p>
<p>PS:如果需要管,会提示输入TRUE或者FALSE,根据情况选择就好<br><img src="https://img-blog.csdnimg.cn/20210630211834382.png" alt="234"><br>6.之后下拉单元格便可以完成匹配,如果没有匹配到就证明是未成功</p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>excel</tag>
</tags>
</entry>
<entry>
<title>如何使用esp8266</title>
<url>/OLD_BLOG/2021/07/14/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8esp8266/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>安装完成之后,就开始编写程序了,如51点亮第一个流水灯为例,本次尝试使用esp8266的相关模块,让其创建一个局域网</p>
<span id="more"></span>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="代码编写"><a href="#代码编写" class="headerlink" title="代码编写"></a>代码编写</h2><p>以太极创客的实例代码为例:</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">NodeMCU接入点模式</span></span><br><span class="line"><span class="comment">By 太极创客(http://www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">2019-03-11</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">此程序用于演示如何将NodeMCU以接入点模式工作。通过此程序,您可以使用</span></span><br><span class="line"><span class="comment">电脑或者手机连接NodeMCU所建立WiFi网络。</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">网络名: taichi-maker</span></span><br><span class="line"><span class="comment">密码:12345678</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">如需获得更多关于如何使用NodeMCU开发物联网的教程和资料信息</span></span><br><span class="line"><span class="comment">请参考太极创客网站(http://www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">并在首页搜索栏中搜索关键字:物联网</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFi.h></span> <span class="comment">// 本程序使用ESP8266WiFi库</span></span></span><br><span class="line"> </span><br><span class="line"><span class="type">const</span> <span class="type">char</span> *ssid = <span class="string">"taichi-maker"</span>; <span class="comment">// 这里定义将要建立的WiFi名称。此处以"taichi-maker"为示例</span></span><br><span class="line"> <span class="comment">// 您可以将自己想要建立的WiFi名称填写入此处的双引号中</span></span><br><span class="line"> </span><br><span class="line"><span class="type">const</span> <span class="type">char</span> *password = <span class="string">"12345678"</span>; <span class="comment">// 这里定义将要建立的WiFi密码。此处以12345678为示例</span></span><br><span class="line"> <span class="comment">// 您可以将自己想要使用的WiFi密码放入引号内</span></span><br><span class="line"> <span class="comment">// 如果建立的WiFi不要密码,则在双引号内不要填入任何信息</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span> {</span><br><span class="line"> Serial.begin(<span class="number">9600</span>); <span class="comment">// 启动串口通讯</span></span><br><span class="line"> </span><br><span class="line"> WiFi.softAP(ssid, password); <span class="comment">// 此语句是重点。WiFi.softAP用于启动NodeMCU的AP模式。</span></span><br><span class="line"> <span class="comment">// 括号中有两个参数,ssid是WiFi名。password是WiFi密码。</span></span><br><span class="line"> <span class="comment">// 这两个参数具体内容在setup函数之前的位置进行定义。</span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> Serial.print(<span class="string">"Access Point: "</span>); <span class="comment">// 通过串口监视器输出信息</span></span><br><span class="line"> Serial.println(ssid); <span class="comment">// 告知用户NodeMCU所建立的WiFi名</span></span><br><span class="line"> Serial.print(<span class="string">"IP address: "</span>); <span class="comment">// 以及NodeMCU的IP地址</span></span><br><span class="line"> Serial.println(WiFi.softAPIP()); <span class="comment">// 通过调用WiFi.softAPIP()可以得到NodeMCU的IP地址</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span> { </span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="安装相关库"><a href="#安装相关库" class="headerlink" title="安装相关库"></a>安装相关库</h2><p>进行编译的话我们需要安装支持相关编程的库文件:点击<kbd>工具</kbd>—><kbd>管理库</kbd>—>搜索<code>esp8266wifi</code>—>点击安装便可以</p>
<p><img src="/images/pasted-18.png" alt="upload successful"></p>
<p><img src="/images/pasted-19.png" alt="upload successful"></p>
<p><img src="/images/pasted-21.png" alt="upload successful"></p>
<p>之后我们需要选择芯片的指定型号,由于我使用的是<code>ESP-12F</code>的芯片,因此选择</p>
<p><img src="/images/pasted-24.png" alt="upload successful"></p>
<h2 id="将esp8266接入你的电脑"><a href="#将esp8266接入你的电脑" class="headerlink" title="将esp8266接入你的电脑"></a>将esp8266接入你的电脑</h2><p>与51芯片不同,接入芯片只需要一根能传输数据的<code>miro-usb</code>便可以进行实现,因此只需要找一个线将它与你电脑相连便可以了</p>
<h2 id="选择正确的端口号"><a href="#选择正确的端口号" class="headerlink" title="选择正确的端口号"></a>选择正确的端口号</h2><p>由于硬件需要选择端口来对硬件进行烧录,查找端口号的操作步骤为:右键<kbd>此电脑</kbd>—><kbd>管理</kbd>—><kbd>设备管理器</kbd>—><kbd>端口(COM和LPT)</kbd>,查找有无CH340接口,并确定它所对应的端口号</p>
<h2 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h2><p>当代码一切正常的时候,你会在控制台得到一串信息,同时,再wifi处可以发现一个热点</p>
<p><img src="/images/pasted-25.png" alt="upload successful"></p>
<p><img src="/images/pasted-26.png" alt="upload successful"></p>
<p><img src="/images/pasted-27.png" alt="upload successful"></p>
<h1 id="产生错误"><a href="#产生错误" class="headerlink" title="产生错误"></a>产生错误</h1><h2 id="显示找不到库"><a href="#显示找不到库" class="headerlink" title="显示找不到库"></a>显示找不到库</h2><p><img src="/images/pasted-17.png" alt="upload successful"></p>
<p>尝试顺便安装下面的这两个库文件</p>
<p><img src="/images/pasted-22.png" alt="upload successful"></p>
<p><img src="/images/pasted-23.png" alt="upload successful"></p>
<p>如果还出现了错误,不妨检查一下,有没有选择正确的开发板。。。</p>
<h2 id="发现什么都没有输出"><a href="#发现什么都没有输出" class="headerlink" title="发现什么都没有输出"></a>发现什么都没有输出</h2><p>有可能是版本问题,其次上文代码只会再连接成功的时候输出一遍,因此有些高版本可能不允许一边打开串口监视器一边上传代码,因此导致代码运行时并未启动监控<br><strong>建议:<code>按esp8266的Rst键</code></strong></p>
<h1 id="尾言"><a href="#尾言" class="headerlink" title="尾言"></a>尾言</h1><p>硬件的开发总是与软件有着些许不同,也许你的程序再今天可以跑起来,但是不代表明天甚至下一刻可以使用,也许,这就是硬件的奥秘吧</p>
]]></content>
<categories>
<category>study</category>
<category>硬件</category>
</categories>
<tags>
<tag>esp8266</tag>
</tags>
</entry>
<entry>
<title>如何使用php进行上传文件</title>
<url>/OLD_BLOG/2021/07/12/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8php%E8%BF%9B%E8%A1%8C%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于需要设置提交报告,因此需要写一个提交模板</p>
<span id="more"></span>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="设置php-ini以及相关参数讲解"><a href="#设置php-ini以及相关参数讲解" class="headerlink" title="设置php.ini以及相关参数讲解"></a>设置php.ini以及相关参数讲解</h2><p>与网上大部分内容一样,需要对php.ini的内容进行修改<br>我们可以通过使用<code>locate php.ini</code>对此文件进行查找定位(如果没有请安装locate服务)<br>内容修改如下:</p>
<ul>
<li> file_uploads= On<br>(开启php文件上传功能)</li>
<li>upload_tmp_dir =<br>(开启临时存放位置,若此项为空,则为系统默认位置)</li>
<li>upload_max_filesize = 2M<br>(设置最大上传文件大小,默认为2M)<blockquote>
<p>请注意:该选项与下面的选项息息相关,如果下面没有修改,修改上面也没有用</p>
</blockquote>
</li>
<li>post_max_size = 8M<br>(设置post表单最大提交大小,<strong>要和上面的一起设置</strong> 此大小要大于上面的大小,否则容易上传空文件上来)</li>
<li>post_max_size = 100M<br>(如果启用了内存限制,则应该小于这个值【俺没用过】)</li>
<li>max_execution_time=30<br>(每个php脚本最大的运行时间,默认为30s)</li>
<li>max_input_time = 60<br>(设置php解析文件所需要的时间,若上传文件为大文件的时候,应将此项内容修改长一点,如果设置为0,则代表无限制)</li>
<li>memory_limit = 128M<br>(设置每个php脚本使用内存的最大容量,如果脚本过于垃圾,则可以限制它,防止影响其他程序,若设置为-1则代表无限制)<h2 id="上传文件参数解释"><a href="#上传文件参数解释" class="headerlink" title="上传文件参数解释"></a>上传文件参数解释</h2>当使用php上传文件时,<code>$_FILES[‘filename’]</code>则是php返回的关于上传文件的一串参数值,以下是具体解释</li>
<li><code>[‘name’]</code> 代表的是上传文件的文件名称</li>
<li><code>[‘type’] </code>文件类型,即doc文件、jpg文件,ppt文件等</li>
<li><code> [‘tmp_name’]</code>如果相关参数没有问题,文件则会被上传到临时存放位置,如上面设置的文件存放点或者是系统默认的存放位置,并在此处会返回文件的存放路径以及临时存放名称 </li>
<li><code>[‘error’] </code>如果相关参数设置没有问题,则不会产生报错,即error=0</li>
<li><code> [‘size’]</code>文件大小,代表着这个文件有多大</li>
</ul>
<h1 id="相关错误解释"><a href="#相关错误解释" class="headerlink" title="相关错误解释"></a>相关错误解释</h1><h2 id="如果发现临时文件没有内容但是一切正常不报错"><a href="#如果发现临时文件没有内容但是一切正常不报错" class="headerlink" title="如果发现临时文件没有内容但是一切正常不报错"></a>如果发现临时文件没有内容但是一切正常不报错</h2><p>这个问题是最苟的,因为不报错,所以有很多情况,其中我只讨论与我遇到的(写博客原因)</p>
<ul>
<li>请检查是否给予权限<br>网页以及php的权限基本上都是www-data,但是你的文件夹是root的,因此可能会出现无权操作文件的情况出现,因此我们可以在你设置的临时文件夹以及文件最后的存储位置,使用<br><code>sudo -u www-data touch 123</code>命令来查询是否具有权限创建文件,若发现没有,则需要使用<code>chown www-data:www-data -R '你所要赋予权限的文件夹'</code>进行赋予相关权限(如果显示权限不够加sudo或者使用root用户进行操作)<h2 id="如果发现临时文件存放位置为空"><a href="#如果发现临时文件存放位置为空" class="headerlink" title="如果发现临时文件存放位置为空"></a>如果发现临时文件存放位置为空</h2>一般来讲那就证明文件无法存放在相关位置,请检查文件大小是否超出php.ini中的设置,如果确实超过了,则需要对其进行更改</li>
</ul>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>php</tag>
</tags>
</entry>
<entry>
<title>如何搭建一个自己的个人博客(以此平台为例)</title>
<url>/OLD_BLOG/2021/07/12/%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2-%E4%BB%A5%E6%AD%A4%E5%B9%B3%E5%8F%B0%E4%B8%BA%E4%BE%8B/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>纪念一下这个博客的产生以及相关搭建问题的记录,其次<br><strong>正经人谁用csdn写博客呢?</strong></p>
<span id="more"></span>
<h1 id="搭建过程"><a href="#搭建过程" class="headerlink" title="搭建过程"></a>搭建过程</h1><h2 id="搭建准备"><a href="#搭建准备" class="headerlink" title="搭建准备"></a>搭建准备</h2><p>前期,我们需要准备并确保以下内容:</p>
<ul>
<li>git<br>作为一个版本控制软件,我们需要它对我们的博客进行管理,其次,由于本博客运行在github上,我们也需要将博客上载到github上,所以在某些方面而言,git也是很重要的,因此,我们可以使用命令<br><code> sudo pacman -S git</code><br>(arch的包管理器,如果是别的系统,可以去寻找对应系统的包管理器进行安装)进行安装,安装完成之后,使用<code>git -v</code>检查git版本</li>
<li>node.js<br>与git的安装方式一样,在终端输入<code>sudo pacman -S npm</code>进行安装,由于安装npm包管理器时,会自动安装node这个软件,因此运行一次就好(仅在arch中实验过,其他系统不确定),安装完成之后,输入<code>node -v</code>与<code>npm -v</code>来查看版本。 </li>
</ul>
<p><strong>需注意:</strong>node.js版本必须要求在 10.13及以上,如版本过于低,则有些java语句将无法使用,导致后续编译出错</p>
<ul>
<li>有一个github账户(可选)<br>如果你拥有一个github账户,那么你可以在后续部署中,将此博客托管到github上进行管理,让更多的人可以看见<h2 id="hexo的初始化"><a href="#hexo的初始化" class="headerlink" title="hexo的初始化"></a>hexo的初始化</h2></li>
</ul>
<p>1.由于hexo使用的是npm包管理器进行安装,因此我们可以输入<code>npm install -g hexo-cli</code>来安装hexo,其中npm的<code>-g</code>参数,代表着此软件全局安装,如果你对相关管理足够了解,你也可以采用<code>npm install hexo</code>来进行局部hexo的安装<br>2.等待安装完成之后,我们输入<code>hexo -v</code> 来查看是否报错以及相关软件是否安装成功<br>3.之后我们进入到想要创建博客的目录下,输入<code>hexo init myblogs</code>来对博客根目录进行初始化操作<br>4.然后<code>cd myblogs</code> 之后输入<code>npm install </code>进行相关包的补充(这里仍待研究<br>之后我们便将一个小型博客搭建完成,输入<code>hexo g & hexo s</code>等待片刻之后在浏览器中输入<code>localhost:4000</code>便可以查看一下初始博客了~</p>
<h1 id="相关指令"><a href="#相关指令" class="headerlink" title="相关指令"></a>相关指令</h1><ul>
<li><code>hexo clean</code>或<code>hexo c</code> 与清除浏览器记录一样 </li>
<li><code>hexo g</code> 重新渲染静态网页 </li>
<li><code>hexo d</code> 将代码上载到相关代码托管平台</li>
<li><code>hexo s</code> 启动本地的hexo网站模块<h1 id="与github的梦幻联动"><a href="#与github的梦幻联动" class="headerlink" title="与github的梦幻联动"></a>与github的梦幻联动</h1>由于hexo是静态页面加载,符合github page的相关规定,因此我们可以将网站上载到github上。 </li>
</ul>
<p>1.我们需要有一个github的相关帐号以及绑定ssh密钥,相关操作已经在其他博客写有,本篇不再讨论<br>2.在github上创建一个仓库,名称填写为<code>你的用户名.github.io</code><br>例如: </p>
<p><img src="/images/pasted-0.png" alt="upload successful"><br>3.修改在网站根目录下的<code>_config.yml</code>文件,找到<code>deploy</code>部分,更改为: </p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">deploy:</span><br><span class="line"> <span class="built_in">type</span>: git</span><br><span class="line"> repo: 此处填写git仓库地址</span><br><span class="line"> branch: master</span><br></pre></td></tr></table></figure>
<p>4.之后安装<code>npm install hexo-deployer-git --save</code> 来实现hexo同步github等相关平台<br>5.之后运行<code>hexo clean & hexo generate & hexo deploy</code> 等代码运行完成之后,就会发现在仓库中多了一些东西<br>6.找到在github上的仓库位置,点击<kbd>settings</kbd>–><kbd>Pages</kbd>然后修改配置如下:</p>
<p><img src="/images/pasted-1.png" alt="upload successful"><br>由于我写入的是main,因此在branch中选择的是main,按正常情况而言默认都是master<br>至此,等待片刻,刷新该界面,当出现上图绿色的时候,便可以点击链接访问你的网站</p>
<h1 id="出现错误汇总"><a href="#出现错误汇总" class="headerlink" title="出现错误汇总"></a>出现错误汇总</h1><h2 id="文件下载有问题,出现错误"><a href="#文件下载有问题,出现错误" class="headerlink" title="文件下载有问题,出现错误"></a>文件下载有问题,出现错误</h2><p>由于国内网络原因,下载国外的东西可能会出现错误,因此需要短暂换源,参考如下:<br>输入:<br><code>npm config set registry https://registry.npm.taobao.org</code><br> <code>npm info underscore</code><br> 之后可以使用,但由于博客服务器在海外,因此没有实验过此代码</p>
<h2 id="搭建完成之后输入localhost-4000报错"><a href="#搭建完成之后输入localhost-4000报错" class="headerlink" title="搭建完成之后输入localhost:4000报错"></a>搭建完成之后输入<code>localhost:4000</code>报错</h2><p>很有可能是你的端口号被占用了,因此需要更改你的相关端口,不过我没遇到过,随便找了一个解决方案: </p>
<blockquote>
<p>可以修改在网站根目录下的<code>_config.yml</code>文件的运行端口号,如需更改成4001,代码如下:</p>
</blockquote>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">server:</span><br><span class="line"> port: 4001</span><br><span class="line"> compress: <span class="literal">true</span></span><br><span class="line"> header: <span class="literal">true</span></span><br></pre></td></tr></table></figure>
<h1 id="为什么使用hexo?"><a href="#为什么使用hexo?" class="headerlink" title="为什么使用hexo?"></a>为什么使用hexo?</h1><p>因为hexo相对于其他平台而言,比较老,并且教程相关完善,虽然需要对代码以及相关程序基础有一定了解,但是其环境在所有静态网站来讲已经相当不错,毕竟不想挂服务器花钱。 极客风还是阔以的,但是对于此类平台来讲,还是仍有些许缺点,比如无法及时有效的编写博客,修改较为困难,等</p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>Hexo</tag>
</tags>
</entry>
<entry>
<title>尝试使用github替我一次三连</title>
<url>/OLD_BLOG/2021/07/13/%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8github%E6%9B%BF%E6%88%91%E4%B8%80%E6%AC%A1%E4%B8%89%E8%BF%9E/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于Hexo的平台效果编辑后冗余度及其高,并且编写文件比较繁琐困难,因此考虑将相关内容直接部署到<code>GitHub</code>中,方便后续的代码编写操作</p>
<span id="more"></span>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="另建立一个私有仓库"><a href="#另建立一个私有仓库" class="headerlink" title="另建立一个私有仓库"></a>另建立一个私有仓库</h2><p>由于方法是通过使用github action 来帮助进行管理的,因此我们要将自己的源码放置到github的私有仓库上进行管理<br>因此在博客根目录下创建一个git仓库,并将所有代码上传到github的私人仓库中进行保存<br><strong>请注意:要将主题中的git配置文件全部删除,并且如果之前有构建过上传过代码的,要将其中的所有关于git文件全部删除,否则会上传失败例如:’.git .develp_git’等</strong></p>
<h2 id="保存我们的公私钥"><a href="#保存我们的公私钥" class="headerlink" title="保存我们的公私钥"></a>保存我们的公私钥</h2><p>我们可以通过访问<code>~/.ssh</code>这个文件夹进行获取到我们的公私钥。其中公钥放置到自身的ssh钥匙中,私钥放置到私有仓库的密码中,并进行命名(请注意你的命名,会影响到后续的文件流的生成)<br><strong>请注意:私钥有相关文件描述,一定要将东西全部复制完毕,否则会产生报错</strong></p>
<h2 id="创建github-action的相关文件流"><a href="#创建github-action的相关文件流" class="headerlink" title="创建github action的相关文件流"></a>创建github action的相关文件流</h2><p>进入到私有仓库中,点击action,之后创建一个文件流,输入以下代码</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">name: Deploy Blog</span><br><span class="line"></span><br><span class="line">on: [push] <span class="comment"># 当有新push时运行</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">jobs</span>:</span><br><span class="line"> build: <span class="comment"># 一项叫做build的任务</span></span><br><span class="line"></span><br><span class="line"> runs-on: ubuntu-latest <span class="comment"># 在最新版的Ubuntu系统下运行</span></span><br><span class="line"> </span><br><span class="line"> steps:</span><br><span class="line"> - name: Checkout <span class="comment"># 将仓库内master分支的内容下载到工作目录</span></span><br><span class="line"> uses: actions/checkout@v1 <span class="comment"># 脚本来自 https://github.com/actions/checkout</span></span><br><span class="line"> </span><br><span class="line"> - name: Use Node.js 16.x <span class="comment"># 配置Node环境</span></span><br><span class="line"> uses: actions/setup-node@v1 <span class="comment"># 配置脚本来自 https://github.com/actions/setup-node</span></span><br><span class="line"> with:</span><br><span class="line"> node-version: <span class="string">"16.x"</span></span><br><span class="line"> </span><br><span class="line"> - name: Setup Hexo <span class="built_in">env</span></span><br><span class="line"> <span class="built_in">env</span>:</span><br><span class="line"> ACTION_DEPLOY_KEY: <span class="variable">${{ secrets.ACTION_DEPLOY_KEY }</span>}</span><br><span class="line"> run: |</span><br><span class="line"> <span class="comment"># set up private key for deploy</span></span><br><span class="line"> <span class="built_in">mkdir</span> -p ~/.ssh/</span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"<span class="variable">$ACTION_DEPLOY_KEY</span>"</span> | <span class="built_in">tr</span> -d <span class="string">'\r'</span> > ~/.ssh/id_rsa <span class="comment"># 配置秘钥</span></span><br><span class="line"> <span class="built_in">chmod</span> 600 ~/.ssh/id_rsa</span><br><span class="line"> ssh-keyscan github.com >> ~/.ssh/known_hosts</span><br><span class="line"> <span class="comment"># set git infomation</span></span><br><span class="line"> git config --global user.name <span class="string">'你的名字'</span> <span class="comment"># 换成你自己的邮箱和名字</span></span><br><span class="line"> git config --global user.email <span class="string">'你的邮箱'</span></span><br><span class="line"> <span class="comment"># install dependencies</span></span><br><span class="line"> npm i -g hexo-cli <span class="comment"># 安装hexo</span></span><br><span class="line"> npm i</span><br><span class="line"> </span><br><span class="line"> - name: Deploy</span><br><span class="line"> run: |</span><br><span class="line"> <span class="comment"># publish</span></span><br><span class="line"> hexo generate && hexo deploy <span class="comment"># 执行部署程序</span></span><br></pre></td></tr></table></figure>
<p>以上代码参考别人得出,相关源文件已无从得出,如有侵权请联系我 </p>
<blockquote>
<p>Node环境要以大环境为主,比如这个之前的代码是10一下的,但是Hexo显然不支持10了,因此对此需要修改到16</p>
</blockquote>
<h2 id="实验"><a href="#实验" class="headerlink" title="实验"></a>实验</h2><p>让我们在源文件的<code>source/_posts/</code>里面创建一个md文件,之后输入需要用到的相关内容(具体可以参考里面其他的md文件<br>之后将文件提交,看看action是否有变化,后面发现有变化,因此配置成功,等一下刷新一下网站便可以 </p>
<h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>后面我看很多博主都有在线修改文章的功能,当时很懵,看了很多人的博客介绍,但是并没有找到自己所找到的东西,后面翻<a href="https://theme-next.js.org/docs/theme-settings/posts">next的配置文档</a>发现其实在next的主题文件中已经包含了关于在线修改文件的配置,经过修改配置文件的</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">post_edit:</span><br><span class="line"> <span class="built_in">enable</span>: <span class="literal">true</span></span><br></pre></td></tr></table></figure>
<p>之后将自己的url填写在里面,便可以实现此功能<br>如有其他问题,请在下方留言</p>
]]></content>
<categories>
<category>Study</category>
</categories>
<tags>
<tag>Github Actions</tag>
<tag>Hexo</tag>
</tags>
</entry>
<entry>
<title>操作系统之重定位</title>
<url>/OLD_BLOG/2021/07/12/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E4%B9%8B%E9%87%8D%E5%AE%9A%E4%BD%8D/</url>
<content><![CDATA[<h1 id="本文为转载"><a href="#本文为转载" class="headerlink" title="本文为转载"></a>本文为转载</h1><p>版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。<br>本文链接:<a href="https://blog.csdn.net/sunjinbat/article/details/80571241">https://blog.csdn.net/sunjinbat/article/details/80571241</a><br>————————————————<br>版权声明:本文为CSDN博主「codedrinker」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。<br>原文链接:<a href="https://blog.csdn.net/sunjinbat/article/details/80571241">https://blog.csdn.net/sunjinbat/article/details/80571241</a></p>
<span id="more"></span>
<h1 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h1><p>区别这两个概念之前,要知道 重定位 的概念。</p>
<p>重定位,通常来说把在装入时对目标程序中指令和数据地址修改的过程称为重定位。</p>
<p>而静态重定位就是,在逻辑地址转换为物理地址的过程中,地址变换是在进程装入时一次完成的,以后不再改变。</p>
<p>优点:是无需增加硬件地址转换机构,便于实现程序的静态连接。在早期计算机系统中大多采用这种方案。 </p>
<p>缺点:内存空间不能移动;各个用户进程很难共享内存中同一程序的副本</p>
<p>动态重定位:动态运行的装入程序把转入模块装入内存之后,并不立即把装入模块的逻辑地址进行转换,而是把这</p>
<p>种地址转换推迟到程序执行时才进行,装入内存后的所有地址都仍是逻辑地址。这种方式需要寄存器的支持,其中</p>
<p>放有当前正在执行的程序在内存空间中的起始地址。</p>
<p>优点:内存空间可以移动;各个用户进程可以共享内存中同一程序的副本。</p>
<p>缺点:增加了机器成本,而且实现存储管理的软件算法比较复杂。<br>————————————————<br>版权声明:本文为CSDN博主「codedrinker」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。<br>原文链接:<a href="https://blog.csdn.net/sunjinbat/article/details/80571241">https://blog.csdn.net/sunjinbat/article/details/80571241</a></p>
]]></content>
<categories>
<category>学校课程</category>
</categories>
<tags>
<tag>转载</tag>
<tag>操作系统</tag>
</tags>
</entry>
<entry>
<title>近日小记(2022-5-19)</title>
<url>/OLD_BLOG/2022/05/19/2022-5-19%E8%BF%91%E6%9C%9F%E5%B0%8F%E4%BA%8B/</url>
<content><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="好像密码不正确呢?再试试吧" data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
<script id="hbeData" type="hbeData" data-hmacdigest="27414a7b98ceb497efc6255d099b4f1e3c2a369cc740bad63eea01846a5f0c77">4630436162ade97ba2718b7d0c4b3b63cb3a3f659c5ca08b4bca0f584592818641b49054f4424d6eaa072c3306d840e4975cba159072463d0b294b5cd2cd901a2a9bc920fdacaf2d96b572471462444dcbdcc85eddb1c09ce3d9a4f9ad8989dcadcac8fd64a1b05a9003290fe28caf8db154ffbfd9a91858d42106081f66499eaef2083ce97e5bc12ad8b8decf8db62520a3d0cf23ad0a8a27564e4ccdd4d18f2e5d9d64e7d9fad9d1f4cb0ae9b88b2054b0954a8255cc8b39c51a103e94e7096383c34b3fce029140a7760fd79caa56b43c504e89756a6895d4792d31f923bfa28bfb793059ad47738a555ee2bb4593ec24b903b832eb582edefad57523c69d8efa0feb02cdd8fade6f854dc5be7a68469b8b3f4f91907459e77176fe0cc07e35b09443e710bc86d71c6ea89bf92461a82cff5cce69f39f317ebf76bcb098d880c4a7f39b8ddd91005d380ef4f9987e7bd74f60d6b946c17229d0c04fbf68e5a038ba2999dff2150dc9a3b96dd56e49232d0deddfc8d39d7b3f550247f6ab61d583f85146426728b6b00aba1c8fb3dba7bc778aed61450c9c7ce076586add3bae6a2030ea8fe5a2585256daa6f75c520fd477ae781268a21adf3bcf92756974affea5091404778c147815ecccc710942fd371075f0d4ec9c9edfd310ced10eee54a7d9dcf745882ba0a8a77c571a3035d3e785693627af7393264bb389af657a2b532861ad1afee5b2413ec496428d897bb6d98600351ac3b475bf8997ca374ffc0f0aa167c7321c74c0e05ea5f2035233f0e1e547cffb8b63f684e60494d95211c342def01a411466435a0e9d95ad27aecff977000da126e34aaaea551431fc5851215de1cface029d44d6939c297422bdbbd627ad0bd7eb42f83697ae8c88ba6fae499f420500e7caa95bbdf39d928fd9cfdc4f56dae95b84717ed3e9a039e49aaf78432d3a5127b3269b15231e7d5fbbd793014653f6ea318073705d6ab8bfce7caac8883cb649d43ff9eae92ff3efbb80d126514952619365542f992f5eb0de08ef2d8f1a8b8d7a86f0b0ef0b05d282c7b46db02ac32241d646b405f60a7889c6801cd0bc9ce7a60dfc71f13ed073d893694a0ab0da4e8c5794851b37c5c547d3798c5fe3a107cb3e130a14f7e115e643ca442a742fd13bca5f09afc72db9ae5a6235b393fffb1a67b498fdd573014518eacb312d4212bb4f7a69107da2e347bece1b9ed8d2ac0be8bad7bb2b4e8d096f6f5640c56b8750559fb6b92aa2e8241bae175268321018409202e59bea9bd993d2f91d9162ff9d36ba4669c1a0cf90316e1cd041c9fb08b0448d2c35e8cb4b04ae272f438a750f4b0ea6c735792e0a4e0950f0b76cc2d9c8f6b764b5f6a4b08ca598d54d247ff5b6df053744b6768b11023155c66c9d3371ea32a32975a3e6b3621b5d9e6aadc670cd37e24019daa7e63feda7a655059966eaf58dfd65fbf34b78c86fc3d899a8d4900e0b6d902623fa5ce4141a5db743e94fb881d567950ae35886d52d8585395714e8b47d57b7887a351bf42469dc39d55be6e4866a94ac246ff321dddbc4995e0164929029f2b49a900d8432dd8afc55cac847429a0a0414ff2b40b223efbb61865215f3f04f2e35ef6505e93fb1030953342c053c32e9d82a69e03c735b04bdf175f2b615c055fe4a22999f48dc7469e73f05aa62b01872e2899eec384b1ed310b36a709834086169e8800dfd369228464fd833e55847c458c9ae4945bdea82d2350352f090db08cb6f15c1a0797ef45ecf216570c58738380d7c69cde6137640c7e01fe1eaf91e889bc7ca7b47d0472a453835cde8a2fc564317a5916588a64f097b86c62ce68102403ca28f2bc376fb665c191af1d62c005e9423b5132fc549fedcbde5c85b4b7d9648d325094ba77811a84ea079bb24c0b71299a4fb30eb117cd11850eafdbea3cdca75c7789c236f51a6707f0bb20c6be4036fcd47edcfa76f6bd223e1c04263e45a966824092968c88b61dc429240a79d42dfcaf95adb3a8df38d26bcdcdfa598dc6f3a4111cd110c98b94db222853fe71891c7b3d2c3e00f9c1287a73e767e17c4c769bacb695607660791cd8e28b716c160dbc13c8e7280c59f778dd6f9c9d47cac02fcbfdab6d02a1fc43cd4d4157104d596eb601c324ae0f6e6d92f2dbe9779a5d0f7bc1004a884b12aad480783bc3525f279ae430c17f9538839bcb9c556d970455d71c2a30d4c797586b7973c4a1a0f3d721c35cc7996b7059ec609a1f5e53e90078d0b7c54d45c65dac45acb92a903471d96c27f0c513279bdc301b8115ddf08640af093ace53b6e2bdcd09179c0b0ff5fdcd170824335aa7980bbba84d6ac34439bf8834ac428f837b813a98d11096a7f55c63bff458339730b66b8d5ed9282f371836f6db20590b55f33ac97359c1bb5acf54cf7034a8201d6259b9bf630a3b47d352e7d030882cc79492ff32a5706674124d62e595429854686bba0674ce5f33e31a07e1b56550570ca6df4a9c7e2f02018b1675c292bb9880669dbf94312bc9569ab0795db29fa54c49759962e4f44a30f414f5578134b0abb40e5b53327eef51dfab9effbf8c5003108ffdad0b7842d594a6d4beae0bbd86e0868278f2a319c4538b2ff79372eb47cd8222f595332d1a8a27fc9871987a589f19fdf53f8031f5ba31e876020bc4a0bdae092d096270765dd0580d2064a133d798de42aa2df6ef0cfe82917aa9ea865222e1f00f7b4eb253c36d27440ae5a5eee1c3a4a5f2ad4350e73ced90fe088b874cd015097d89fc09c86a548d3fb92d98b187204b67022e562cefe4f5cd4496e006b95b28cd9ea42cfd41da9896e19a9d224a105a2e024c1fa3cea8c7d6059f131e575369b7b00b080452719036f74db9d91a7bf02ac8a5ce21d69a8475fbc5e8a2970c71422849da22fc0a6e15f33e5881b892b8ba5a6781baa518b85920d2570d71346fbb4ae01fa3c108e85e7444f6cad504feb3eec8162757c248938716597247eb6e54f925d9bb34c62ef862586aa135cb0dbd631988e79053b7621f4e3159f110105a41d7b07490415aef31086ba25e1f0a94d5edc85e17874cda6c9d6433a287f63fe069cf751576a28d84fe4ae4c68ed421f9ce057ed517d8c411fc7a8cfb1cadd79d1757664e993beb01aaa8e78f8a0eb4973054e3e62d3bb0dbb1638cad5a44a2349818c9c77183670e3f1f0be2f06c3e1958474afabf05d9db41bf3f9df683e74e09a26753e5925f9f99f9e6ca817d311d279a0b858ada38cddd9ec4292c5f2aedbf7d507f2adf782aa0ad9ce0f3f6516c5e4bea5edf3c82b110db7cba2e2aa4418c696b28f65afa94a8781fdafae46bcc7109eaaeff82fb8b700af7d3e397df23c7e66c02e42ecb61c334579ca934f0e1f0824abec376cb2b45200f38c8be59d38eca6b89134d232c0746459ec33ae542b6ab785d6b0fa75bdbcb3fab63a9e5e00d124d4893aa24b1694d220a21ab5f566975482a0144908177be09af50491e72b1a935a7c598ae3cb0f5c4443fa1d41562d418179551a4babbfc71c0e565a259fdb6ac42c58f17f41e1e47a89a5a8520c91fdd13f28bcfeb92820a1f638be82daff10f000cae627bb234ee606885586a1f99ffa26803a1277fe4ff3b871180007ef13e0ff869e2145f07914ba9a2b3233815caf9ba0bf021410348e3357e75ad225d4fda41974c88643f20e375fdffc9a12404f6d6458ff4d2d906c1b13126a830ea30f0f860574207fcae6b0f1ea138d4144a9aa0c972ec06ddd54085c440dbadbe5f7e9518c63f5f98e58600906bce676791bae48dab5e4ec84d7ce77fc6a4abde6d57709352937e617bdeafac78188d6e177001f6a9284226b5da4718cb0d77c03049c249498af5c90a729149b918a733a24018d5011eb5e004b603d06d8d4fb84d3e233de606afeef49e5a7b1cad6de4d014746561743d22c51943b153276c69ff7b2102e1a1b6344ecd9d622c42d11ff0abebd0e0061b2038b447fb5d767b089950025d4348607cbc11b41791b52cb9671221b41389d9f4d5b2c97dd92aaca4846c9d7c8e7031ac36cc4290ba7703cf649024898ef4c50b44d61d1859b695a9813af82696b753dbd4fa2aabcdb81f14b6e018b5615363e7996c130978c32d967a0c7b9d4e22f6289e15f76fa4a479051abe5ae82b00dafdd73b121b9cca40fc28d484c7dc291e134184532611397df9db9f6ecbaf28029c81b13f252d161dd2eb315c5ede3eacb2afeb6b08cc18fb699b8b668b05636ca47838c65327be35f32d3da0204dd442eb7e957e9350a7fe6196a861db71f044303708cfc3aa17503b195729892d2ca3daaaa5a3e312fc09937bbcfb299e1774b7208d247f98fee508167df943c7fdf01f13a7b9fb7e93e00fd6a791df3e4224b0c74b653bf93f5184af8523b769ddfd297840eec4545f55d913b14de27b12a960cf369207a07656c46780ed3e3bf11c846c400f943fe132f5da053108a7c61e02c68c7f3026dedd51edc1649dfa7c8db16d4251374374be4fdcaded430f82bef3e9ec2de52ce30787e1c34347ff10b11eeb4eafe3321ad516d82016cabe0a1b107e11934e8830a485cf1ec844ff8264c569873e6c308e66cff0bc5e1faaf5910283cfbab773f146c10549b530b50f7493e875392cdd7d5506959b20801e9c682a373a5644bcc6bad0965a6c0c30979fdc1536a90c4f5f9222015078428392517a41c1aa818f650d89e1762ce4818580c24bedb9820287e22115bb7168be5484d0576a8fcda16def6519c3e3fcf6e176e107975ea4f7d1b7dbc5ef0fa7094b6e2db30661da1ebe94413c6d02a313895eb12fae56a0dc99c67ecce46eb234deff0f6c21c065c03664f3843729de3a7a50a6030dd2f8db1fa266986318c6f0919d5e564a98fc581c7003de66b0a2ca0d494a45907cf87c8427b9f0fd69d2164cbf9f8d1d7e15c4bfbd2014006d4627adcbbd3a2eb12857cb0ca05a9dc820bbf06cbbb7c013f69f75bdb4d3459545c64d06e04cc8af5556b071368b487b68e1f23a5a993533494229a3d2cda956b051b6f524118055f1ac9c83680fb0aaaf85a77113b5d5da1d2520323b67e283f433a0ff5c52741acb0617d87cd839c74166d1600ae6e7810e45fdffec3e11245494ed1b1fd6132256ba27f7638f3051b4564b81fafaef22b0e076becb3c6bde45850f486cd8aa56261b79be305180117eb9d5ecbe0d970141681c35bab8495380944c9f74213c631d396f5439011f2b0e75e13c73430d8e84d539bee7b18a4bea21b1e4e382d2993cf639c67e7308eaeff7393d58db8e557d3ca37e9092f5723828e654c4364e6b2deb573832b5111d8ca9822304b0cdcf4e129ab2623f92338ba5314119fb360edb513f6cfbd6ffb4fe9646a6c5b978b6e9d47811f5d6939087d3b3874554b821d5b23dd68a3dc24bd7000a9e80b349c3056c63b48c9aaf9447328b04058cf2ee79c2ed3d4445c367000381298c383ca4445600241c8d1629615949723e397ff950d5d63fffd9b00221eb8d4b04ccd9d73b2ca399c8053ad626d463c780a95ff9d979df5424fe5945ab5a82e38f2b3b9c898474ec6b62bb239492cefd1b3511f3855e5ef4cebefcacf0f7c127d62f6c77a03b8ad76309be87d7c91600e01720722a226acec1eb594d8c2e46ffde6bf3620f6df2994417c97227b3589989a32ade52503ce53867ca6033deb9155fe06e3f196c5816485840918919f796ce9b00e07aa38aa74a7821d23fd7cd1fae7526a3c6a2cfe12cef4fb972c73bedd6aacb017e840aa19f266e45292cefc2cf1f841711c052bdfd8ab5f59b975cdeb53527736304b7c85a7655aa3b31dc1a1fb0cb735286fa7df704a0e35e0be40ddb8dae3bf47052bd68a6486c366c4176c3100dc7edfe6db9058e10e71fbc3009875a780ed6ad2620eb0579aac9f1588151d19a36938233cb47308619edfcd53ae5de350373c234a6a5b1a5e84b41a36fe263064bb3d34c66f1411b2e4abe74ac843bb50adeaa1ed9b4ee77aded01e22595d6f68a92663c7e5eef9f243065924ba86b9d5e5713c10472878c059e4ccc9edf2f5e7a3c22f4debdac6918c8b4eef01930b2b5e4735c644101ecd727f015a76ae684dd6bda35e03ccea9c2e3c895ab615212705031c1623ee49ce42e145785387e43aadb9a0b80836e7fc27a54a4d62cd08cdd8bbd923e0ecfd62f3d7d683e4f3aefbf5801c8390caa0c317ccbc0e14a0031693074a13d193ea23b0dc57614a989e32fa84e3c7efaf194b314ae557fddb209cfb8b5d4ba0e4ad2b86c538cffeae6e4e21e5fb9e9309b37eb59f9e9c96680b9a7c115e0525636c529f7c2c386923606c5b620bb35fc36760bb80e0961cea5a25acbc0ef8edd628bee8662fc3dbdab800a98b1b019749e69efdaa77bb7da337aef8782c72d77c91506ee2ba4ea5ba7b19aa077fbe0c5baa76210bef16b962e930d28046cf9e7c477ff5ff8d56903acfe5bba617ff7e6e84eaec1642bebb85934a098072065d7e15deadc5d107a069bf5a626900c74c6ae873482f167df8cacc16f1e7da2bdb574a4a6b0ede527097d9c964ec02d12ad9ac5c199b23daa5fdb0d310200f3d535a83fc296a657cc4ccb62c847b5401a8b20c91f3371fc5171edeac0280d2614fc477b90ead3a30d11005d09a671d77f1abff3a1967c287999ff11148e0d6f2702d9bad966b601fdec82c13001cbc236ed0635db8872f981f9c5e023b259d88bcbb5d6ce077af4393c6ee55ee4fda66005fe451ae7d0c54d085d4aefe48776bc519e91105357af11e305bbeffe2b0c77200b4e853e66a03a68b34b1566248d5c6b036e8225c0d5ae89542df6f161524a44cdde2efe67ae8b6189c612bb8a1430467f0c776d25cf99fc10899b7ffb766961a2026fda270b790c6b4fca5f1a55e143ceb209206c71b773d4333e3a804d253747ed1d9de61707cb07a4db68a6e1967dad2bd98a7d95247d885ced159e5dbcc078b043e80b93f95662de85de8effbf5b0eef20d8e689193a2f637d992f6a5c8f77338e325c020187422bf366bb0a8c5060f15e6057b8e49914410c55dbe7b676fc4dac9ab9b98a0ff4f56fcd615057af8375c837a60b9a03301996229a62fc82dff3d8a22559a8b7b2e7a97009a769620f9a5b37fea1c6eca593b63a67ccf4d51641cbfdeb5541fd8fe929e9efccc115b1d40df4fe0e80b39cecb09ffc6d3f072b2c27605567dd45ee71355a2e2cc283e2fa3470828f68aaeecc99d7a693d846632a22f9ba58bddd5c1128749c4add0fbee0f502b215cc460836a867cca47ebdf96e04d3df5f77615b8daf3efa746997a3dc74ac3a8d4aec4d61fe647eeb6fdd4a3ffc6b84fdbf05c32ccbe54804960d66169502ce04b1783ea7648e52d84e0703efc54bfe3acd1e5da87e57b33952137b3cbfe79743703cfa0397b01df5f3c069023eeb5c27d16b593e14544f18af17623a6406e90b4c62a390edc96c63fc1f06e7fc47e545d2c30fcd62a806bc934527a13b53442b1d0eef56adeda2b56d646aa14e90c22dfa2a59e2207ab76fe1da44a3e1d8b63398bb204324eb29e41ba96873772d4cbed37d201e767a54d53db0c0273252b608983cf1063f3b2a9b7580c8b38cb52e33b4f316f8f83b8e3cca53f77c08c8fe7019ab2d7b2455b422e9d81dfa6383d2e0c74e486fafa92ca5b9fb914e2b7cd6c6df5127e725dc79bcc055bdeb44c609a72493206086c86aee23e986d653c70b76532da4eb89b2951334bc37726acd50a2e82d3e76a309d93190707287e2ba909a3cad124f1fd26a71e692d94906228644f5fc398cd904b028a0943ef5fbc953182d36225cedb9be430479c97969aff6dcf3f744445b53f07336d4c382eecad4733c775a3cdc79a224eb8daf6e542b27a14b5acec06d30dc5f4fee61255c7f539a10ae38d0616376d1a7427c4f3e27402965d8344cdedbfefc2c1061820cf30aa78f4aef04ff7e90a5e1ca3d53efa492d7f66728cbe6f07dbfc23d1fda5a50eef3be4aea17a2dfd9e6045222787fb3ce7517bd96437e8bf71e181d97c2eaf9fd3e55b94943da79dc207829b39695ee371171a3c0556b89e2cb2c107d7aa416058eb3822b9fee7c15021873756452606be126b4e097b8e3c90f210ebc69435d1dd1c62f7c14a9e74c04615167c5dd4b9206534e5e1ef32606d98a004316bf1c7d68bfe9e8ecf69033060b7aa7585b61abdaf1fd0eee891116af4e0a9d5d02fe6451abdbe75d6e2b1dd248d2d26de7524c8c4daef3a885e97a0c6c8ca7c71014c1d38c6493474618b7adc80fab8c87a5093829e2212155e69a867fc0437b1fff3ab7f1d80aac52d6dc0c36afb07e94dac4a9533cbb62946b52e5030f85b7a9cab0902c4cacf6a9d070bfec81c5f3c7413a84a73ebdba3b45be9e46fa16b095a21404162a5a7a5b1d99097a53f99451da8937777e7e85e90d499a07d56eb10c8f35b0185349dbb017cd6cb3f8356724736ddb97a4bc5cff7a95f27559ca5668e3f444ff7766dbd9a5e8fafd598a8655e18c7daf2f04c993a3e14ee2d0d93dc34d53ed616ff0784a1d6aa3346a81d1919163c5411cd7d949708a780b7ce0a33eae0e3147ec6376c7f3c4e3bec0c80bea07d36f4202a18778d6d43ce6ef62f8cd6934db9b89b7eab0f814f2ca2c3ff93f0eac83206d47943282d8f983ac9189d900cd855a555f540ac652aa3ba986f285a40b21567613361bbe9e42c5fa6c310f870cbac5b19b214d2ee8dbc7884ea115e18edfe81ed04931d40e11c5465c69c65813f029beab975a970e1e903bafcc0cf0f25493b2de00b125e6bdfe06c94d9e79e20af36dafa8211aada804134aaf847477443df56b754f79b198f9118e739aa3397d1ef918ff49bb6b4c1bc6847c7d34e6270edb20091333b9554ddfc27143212cd3b09568f21d17acb224c51c7a396c978d2c355643e4a3581b1b66042812d93342160f3a7031d9b15a291191f96e168a6ce16f236b77bd4fd6ff9f2b295c425cce75c8fa4ff11a508f16cdeee9946d74a640a2cf7e76f15ba8c8c9fa958bd159cbebc740ec1c43d0dfc6987fb9ea4290f6016a067517c47a1d65438121377a8fc1ec7c67e4930906af1cd1755c949666e074081ffc13e125d1a08929dd33678aca665a1a5779a8953e67dff62bd374e7352362af83a3939f5b6e24cffb91b84f3cb46a34b84474ac5cd7412bc13c0b9bc45a2fcfd3422cf6c9ad13fd6a3f2f21ec15f1f24399553726bda6a6544558eb592016a4114b7a1f9440b3fd8abe3c956eeadfc93bbb4e51c22437d5aad46011907368984e9bd252b05f4c903693e010c7b324086e3660b9c91adbaed78f9979f628ef0aac3a6706b6674e8e88e928b48b6a7f9856fb251622bdb54f62c01a1e98607fa924567563399475e4a198ab828c154c79ba3decbbd03f16cb5684279c55a4e86e2153346702aa80bbf15b28bb9c749040998c2348a7bb88349d2d64b77febfee75097958c3ac63f2b6a9f839da2837b2b4a6dc0483c5201fe1bb853fcb85cc978ed21f177a2b4755a742973f701b1ee9c3a5b940051603a6865ffffaebbf429eec68e178d891f6e6b2ec092d0d7698fe7f5f1db400e06f703c44f3b957e831c33e38dd17b09253a0e75a5b07a5d6a0681ab38bc2170b0789493de20e77b32e75ac36b45243a7bfccd03b1d60001010fe1f1172cd289f70aa0b5d9bc170254e04b59e0d7399d19550b6a32c960bb41b06e80ab1f0c368f416c703a50e75bb6c17a380f7c4b99a26a2bc67d5d74b66d150ca646bc830d9d26d857d6c0c1786f824fddc66470beed79dc5b7876a7dd417fefb2c87ae3f70ec7898f352e0d0cc06873dd53dcbd5cc1ff9d869803da12c010f951cae985b54830e28fea13d96e14d66e95590da3c01073bc79c2064aad3590cf249dc0657286b7d4ecd7f3c7fb28c75ca3426be3904e2c0866b84b86426f0f1b217f34a7915b024b73e29f74c9972f65bd4d7d8f2e38e9425335f471c1e5f08e2eec37429e8c027fe1c68fcdbdd7bb246830672378061a5af90e35819bafbcc1c4ef4dd6cd008788428903bd27431ab23b108b8fa12365530b4f7696d15c3fe0b9b4ac1d2c3d050c3d5902d711dfd707976b1fa58809e8efd80c58d1fa0a35362d579e914a69ad68078b9fedb6b35ec2b296a76dbb8f98ecd09535c1dad8d204126b79bf5e1b9c3bdeb62b06bbccf35dd7d9e7113465d9a81687a6e784482de992067a09a006dc2599115c4212c4168020f6d6fe52bda162cb666b0b1e79aa9d3e1b3d5143ca97ab4a8f114</script>
<div class="hbe hbe-content">
<div class="hbe hbe-input hbe-input-wave">
<input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">
<label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">
<span class="hbe hbe-input-label-content hbe-input-label-content-wave">输入正确密码查看正确文章</span>
</label>
<svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">
<path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>
</svg>
</div>
</div>
</div>
<script data-pjax src="/OLD_BLOG/lib/hbe.js"></script><link href="/OLD_BLOG/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<categories>
<category>日常</category>
</categories>
<tags>
<tag>近期</tag>
</tags>
</entry>
<entry>
<title>CDN、镜像知识点</title>
<url>/OLD_BLOG/2021/09/15/CDN%E3%80%81%E9%95%9C%E5%83%8F%E7%9F%A5%E8%AF%86%E7%82%B9/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于配置<code>Picgo</code>的时候需要搭建CDN加速或者镜像访问(推荐),因此秉持好奇心记录一下</p>
<span id="more"></span>
<h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p>本笔记有以下几篇参考文章,分别如下:</p>
<p><a href="https://baike.baidu.com/item/%E9%95%9C%E5%83%8F%E7%BD%91%E7%AB%99/184890">镜像网站</a></p>
<p><a href="https://zhuanlan.zhihu.com/p/113037678">CDN原理简单介绍</a></p>
<p><a href="https://www.cnblogs.com/sunzhenchao/p/3586442.html">CDN与镜像站点的比较</a></p>
<p><a href="https://blog.csdn.net/rongwenbin/article/details/47609591">CDN与镜像区别</a></p>
<h1 id="镜像"><a href="#镜像" class="headerlink" title="镜像"></a>镜像</h1><h2 id="什么是镜像"><a href="#什么是镜像" class="headerlink" title="什么是镜像"></a>什么是镜像</h2><p>它和主站并没有太大差别,或者可算是为主站作的后备措施。有了镜像网站的好处是:如果不能对主站作正常访问(如某个服务器死掉或出了意外),但仍能通过其它服务器正常浏览。相对来说主站在速度等各方面比<a href="https://baike.baidu.com/item/%E9%95%9C%E5%83%8F%E7%AB%99%E7%82%B9">镜像站点</a>略胜一筹。</p>
<p>最常见的当属镜像站点(Mirror Sites)。通过复制网站或网页的内容并分配以不同域名和服务器,以此欺骗搜索引擎对同一站点或同一页面进行多次索引。大多数<a href="https://baike.baidu.com/item/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E">搜索引擎</a>都提供有能够检测镜象站点的适当的过滤系统,一旦发觉镜像站点,则源站点和镜像站点都会被从<a href="https://baike.baidu.com/item/%E7%B4%A2%E5%BC%95%E6%95%B0%E6%8D%AE%E5%BA%93/5394111">索引数据库</a>中删除。</p>
<h2 id="建立镜像网站的目的"><a href="#建立镜像网站的目的" class="headerlink" title="建立镜像网站的目的"></a>建立镜像网站的目的</h2><p>1、保存网页信息,特别是在一个网站面临关站的时候。</p>
<p>2、提高用户在某个地区的下载速度。譬如一个美国网站的中国镜像可以使来自中国的用户直接从这个中国的镜像访问,从而加快了速度。这可以看作是一种全球范围的缓存。</p>
<p>3、保存历史性的数据、信息,防止丢失。</p>
<p>4、平衡网站的流量负载。例如,一个Linux 的发行版的ISO镜像文件的大量下载可能会导致主站过荷而下线,而<a href="https://baike.baidu.com/item/%E9%95%9C%E5%83%8F%E7%AB%99%E7%82%B9">镜像站点</a>则可以在多个服务器分担流量,从而保证站点的持续在线。</p>
<p>5、对因流量激增而下线的站点提供临时的访问。</p>
<p>6、便于不同地区或不同ISP(如中国电信和中国联通的互访问题)的人获得更快的访问速度。</p>
<p>创建镜像站点通常是由于<a href="https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E5%B8%A6%E5%AE%BD">网络带宽</a>限制、封锁或是其他原因,导致无法实现对主站点的正常访问。这时通过将主站点的信息资源移植转移到相对容易访问的本地服务器,以提高用户的访问效率。常见于<a href="https://baike.baidu.com/item/%E5%86%85%E9%83%A8%E7%BD%91">内部网</a>、校园网或是其他有较大存储设备的服务器。通过镜像站点,也可以实现多目标多线程的快速下载。例如Get Smart和Get Right正是使用了这种高级的<a href="https://baike.baidu.com/item/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E8%BD%BD">多线程下载</a>技术。像站点是通过主服务器增加转移存储地址来实现信息的<a href="https://baike.baidu.com/item/%E5%BC%82%E5%9C%B0%E5%A4%87%E4%BB%BD">异地备份</a>。通常一个镜像会定期访问主网站,以更新其内容。镜像也有分一级、二级等等。二级镜像是指那些通过访问一级镜像网站来更新内容的网站,通常更新速度不如一级镜像,但不会给主网站增加负担。</p>
<h2 id="更新方式"><a href="#更新方式" class="headerlink" title="更新方式"></a>更新方式</h2><p>通过主服务器增加转移存储地址来实现信息的异地备份。 更新镜像最常用的软件是rsync,有时候也直接用http镜像工具。</p>
<h1 id="CDN"><a href="#CDN" class="headerlink" title="CDN"></a>CDN</h1><h2 id="什么是CDN"><a href="#什么是CDN" class="headerlink" title="什么是CDN"></a>什么是CDN</h2><p>CDN是将源站内容分发至全国所有的节点,从而缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性的技术。它能够有效解决网络带宽小、用户访问量大、网点分布不均等问题。</p>
<blockquote>
<p>CDN 其实是 Content Delivery Network 的缩写,即“内容分发网络”<br>源站内容(image、html、js、css等) 这个属于内容分发</p>
</blockquote>
<p>CDN 诞生于二十多年前,随着骨干网压力的逐渐增大,以及长传需求的逐渐增多,使得骨干网的压力越来越大,长传效果越来越差。于是在 1995 年,MIT 的应用数学教授 Tom Leighton 带领着研究生 Danny Lewin 和其他几位顶级研究人员一起尝试用数学问题解决网络拥堵问题。</p>
<h2 id="为什么需要CDN"><a href="#为什么需要CDN" class="headerlink" title="为什么需要CDN"></a>为什么需要CDN</h2><p>当下的互联网应用都包含大量的静态内容,但静态内容以及一些准动态内容又是最耗费带宽的,特别是针对全国甚至全世界的大型网站,如果这些请求都指向主站的服务器的话,不仅是主站服务器受不了,单端口500M左右的带宽也扛不住,所以大多数网站都需要CDN服务。</p>
<p>根本上的原因是,访问速度对互联网应用的用户体验、口碑、甚至说直接的营收都有巨大的影响,任何的企业都渴望自己站点有更快的访问速度。而HTTP传输时延对web的访问速度的影响很大,在绝大多数情况下是起决定性作用的,这是由TCP/IP协议的一些特点决定的。物理层上的原因是光速有限、信道有限,协议上的原因有丢包、慢启动、拥塞控制等。</p>
<p>这就是你使用CDN的第一个也是最重要的原因:为了加速网站的访问。</p>
<p><strong>除了加速网站的访问之外,CDN还有一些作用</strong>:</p>
<ul>
<li>为了实现跨运营商、跨地域的全网覆盖</li>
</ul>
<p>互联不互通、区域ISP地域局限、出口带宽受限制等种种因素都造成了网站的区域性无法访问。CDN加速可以覆盖全球的线路,通过和运营商合作,部署IDC资源,在全国骨干节点商,合理部署CDN边缘分发存储节点,充分利用带宽资源,平衡源站流量。阿里云在国内有500+节点,海外300+节点,覆盖主流国家和地区不是问题,可以确保CDN服务的稳定和快速。</p>
<ul>
<li>为了保障你的网站安全</li>
</ul>
<p>CDN的负载均衡和分布式存储技术,可以加强网站的可靠性,相当无无形中给你的网站添加了一把保护伞,应对绝大部分的互联网攻击事件。防攻击系统也能避免网站遭到恶意攻击。</p>
<ul>
<li>为了异地备援</li>
</ul>
<p>当某个服务器发生意外故障时,系统将会调用其他临近的健康服务器节点进行服务,进而提供接近100%的可靠性,这就让你的网站可以做到永不宕机。</p>
<ul>
<li>为了节约成本</li>
</ul>
<p>投入使用CDN加速可以实现网站的全国铺设,你根据不用考虑购买服务器与后续的托管运维,服务器之间镜像同步,也不用为了管理维护技术人员而烦恼,节省了人力、精力和财力。</p>
<ul>
<li>为了让你更专注业务本身</li>
</ul>
<p>CDN加速厂商一般都会提供一站式服务,业务不仅限于CDN,还有配套的云存储、大数据服务、视频云服务等,而且一般会提供7x24运维监控支持,保证网络随时畅通,你可以放心使用。并且将更多的精力投入到发展自身的核心业务之上。</p>
<h1 id="两者区别"><a href="#两者区别" class="headerlink" title="两者区别"></a>两者区别</h1><ol>
<li><p>CDN 对用户完全透明,不需要用户手动选择需要访问的镜像站点;</p>
</li>
<li><p>CDN 对节点有健康性检查,而镜像则没有,因此CDN 可靠性更高;</p>
</li>
<li><p> CDN 的内容同步机制不需要人工的干预,而镜像站点需要一套复杂的系统来实现内容同步;镜像站点的系统复杂,维护工作量大,对运维工作有很大的压力;</p>
</li>
<li><p>CDN 部署便捷不需要对源站做改动,很短的时间内就可以采用并产生显著的效果;</p>
</li>
<li><p>CDN 节点分布广、带宽扩充快,镜像站点很难做到同样的覆盖范围及带宽快速扩充。</p>
</li>
</ol>
<p><img src="https://raw.githubusercontent.com/ZHYCarge/photo/master/image-20210915213305128.png" alt="image-20210915213305128"></p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>CDN、镜像</tag>
<tag>笔记</tag>
</tags>
</entry>
<entry>
<title>Cron与crontab简谈</title>
<url>/OLD_BLOG/2021/11/21/Cron%E4%B8%8Ecrontab%E7%AE%80%E8%B0%88/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>想要制作一个定时发送邮件的小功能,因此需要使用到Linux的定时任务。</p>
<p>通过了解,发现了Cron与Crontab来进行定时任务的实现</p>
<span id="more"></span>
<h2 id="什么是Cron?"><a href="#什么是Cron?" class="headerlink" title="什么是Cron?"></a>什么是Cron?</h2><blockquote>
<p>工具型软件<strong>cron</strong>是一款<a href="https://zh.wikipedia.org/wiki/%E7%B1%BBUnix">类Unix</a>的<a href="https://zh.wikipedia.org/wiki/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F">操作系统</a>下的基于时间的任务管理系统。用户们可以通过<strong>cron</strong>在固定时间、日期、间隔下,运行定期任务(可以是命令和脚本)。<strong>cron</strong>常用于运维和管理,但也可用于其他地方,如:定期下载文件和邮件。<strong>cron</strong>该词来源于<a href="https://zh.wikipedia.org/wiki/%E5%B8%8C%E8%85%8A%E8%AF%AD">希腊语</a>chronos(χρόνος),原意是时间。</p>
<p>——<a href="https://zh.wikipedia.org/zh-hans/Cron">维基百科《Cron》</a></p>
</blockquote>
<h2 id="什么是crontab"><a href="#什么是crontab" class="headerlink" title="什么是crontab?"></a>什么是crontab?</h2><blockquote>
<p>crontab命令常见于<a href="https://baike.baidu.com/item/Unix">Unix</a>和<a href="https://baike.baidu.com/item/%E7%B1%BBUnix">类Unix</a>的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常,crontab储存的指令被<a href="https://baike.baidu.com/item/%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B/966835">守护进程</a>激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。</p>
<p>——<a href="https://baike.baidu.com/item/crontab/8819388">百度百科《crontab》</a></p>
</blockquote>
<h1 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h1><p><a href="https://blog.csdn.net/qq_36827625/article/details/87214178">用crontab每隔1分钟执行一个命令行脚本</a></p>
<p><a href="https://www.runoob.com/linux/linux-comm-crontab.html">Linux crontab 命令</a></p>
<p><a href="https://www.matools.com/cron/">在线Cron表达式生成器</a></p>
<h1 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h1><h2 id="基本运行命令"><a href="#基本运行命令" class="headerlink" title="基本运行命令"></a>基本运行命令</h2><p>cron是一个定时执行工具,与大多数linux工具一样,我们可以通过如下命令能对其进行控制:</p>
<ul>
<li><p><code>service cron start</code> </p>
<p>启动cron服务</p>
</li>
<li><p><code>service crond stop</code> </p>
<p>关闭cron服务</p>
</li>
<li><p><code>service crond restart</code> </p>
<p> 重启cron服务</p>
</li>
<li><p><code>service crond reload </code> </p>
<p>重新载入cron服务配置</p>
</li>
</ul>
<h2 id="crontab表详解"><a href="#crontab表详解" class="headerlink" title="crontab表详解"></a>crontab表详解</h2><p>通过在表中添加相关参数,我们便可以将相关脚本通过定时器进行定时运行</p>
<ul>
<li><p><code>crontab -l</code></p>
<p>列出当前crontab表中的内容</p>
</li>
<li><p><code>crontab -r</code></p>
<p>移除crontab表</p>
</li>
<li><p><code>crontab -e</code></p>
<p>可以使用系统中内置的编辑器,进入crontab表中,对表中内容进行编辑</p>
</li>
<li><p><code>crontab -i</code></p>
<p>可以移除crontab,会跳出系统信息让你再次确定是否移除crontab</p>
</li>
</ul>
<p>crontab表时间格式说明</p>
<p>1-3表示123<br>1-9/2表示13579</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">每小时执行 0 * * * *</span><br><span class="line"></span><br><span class="line">每天执行 0 0 * * *</span><br><span class="line"></span><br><span class="line">每周执行 0 0 * * 0</span><br><span class="line"></span><br><span class="line">每月执行 0 0 1 * *</span><br><span class="line"></span><br><span class="line">每年执行 0 0 1 1 *</span><br></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">* * * * *</span><br><span class="line">- - - - -</span><br><span class="line">| | | | |</span><br><span class="line">| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)</span><br><span class="line">| | | +---------- 月份 (1 - 12) </span><br><span class="line">| | +--------------- 一个月中的第几天 (1 - 31)</span><br><span class="line">| +-------------------- 小时 (0 - 23)</span><br><span class="line">+------------------------- 分钟 (0 - 59)</span><br></pre></td></tr></table></figure>
<p>因此,如果我们想让一个脚本每十分钟执行一次,那么可以这么设置:</p>
<p><code> */10 * * * * 运行方式 脚本的绝对地址</code></p>
<p>设定cron的权限<br><code>/etc/cron.allow /etc/cron.deny</code></p>
<blockquote>
<p> 系统首先判断是否有cron.allow这个文件,如果有这个文件的话,系统会判断这个使用者有没有在cron.allow的名单里面,如果在名单里面的话,就可以使用cron机制。</p>
<p>如果这个使用者没有在cron.allow名单里面的话,就不能使用cron机制。 </p>
<p>如果系统里面没有cron.allow这个文件的话,系统会再判断是否有cron.deny这个文件,如果有cron.deny这个文件的话,就会判断这个使用者有没有在cron.deny这个名单里面,如果这个使用者在cron.deny名单里面的话,将不能使用cron机制。</p>
<p>如果这个使用者没有在cron.deny这个名单里面的话就可以使用cron机制。 如果系统里这两个文件都没有的话,就可以使用cron机制</p>
</blockquote>
<h2 id="添加脚本文件到目录中"><a href="#添加脚本文件到目录中" class="headerlink" title="添加脚本文件到目录中"></a>添加脚本文件到目录中</h2><p>在<code>/etc/crontab</code>中,存放着四个文件夹(<code>/cron.hourly cron.daily cron.weekly cron.monthly</code>)分别代表着每小时执行一次,每天执行一次,每周执行一次,每月执行一次</p>
<p>在到达了指定的时间后,系统便会对其进行自动执行</p>
<h1 id="尾言"><a href="#尾言" class="headerlink" title="尾言"></a>尾言</h1><p>仅仅作为一次记录</p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>笔记</tag>
</tags>
</entry>
<entry>
<title>ESP8266的服务器小介绍</title>
<url>/OLD_BLOG/2021/11/02/ESP8266%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B0%8F%E4%BB%8B%E7%BB%8D/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>尝试使用esp8266去创建一个服务器以及实现对开发版的基本控制</p>
<p>本篇文章参考自太极创客的相关文章,作为博主笔记使用</p>
<span id="more"></span>
<h1 id="其他教程"><a href="#其他教程" class="headerlink" title="其他教程"></a>其他教程</h1><p><a href="http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-server/web-server/">3-2-1 建立基本网络服务器</a></p>
<p><a href="http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-server/pin-control/">3-2-2 通过网络服务实现NodeMCU开发板基本控制</a></p>
<p><a href="http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-server/pin-state/">3-2-3 通过网络服务将开发板引脚状态显示在网页中</a></p>
<p><a href="https://www.bilibili.com/video/BV1L7411c7jw?p=6">【ESP8266教程】零基础入门学用物联网-基础知识篇(太极创客团队)</a></p>
<h1 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h1><h2 id="建立网络基本服务器的示例代码"><a href="#建立网络基本服务器的示例代码" class="headerlink" title="建立网络基本服务器的示例代码"></a>建立网络基本服务器的示例代码</h2><figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**********************************************************************</span></span><br><span class="line"><span class="comment">项目名称/Project : 零基础入门学用物联网</span></span><br><span class="line"><span class="comment">程序名称/Program name : 3_2_1_First_Web_Server</span></span><br><span class="line"><span class="comment">团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">作者/Author : CYNO朔</span></span><br><span class="line"><span class="comment">日期/Date(YYYYMMDD) : 20191107</span></span><br><span class="line"><span class="comment">程序目的/Purpose : 使用NodeMCU建立基本服务器。用户可通过浏览器使用8266的IP地址</span></span><br><span class="line"><span class="comment"> 访问8266所建立的基本网页(Hello from ESP8266)</span></span><br><span class="line"><span class="comment">-----------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">修订历史/Revision History </span></span><br><span class="line"><span class="comment">日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">***********************************************************************/</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFi.h></span> <span class="comment">// 本程序使用 ESP8266WiFi库</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFiMulti.h></span> <span class="comment">// ESP8266WiFiMulti库</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WebServer.h></span> <span class="comment">// ESP8266WebServer库</span></span></span><br><span class="line"> </span><br><span class="line">ESP8266WiFiMulti wifiMulti; <span class="comment">// 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'</span></span><br><span class="line"> </span><br><span class="line">ESP8266WebServer <span class="title function_">esp8266_server</span><span class="params">(<span class="number">80</span>)</span>;<span class="comment">// 建立ESP8266WebServer对象,对象名称为esp8266_server</span></span><br><span class="line"> <span class="comment">// 括号中的数字是网路服务器响应http请求的端口号</span></span><br><span class="line"> <span class="comment">// 网络服务器标准http端口号为80,因此这里使用80为端口号</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">(<span class="type">void</span>)</span>{</span><br><span class="line"> Serial.begin(<span class="number">9600</span>); <span class="comment">// 启动串口通讯</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//通过addAp函数存储 WiFi名称 WiFi密码</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"taichi-maker"</span>, <span class="string">"12345678"</span>); <span class="comment">// 这三条语句通过调用函数addAP来记录3个不同的WiFi网络信息。</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"taichi-maker2"</span>, <span class="string">"87654321"</span>); <span class="comment">// 这3个WiFi网络名称分别是taichi-maker, taichi-maker2, taichi-maker3。</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"taichi-maker3"</span>, <span class="string">"13572468"</span>); <span class="comment">// 这3个网络的密码分别是123456789,87654321,13572468。</span></span><br><span class="line"> <span class="comment">// 此处WiFi信息只是示例,请在使用时将需要连接的WiFi信息填入相应位置。</span></span><br><span class="line"> <span class="comment">// 另外这里只存储了3个WiFi信息,您可以存储更多的WiFi信息在此处。</span></span><br><span class="line"> </span><br><span class="line"> <span class="type">int</span> i = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">while</span> (wifiMulti.run() != WL_CONNECTED) { <span class="comment">// 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前</span></span><br><span class="line"> delay(<span class="number">1000</span>); <span class="comment">// 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU</span></span><br><span class="line"> Serial.print(i++); Serial.print(<span class="string">' '</span>); <span class="comment">// 将会连接信号最强的那一个WiFi信号。</span></span><br><span class="line"> } <span class="comment">// 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是</span></span><br><span class="line"> <span class="comment">// 此处while循环判断是否跳出循环的条件。</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// WiFi连接成功后将通过串口监视器输出连接成功信息 </span></span><br><span class="line"> Serial.println(<span class="string">'\n'</span>); <span class="comment">// WiFi连接成功后</span></span><br><span class="line"> Serial.print(<span class="string">"Connected to "</span>); <span class="comment">// NodeMCU将通过串口监视器输出。</span></span><br><span class="line"> Serial.println(WiFi.SSID()); <span class="comment">// 连接的WiFI名称</span></span><br><span class="line"> Serial.print(<span class="string">"IP address:\t"</span>); <span class="comment">// 以及</span></span><br><span class="line"> Serial.println(WiFi.localIP()); <span class="comment">// NodeMCU的IP地址</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">//--------"启动网络服务功能"程序部分开始-------- // 此部分为程序为本示例程序重点1</span></span><br><span class="line"> esp8266_server.begin(); <span class="comment">// 详细讲解请参见太极创客网站《零基础入门学用物联网》</span></span><br><span class="line"> esp8266_server.on(<span class="string">"/"</span>, handleRoot); <span class="comment">// 第3章-第2节 ESP8266-NodeMCU网络服务器-1</span></span><br><span class="line"> esp8266_server.onNotFound(handleNotFound); </span><br><span class="line"><span class="comment">//--------"启动网络服务功能"程序部分结束--------</span></span><br><span class="line"> Serial.println(<span class="string">"HTTP esp8266_server started"</span>);<span class="comment">// 告知用户ESP8266网络服务功能已经启动</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 以下函数语句为本示例程序重点3</span></span><br><span class="line"><span class="comment">详细讲解请参见太极创客网站《零基础入门学用物联网》</span></span><br><span class="line"><span class="comment">第3章-第2节 3_2_1_First_Web_Server 的说明讲解*/</span> </span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">(<span class="type">void</span>)</span>{</span><br><span class="line"> esp8266_server.handleClient(); <span class="comment">// 处理http服务器访问</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 以下两个函数为本示例程序重点2</span></span><br><span class="line"><span class="comment">详细讲解请参见太极创客网站《零基础入门学用物联网》</span></span><br><span class="line"><span class="comment">第3章-第2节 3_2_1_First_Web_Server 的说明讲解*/</span> </span><br><span class="line"><span class="type">void</span> <span class="title function_">handleRoot</span><span class="params">()</span> { <span class="comment">//处理网站根目录“/”的访问请求 </span></span><br><span class="line"> esp8266_server.send(<span class="number">200</span>, <span class="string">"text/plain"</span>, <span class="string">"Hello from ESP8266"</span>); <span class="comment">// NodeMCU将调用此函数。</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">// 设置处理404情况的函数'handleNotFound'</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">handleNotFound</span><span class="params">()</span>{ <span class="comment">// 当浏览器请求的网络资源无法在服务器找到时,</span></span><br><span class="line"> esp8266_server.send(<span class="number">404</span>, <span class="string">"text/plain"</span>, <span class="string">"404: Not found"</span>); <span class="comment">// NodeMCU将调用此函数。</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="通过网络服务器控制Esp8266示例代码"><a href="#通过网络服务器控制Esp8266示例代码" class="headerlink" title="通过网络服务器控制Esp8266示例代码"></a>通过网络服务器控制Esp8266示例代码</h2><figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**********************************************************************</span></span><br><span class="line"><span class="comment">项目名称/Project : 零基础入门学用物联网</span></span><br><span class="line"><span class="comment">程序名称/Program name : 3_2_2_Turning_on_and_off_an_LED</span></span><br><span class="line"><span class="comment">团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">作者/Author : CYNO朔</span></span><br><span class="line"><span class="comment">日期/Date(YYYYMMDD) : 20191108</span></span><br><span class="line"><span class="comment">程序目的/Purpose : 使用NodeMCU建立基本服务器。用户可通过浏览器使用8266的IP地址</span></span><br><span class="line"><span class="comment"> 访问8266所建立的基本网页并通过该页面点亮/熄灭NodeMCU的内置LED</span></span><br><span class="line"><span class="comment">-----------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">修订历史/Revision History </span></span><br><span class="line"><span class="comment">日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">***********************************************************************/</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFi.h></span> <span class="comment">// 本程序使用 ESP8266WiFi库</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFiMulti.h></span> <span class="comment">// ESP8266WiFiMulti库</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WebServer.h></span> <span class="comment">// ESP8266WebServer库</span></span></span><br><span class="line"> </span><br><span class="line">ESP8266WiFiMulti wifiMulti; <span class="comment">// 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'</span></span><br><span class="line"> </span><br><span class="line">ESP8266WebServer <span class="title function_">esp8266_server</span><span class="params">(<span class="number">80</span>)</span>;<span class="comment">// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">(<span class="type">void</span>)</span>{</span><br><span class="line"> Serial.begin(<span class="number">9600</span>); <span class="comment">// 启动串口通讯</span></span><br><span class="line"> </span><br><span class="line"> pinMode(LED_BUILTIN, OUTPUT); <span class="comment">//设置内置LED引脚为输出模式以便控制LED</span></span><br><span class="line"> </span><br><span class="line"> wifiMulti.addAP(<span class="string">"ssid_from_AP_1"</span>, <span class="string">"your_password_for_AP_1"</span>); <span class="comment">// 将需要连接的一系列WiFi ID和密码输入这里</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"ssid_from_AP_2"</span>, <span class="string">"your_password_for_AP_2"</span>); <span class="comment">// ESP8266-NodeMCU再启动后会扫描当前网络</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"ssid_from_AP_3"</span>, <span class="string">"your_password_for_AP_3"</span>); <span class="comment">// 环境查找是否有这里列出的WiFi ID。如果有</span></span><br><span class="line"> Serial.println(<span class="string">"Connecting ..."</span>); <span class="comment">// 则尝试使用此处存储的密码进行连接。</span></span><br><span class="line"> </span><br><span class="line"> <span class="type">int</span> i = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">while</span> (wifiMulti.run() != WL_CONNECTED) { <span class="comment">// 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前</span></span><br><span class="line"> delay(<span class="number">1000</span>); <span class="comment">// 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU</span></span><br><span class="line"> Serial.print(i++); Serial.print(<span class="string">' '</span>); <span class="comment">// 将会连接信号最强的那一个WiFi信号。</span></span><br><span class="line"> } <span class="comment">// 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是</span></span><br><span class="line"> <span class="comment">// 此处while循环判断是否跳出循环的条件。</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// WiFi连接成功后将通过串口监视器输出连接成功信息 </span></span><br><span class="line"> Serial.println(<span class="string">'\n'</span>);</span><br><span class="line"> Serial.print(<span class="string">"Connected to "</span>);</span><br><span class="line"> Serial.println(WiFi.SSID()); <span class="comment">// 通过串口监视器输出连接的WiFi名称</span></span><br><span class="line"> Serial.print(<span class="string">"IP address:\t"</span>);</span><br><span class="line"> Serial.println(WiFi.localIP()); <span class="comment">// 通过串口监视器输出ESP8266-NodeMCU的IP</span></span><br><span class="line"> </span><br><span class="line"> esp8266_server.begin(); <span class="comment">// 启动网站服务</span></span><br><span class="line"> esp8266_server.on(<span class="string">"/"</span>, HTTP_GET, handleRoot); <span class="comment">// 设置服务器根目录即'/'的函数'handleRoot'</span></span><br><span class="line"> esp8266_server.on(<span class="string">"/LED"</span>, HTTP_POST, handleLED); <span class="comment">// 设置处理LED控制请求的函数'handleLED'</span></span><br><span class="line"> esp8266_server.onNotFound(handleNotFound); <span class="comment">// 设置处理404情况的函数'handleNotFound'</span></span><br><span class="line"> </span><br><span class="line"> Serial.println(<span class="string">"HTTP esp8266_server started"</span>);<span class="comment">// 告知用户ESP8266网络服务功能已经启动</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">(<span class="type">void</span>)</span>{</span><br><span class="line"> esp8266_server.handleClient(); <span class="comment">// 检查http服务器访问</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/*设置服务器根目录即'/'的函数'handleRoot'</span></span><br><span class="line"><span class="comment"> 该函数的作用是每当有客户端访问NodeMCU服务器根目录时,</span></span><br><span class="line"><span class="comment"> NodeMCU都会向访问设备发送 HTTP 状态 200 (Ok) 这是send函数的第一个参数。</span></span><br><span class="line"><span class="comment"> 同时NodeMCU还会向浏览器发送HTML代码,以下示例中send函数中第三个参数,</span></span><br><span class="line"><span class="comment"> 也就是双引号中的内容就是NodeMCU发送的HTML代码。该代码可在网页中产生LED控制按钮。 </span></span><br><span class="line"><span class="comment"> 当用户按下按钮时,浏览器将会向NodeMCU的/LED页面发送HTTP请求,请求方式为POST。</span></span><br><span class="line"><span class="comment"> NodeMCU接收到此请求后将会执行handleLED函数内容*/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">handleRoot</span><span class="params">()</span> { </span><br><span class="line"> esp8266_server.send(<span class="number">200</span>, <span class="string">"text/html"</span>, <span class="string">"<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>"</span>);</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">//处理LED控制请求的函数'handleLED'</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">handleLED</span><span class="params">()</span> { </span><br><span class="line"> digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));<span class="comment">// 改变LED的点亮或者熄灭状态</span></span><br><span class="line"> esp8266_server.sendHeader(<span class="string">"Location"</span>,<span class="string">"/"</span>); <span class="comment">// 跳转回页面根目录</span></span><br><span class="line"> esp8266_server.send(<span class="number">303</span>); <span class="comment">// 发送Http相应代码303 跳转 </span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">// 设置处理404情况的函数'handleNotFound'</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">handleNotFound</span><span class="params">()</span>{</span><br><span class="line"> esp8266_server.send(<span class="number">404</span>, <span class="string">"text/plain"</span>, <span class="string">"404: Not found"</span>); <span class="comment">// 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found"</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="代码示例讲解"><a href="#代码示例讲解" class="headerlink" title="代码示例讲解"></a>代码示例讲解</h3><ul>
<li><code> esp8266_server.on("/", HTTP_GET, handleRoot)</code></li>
</ul>
<p>当服务器访问<code>/</code>目录时,且访问方式为GET模式,则使用<code>handleRoot</code>函数对其请求进行处理</p>
<ul>
<li><code>esp8266_server.sendHeader("Location","/")</code></li>
</ul>
<p>发送一个头,位置是<code>/</code></p>
<h2 id="通过网络服务显示端口状态示例代码"><a href="#通过网络服务显示端口状态示例代码" class="headerlink" title="通过网络服务显示端口状态示例代码"></a>通过网络服务显示端口状态示例代码</h2><figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**********************************************************************</span></span><br><span class="line"><span class="comment">项目名称/Project : 零基础入门学用物联网</span></span><br><span class="line"><span class="comment">程序名称/Program name : 3_2_3_Pin_State_Display</span></span><br><span class="line"><span class="comment">团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">作者/Author : CYNO朔</span></span><br><span class="line"><span class="comment">日期/Date(YYYYMMDD) : 20191107</span></span><br><span class="line"><span class="comment">程序目的/Purpose : 使用NodeMCU建立基本服务器。该页面将会自动刷新并且显示NodeMCU</span></span><br><span class="line"><span class="comment"> 的D3引脚状态。NodeMCU开发板上的FLASH按键可以控制D3引脚的电平。</span></span><br><span class="line"><span class="comment"> 没有按下该按键时D3引脚将会保持高电平状态。当按下该按键后,</span></span><br><span class="line"><span class="comment"> D3引脚会变为低电平。</span></span><br><span class="line"><span class="comment">-----------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">修订历史/Revision History </span></span><br><span class="line"><span class="comment">日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description</span></span><br><span class="line"><span class="comment">***********************************************************************/</span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFi.h></span> <span class="comment">// 本程序使用 ESP8266WiFi库</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFiMulti.h></span> <span class="comment">// ESP8266WiFiMulti库</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WebServer.h></span> <span class="comment">// ESP8266WebServer库</span></span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">define</span> buttonPin D3 <span class="comment">// 按钮引脚D3</span></span></span><br><span class="line"> </span><br><span class="line">ESP8266WiFiMulti wifiMulti; <span class="comment">// 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'</span></span><br><span class="line"> </span><br><span class="line">ESP8266WebServer <span class="title function_">esp8266_server</span><span class="params">(<span class="number">80</span>)</span>;<span class="comment">// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)</span></span><br><span class="line"> </span><br><span class="line"><span class="type">bool</span> pinState; <span class="comment">// 存储引脚状态用变量</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span>{</span><br><span class="line"> Serial.begin(<span class="number">9600</span>); <span class="comment">// 启动串口通讯</span></span><br><span class="line"> </span><br><span class="line"> pinMode(buttonPin, INPUT_PULLUP); <span class="comment">// 将按键引脚设置为输入上拉模式</span></span><br><span class="line"> </span><br><span class="line"> wifiMulti.addAP(<span class="string">"ssid_from_AP_1"</span>, <span class="string">"your_password_for_AP_1"</span>); <span class="comment">// 将需要连接的一系列WiFi ID和密码输入这里</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"ssid_from_AP_2"</span>, <span class="string">"your_password_for_AP_2"</span>); <span class="comment">// ESP8266-NodeMCU再启动后会扫描当前网络</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"ssid_from_AP_3"</span>, <span class="string">"your_password_for_AP_3"</span>); <span class="comment">// 环境查找是否有这里列出的WiFi ID。如果有</span></span><br><span class="line"> Serial.println(<span class="string">"Connecting ..."</span>); <span class="comment">// 则尝试使用此处存储的密码进行连接。</span></span><br><span class="line"> </span><br><span class="line"> <span class="type">int</span> i = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">while</span> (wifiMulti.run() != WL_CONNECTED) { <span class="comment">// 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前</span></span><br><span class="line"> delay(<span class="number">1000</span>); <span class="comment">// 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU</span></span><br><span class="line"> Serial.print(i++); Serial.print(<span class="string">' '</span>); <span class="comment">// 将会连接信号最强的那一个WiFi信号。</span></span><br><span class="line"> } <span class="comment">// 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是</span></span><br><span class="line"> <span class="comment">// 此处while循环判断是否跳出循环的条件。</span></span><br><span class="line"> <span class="comment">// WiFi连接成功后将通过串口监视器输出连接成功信息 </span></span><br><span class="line"> Serial.println(<span class="string">'\n'</span>); <span class="comment">// WiFi连接成功后</span></span><br><span class="line"> Serial.print(<span class="string">"Connected to "</span>); <span class="comment">// NodeMCU将通过串口监视器输出。</span></span><br><span class="line"> Serial.println(WiFi.SSID()); <span class="comment">// 连接的WiFI名称</span></span><br><span class="line"> Serial.print(<span class="string">"IP address:\t"</span>); <span class="comment">// 以及</span></span><br><span class="line"> Serial.println(WiFi.localIP()); <span class="comment">// NodeMCU的IP地址</span></span><br><span class="line"> </span><br><span class="line"> esp8266_server.begin(); <span class="comment">// 启动网站服务 </span></span><br><span class="line"> esp8266_server.on(<span class="string">"/"</span>, handleRoot); <span class="comment">// 设置服务器根目录即'/'的函数'handleRoot'</span></span><br><span class="line"> esp8266_server.onNotFound(handleNotFound);<span class="comment">// 设置处理404情况的函数'handleNotFound' </span></span><br><span class="line"> </span><br><span class="line"> Serial.println(<span class="string">"HTTP esp8266_server started"</span>);<span class="comment">// 告知用户ESP8266网络服务功能已经启动</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span>{</span><br><span class="line"> esp8266_server.handleClient(); <span class="comment">// 处理http服务器访问</span></span><br><span class="line"> pinState = digitalRead(buttonPin); <span class="comment">// 获取引脚状态</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 以下函数处理网站首页的访问请求。此函数为本示例程序重点1</span></span><br><span class="line"><span class="comment">详细讲解请参见太极创客网站《零基础入门学用物联网》</span></span><br><span class="line"><span class="comment">第3章-第2节“通过网络服务将开发板引脚状态显示在网页中”的说明讲解。*/</span> </span><br><span class="line"><span class="type">void</span> <span class="title function_">handleRoot</span><span class="params">()</span> { </span><br><span class="line"> String displayPinState; <span class="comment">// 存储按键状态的字符串变量</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span>(pinState == HIGH){ <span class="comment">// 当按键引脚D3为高电平</span></span><br><span class="line"> displayPinState = <span class="string">"Button State: HIGH"</span>; <span class="comment">// 字符串赋值高电平信息</span></span><br><span class="line"> } <span class="keyword">else</span> { <span class="comment">// 当按键引脚D3为低电平</span></span><br><span class="line"> displayPinState = <span class="string">"Button State: LOW"</span>; <span class="comment">// 字符串赋值低电平信息</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> esp8266_server.send(<span class="number">200</span>, <span class="string">"text/plain"</span>, displayPinState); </span><br><span class="line"> <span class="comment">// 向浏览器发送按键状态信息 </span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">// 设置处理404情况的函数'handleNotFound'</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">handleNotFound</span><span class="params">()</span>{ <span class="comment">// 当浏览器请求的网络资源无法在服务器找到时,</span></span><br><span class="line"> esp8266_server.send(<span class="number">404</span>, <span class="string">"text/plain"</span>, <span class="string">"404: Not found"</span>); <span class="comment">// NodeMCU将调用此函数。</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="代码讲解"><a href="#代码讲解" class="headerlink" title="代码讲解"></a>代码讲解</h3><ul>
<li><p><code>digitalRead(buttonPin)</code></p>
<p>获取<code>buttonPin</code>的当前引脚状态</p>
</li>
</ul>
]]></content>
<categories>
<category>study</category>
<category>硬件</category>
</categories>
<tags>
<tag>esp8266</tag>
<tag>笔记</tag>
</tags>
</entry>
<entry>
<title>ESP8266的连接模式</title>
<url>/OLD_BLOG/2021/11/01/ESP8266%E7%9A%84%E8%BF%9E%E6%8E%A5%E6%A8%A1%E5%BC%8F/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>尝试使用esp8266去创建一个无线局域网环境以及连接到一个无线局域网。</p>
<p>本篇文章参考自太极创客的相关文章,作为博主笔记使用</p>
<span id="more"></span>
<h1 id="其他教程"><a href="#其他教程" class="headerlink" title="其他教程"></a>其他教程</h1><p><a href="http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/ap/">3-1-3 NodeMCU开发板的接入点模式</a></p>
<p><a href="http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/station/">3-1-4 NodeMCU开发板的无线终端模式</a></p>
<p><a href="https://www.bilibili.com/video/BV1L7411c7jw?p=5">【ESP8266教程】零基础入门学用物联网-基础知识篇(太极创客团队)</a></p>
<h1 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h1><h2 id="创建无线局域网示例代码"><a href="#创建无线局域网示例代码" class="headerlink" title="创建无线局域网示例代码"></a>创建无线局域网示例代码</h2><p>本代码复制于太极创客的示例代码,内容如下:</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">NodeMCU接入点模式</span></span><br><span class="line"><span class="comment">By 太极创客(http://www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">2019-03-11</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">此程序用于演示如何将NodeMCU以接入点模式工作。通过此程序,您可以使用</span></span><br><span class="line"><span class="comment">电脑或者手机连接NodeMCU所建立WiFi网络。</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">网络名: taichi-maker</span></span><br><span class="line"><span class="comment">密码:12345678</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">如需获得更多关于如何使用NodeMCU开发物联网的教程和资料信息</span></span><br><span class="line"><span class="comment">请参考太极创客网站(http://www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">并在首页搜索栏中搜索关键字:物联网</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFi.h></span> <span class="comment">// 本程序使用ESP8266WiFi库</span></span></span><br><span class="line"> </span><br><span class="line"><span class="type">const</span> <span class="type">char</span> *ssid = <span class="string">"taichi-maker"</span>; <span class="comment">// 这里定义将要建立的WiFi名称。此处以"taichi-maker"为示例</span></span><br><span class="line"> <span class="comment">// 您可以将自己想要建立的WiFi名称填写入此处的双引号中</span></span><br><span class="line"> </span><br><span class="line"><span class="type">const</span> <span class="type">char</span> *password = <span class="string">"12345678"</span>; <span class="comment">// 这里定义将要建立的WiFi密码。此处以12345678为示例</span></span><br><span class="line"> <span class="comment">// 您可以将自己想要使用的WiFi密码放入引号内</span></span><br><span class="line"> <span class="comment">// 如果建立的WiFi不要密码,则在双引号内不要填入任何信息</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span> {</span><br><span class="line"> Serial.begin(<span class="number">9600</span>); <span class="comment">// 启动串口通讯</span></span><br><span class="line"> </span><br><span class="line"> WiFi.softAP(ssid, password); <span class="comment">// 此语句是重点。WiFi.softAP用于启动NodeMCU的AP模式。</span></span><br><span class="line"> <span class="comment">// 括号中有两个参数,ssid是WiFi名。password是WiFi密码。</span></span><br><span class="line"> <span class="comment">// 这两个参数具体内容在setup函数之前的位置进行定义。</span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> Serial.print(<span class="string">"Access Point: "</span>); <span class="comment">// 通过串口监视器输出信息</span></span><br><span class="line"> Serial.println(ssid); <span class="comment">// 告知用户NodeMCU所建立的WiFi名</span></span><br><span class="line"> Serial.print(<span class="string">"IP address: "</span>); <span class="comment">// 以及NodeMCU的IP地址</span></span><br><span class="line"> Serial.println(WiFi.softAPIP()); <span class="comment">// 通过调用WiFi.softAPIP()可以得到NodeMCU的IP地址</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span> { </span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="连接到无线局域网示例代码"><a href="#连接到无线局域网示例代码" class="headerlink" title="连接到无线局域网示例代码"></a>连接到无线局域网示例代码</h2><figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">NodeMCU无线终端模式连接WiFi</span></span><br><span class="line"><span class="comment">By 太极创客(http://www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">2019-03-11</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">本示例程序用于演示如何使用NodeMCU无线终端模式连接WiFi</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">如需获得更多关于如何使用NodeMCU开发物联网的教程和资料信息</span></span><br><span class="line"><span class="comment">请参考太极创客网站(http://www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">并在首页搜索栏中搜索关键字:物联网</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFi.h></span> <span class="comment">// 本程序使用ESP8266WiFi库</span></span></span><br><span class="line"> </span><br><span class="line"><span class="type">const</span> <span class="type">char</span>* ssid = <span class="string">"taichi-maker"</span>; <span class="comment">// 连接WiFi名(此处使用taichi-maker为示例)</span></span><br><span class="line"> <span class="comment">// 请将您需要连接的WiFi名填入引号中</span></span><br><span class="line"><span class="type">const</span> <span class="type">char</span>* password = <span class="string">"12345678"</span>; <span class="comment">// 连接WiFi密码(此处使用12345678为示例)</span></span><br><span class="line"> <span class="comment">// 请将您需要连接的WiFi密码填入引号中</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span> {</span><br><span class="line"> Serial.begin(<span class="number">9600</span>); <span class="comment">// 启动串口通讯</span></span><br><span class="line"> </span><br><span class="line"> WiFi.begin(ssid, password); <span class="comment">// 启动网络连接</span></span><br><span class="line"> Serial.print(<span class="string">"Connecting to "</span>); <span class="comment">// 串口监视器输出网络连接信息</span></span><br><span class="line"> Serial.print(ssid); Serial.println(<span class="string">" ..."</span>); <span class="comment">// 告知用户NodeMCU正在尝试WiFi连接</span></span><br><span class="line"> </span><br><span class="line"> <span class="type">int</span> i = <span class="number">0</span>; <span class="comment">// 这一段程序语句用于检查WiFi是否连接成功</span></span><br><span class="line"> <span class="keyword">while</span> (WiFi.status() != WL_CONNECTED) { <span class="comment">// WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 </span></span><br><span class="line"> delay(<span class="number">1000</span>); <span class="comment">// 如果WiFi连接成功则返回值为WL_CONNECTED </span></span><br><span class="line"> Serial.print(i++); Serial.print(<span class="string">' '</span>); <span class="comment">// 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值</span></span><br><span class="line"> } <span class="comment">// 同时NodeMCU将通过串口监视器输出连接时长读秒。</span></span><br><span class="line"> <span class="comment">// 这个读秒是通过变量i每隔一秒自加1来实现的。</span></span><br><span class="line"> </span><br><span class="line"> Serial.println(<span class="string">""</span>); <span class="comment">// WiFi连接成功后</span></span><br><span class="line"> Serial.println(<span class="string">"Connection established!"</span>); <span class="comment">// NodeMCU将通过串口监视器输出"连接成功"信息。</span></span><br><span class="line"> Serial.print(<span class="string">"IP address: "</span>); <span class="comment">// 同时还将输出NodeMCU的IP地址。这一功能是通过调用</span></span><br><span class="line"> Serial.println(WiFi.localIP()); <span class="comment">// WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span> { </span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>在实际生活中,可能会需要多个wifi进行匹配连接,(例如学校和家里),因此需要创建多个WiFi存储,以下这个代码可以很好的解决这个问题:</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">NodeMCU无线终端模式连接WiFi-2</span></span><br><span class="line"><span class="comment">By 太极创客(http://www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">2019-03-11</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">此程序将会控制NodeMCU在当前的网络环境里搜索预先存储好的WiFi。</span></span><br><span class="line"><span class="comment">一旦找到预存的WiFi名称,NodeMCU将会使用预存的密码信息尝试连接该WiFi。</span></span><br><span class="line"><span class="comment">如果同时找到多个预存WiFi,NodeMCU将会尝试连接信号最强的WiFi。</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment">如需获得更多关于如何使用NodeMCU开发物联网的教程和资料信息</span></span><br><span class="line"><span class="comment">请参考太极创客网站(http://www.taichi-maker.com)</span></span><br><span class="line"><span class="comment">并在首页搜索栏中搜索关键字:物联网</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFi.h></span> <span class="comment">// 本程序使用ESP8266WiFi库</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ESP8266WiFiMulti.h></span> <span class="comment">// 本程序使用ESP8266WiFiMulti库</span></span></span><br><span class="line"> </span><br><span class="line">ESP8266WiFiMulti wifiMulti; <span class="comment">// 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span> {</span><br><span class="line"> Serial.begin(<span class="number">9600</span>); <span class="comment">// 启动串口通讯</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">//通过addAp函数存储 WiFi名称 WiFi密码</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"taichi-maker"</span>, <span class="string">"12345678"</span>); <span class="comment">// 这三条语句通过调用函数addAP来记录3个不同的WiFi网络信息。</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"taichi-maker2"</span>, <span class="string">"87654321"</span>); <span class="comment">// 这3个WiFi网络名称分别是taichi-maker, taichi-maker2, taichi-maker3。</span></span><br><span class="line"> wifiMulti.addAP(<span class="string">"taichi-maker3"</span>, <span class="string">"13572468"</span>); <span class="comment">// 这3个网络的密码分别是123456789,87654321,13572468。</span></span><br><span class="line"> <span class="comment">// 此处WiFi信息只是示例,请在使用时将需要连接的WiFi信息填入相应位置。</span></span><br><span class="line"> <span class="comment">// 另外这里只存储了3个WiFi信息,您可以存储更多的WiFi信息在此处。</span></span><br><span class="line"> </span><br><span class="line"> Serial.println(<span class="string">"Connecting ..."</span>); <span class="comment">// 通过串口监视器输出信息告知用户NodeMCU正在尝试连接WiFi</span></span><br><span class="line"> <span class="type">int</span> i = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">while</span> (wifiMulti.run() != WL_CONNECTED) { <span class="comment">// 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前</span></span><br><span class="line"> delay(<span class="number">1000</span>); <span class="comment">// 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU</span></span><br><span class="line"> Serial.print(<span class="string">'.'</span>); <span class="comment">// 将会连接信号最强的那一个WiFi信号。</span></span><br><span class="line"> } <span class="comment">// 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是</span></span><br><span class="line"> <span class="comment">// 此处while循环判断是否跳出循环的条件。</span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> Serial.println(<span class="string">'\n'</span>); <span class="comment">// WiFi连接成功后</span></span><br><span class="line"> Serial.print(<span class="string">"Connected to "</span>); <span class="comment">// NodeMCU将通过串口监视器输出。</span></span><br><span class="line"> Serial.println(WiFi.SSID()); <span class="comment">// 连接的WiFI名称</span></span><br><span class="line"> Serial.print(<span class="string">"IP address:\t"</span>); <span class="comment">// 以及</span></span><br><span class="line"> Serial.println(WiFi.localIP()); <span class="comment">// NodeMCU的IP地址</span></span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span> { </span><br><span class="line">}</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>study</category>
<category>硬件</category>
</categories>
<tags>
<tag>esp8266</tag>
<tag>笔记</tag>
</tags>
</entry>
<entry>
<title>Github Actions 相关教程</title>
<url>/OLD_BLOG/2022/04/17/GitHub%20Action%E6%95%99%E7%A8%8B/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://github.com/features/actions">GitHub Actions</a> 是 GitHub 的<a href="https://www.ruanyifeng.com/blog/2015/09/continuous-integration.html">持续集成服务</a>,于2018年10月<a href="https://github.blog/changelog/2018-10-16-github-actions-limited-beta/">推出</a>。其具有比较强大的功能,方便摸鱼</p>
<span id="more"></span>
<p>持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。</p>
<p>很多操作在不同项目里面是类似的,完全可以共享。GitHub 注意到了这一点,想出了一个很妙的点子,允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。</p>
<p>如果你需要某个 action,不必自己写复杂的脚本,直接引用他人写好的 action 即可,整个持续集成过程,就变成了一个 actions 的组合。这就是 GitHub Actions 最特别的地方。</p>
<h1 id="有关配置"><a href="#有关配置" class="headerlink" title="有关配置"></a>有关配置</h1><h2 id="配置Action-自动同步GitHub与Gitee仓库"><a href="#配置Action-自动同步GitHub与Gitee仓库" class="headerlink" title="配置Action 自动同步GitHub与Gitee仓库"></a>配置Action 自动同步GitHub与Gitee仓库</h2><p>参考Action的代码介绍 <a href="https://github.com/marketplace/actions/hub-mirror-action">点我</a></p>
<p>具体应用如下:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">on:</span><br><span class="line"> push:</span><br><span class="line"> <span class="comment"># 加入其方便进行推送仓库</span></span><br><span class="line"> <span class="comment"># 每天早上十点、晚上九点更新仓库内容</span></span><br><span class="line"> <span class="comment"># 使用的UTC时间,中国地区的时间是UTC+8</span></span><br><span class="line"> schedule:</span><br><span class="line"> - cron: <span class="string">'0 2 * * *'</span></span><br><span class="line"> - cron: <span class="string">'0 13 * * *'</span></span><br><span class="line">name: Update gitee</span><br><span class="line"><span class="built_in">jobs</span>:</span><br><span class="line"> run:</span><br><span class="line"> name: Sync-GitHub-to-Gitee</span><br><span class="line"> runs-on: ubuntu-latest</span><br><span class="line"> steps:</span><br><span class="line"> - name: Mirror the Github repos to Gitee.</span><br><span class="line"> uses: Yikun/hub-mirror-action@master</span><br><span class="line"> with:</span><br><span class="line"> src: github/ZHYCarge</span><br><span class="line"> dst: gitee/zhycarge</span><br><span class="line"> dst_key: <span class="variable">${{ secrets.GITEE_PRIVATE_KEY }</span>}</span><br><span class="line"> <span class="comment"># 你的Gitee私钥,需要找到一个可以连接到Gitee的私钥</span></span><br><span class="line"> dst_token: <span class="variable">${{ secrets.GITEE_TOKEN }</span>}</span><br><span class="line"> <span class="comment">#Gitee的tocken,具体创建方式可百度</span></span><br><span class="line"> <span class="comment">#static_list: 'test' # 静态名单,只更新里面的东西,其他不管</span></span><br><span class="line"> black_list: <span class="string">'test'</span> <span class="comment"># 黑名单,里面的东西不更新,其他的更新</span></span><br><span class="line"> <span class="comment">#white_list: '' # 白名单,只更新白名单里的东西</span></span><br><span class="line"> force_update: <span class="literal">false</span> <span class="comment"># 是否强制推送,如果不需要可以关掉【可选参数】</span></span><br><span class="line"> debug: <span class="literal">false</span> <span class="comment"># debug ?</span></span><br><span class="line"> <span class="comment">#mappings: 'hashes=>hashes_gitee'# 映射 可以不同步相同的名称</span></span><br></pre></td></tr></table></figure>
<h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul>
<li><a href="https://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html">GitHub Actions 入门教程</a></li>
<li><a href="https://github.com/marketplace/actions/hub-mirror-action">Hub Mirror Action</a></li>
</ul>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>Github Actions</tag>
</tags>
</entry>
<entry>
<title>GitHub配置其他域名</title>
<url>/OLD_BLOG/2021/09/10/GitHub%E9%85%8D%E7%BD%AE%E5%85%B6%E4%BB%96%E5%9F%9F%E5%90%8D/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于自己有多余的域名,其次感觉github的域名不太好,因此了解一下如何将自己的域名绑定到GitHub pages上</p>
<span id="more"></span>
<h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://blog.csdn.net/qq_34392457/article/details/89115236">GitHub Page绑定自己的域名</a></p>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="创建仓库"><a href="#创建仓库" class="headerlink" title="创建仓库"></a>创建仓库</h2><p>首先为了绑定域名,我们首先需要有一个github的pages的界面,而这个界面往往需要创建的时候是以<code>用户名.github.io</code>进行创建的,创建之后进入到仓库的设置中,将pages服务进行打开</p>
<p><img src="https://user-images.githubusercontent.com/40520292/132868839-389ee468-6421-46fd-9e21-a9c882da933b.png" alt="image"></p>
<h2 id="绑定域名"><a href="#绑定域名" class="headerlink" title="绑定域名"></a>绑定域名</h2><p>我们需要去域名服务商额外分配一个二级域名,这里以阿里云为例:</p>
<p>创建一个CNAME的域名解析,记录值即为<code>用户名.github.io</code></p>
<p>然后回到github的pages服务中,找到<code>Custom domain</code>选项,将其中输入框输入你刚刚创建的二级域名,然后稍等片刻,便发现解析成功</p>
<h1 id="尾言"><a href="#尾言" class="headerlink" title="尾言"></a>尾言</h1><p>受限于域名服务商的服务质量,可能你的域名需要十分钟左右的时间来进行解析,因此请保证每一次修改尝试的时候中间隔开了足够的时间,放置由于DNS的问题导致设置出现问题</p>
<p>如果多次刷新发现还是不行,建议换一个浏览器重新加载,因为浏览器的缓存数据可能对域名进行过保存,但是并未清除掉<br>请注意:如果使用的是GitHub的一键三连,那么需要更新 <code>_config.yml</code> 的相关文件,要不会访问不了<br>本人暂未配置成功,具体原因仍在探索</p>
]]></content>
<categories>
<category>study</category>
</categories>
<tags>
<tag>笔记</tag>
<tag>GitHub</tag>
</tags>
</entry>
<entry>
<title>Hadoop的基本搭建</title>
<url>/OLD_BLOG/2021/09/23/Hadoop%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%90%AD%E5%BB%BA/</url>
<content><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>尝试在课下搭建完成<code>hadoop</code>,较为详细的教程</p>
<span id="more"></span>
<h1 id="文章参考"><a href="#文章参考" class="headerlink" title="文章参考"></a>文章参考</h1><p><a href="https://note.youdao.com/web/#/file/recent/markdown/WEB89df9ee790282cb530f1e68be85e40da/4c44c3b7c9a6ee91c27ec456d9b38bc7">老师的有道云笔记</a></p>
<p><a href="https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html">老师上课发的链接</a></p>
<p><a href="http://dblab.xmu.edu.cn/blog/2441-2/">软工学子提供的链接,可参考</a><br><a href="https://www.runoob.com/linux/linux-vim.html">Vim的使用方法,不会的必须要看!!!!!!</a> </p>
<h1 id="前提准备"><a href="#前提准备" class="headerlink" title="前提准备"></a>前提准备</h1><ul>
<li>一台主机(云服务器or虚拟机)</li>
</ul>
<p>由于为了省事,就直接买了百度云18元3个月的云服务器(毕竟结束之后就不需要用了)</p>
<p>相关软件准备:</p>
<ul>
<li>ssh(必须)</li>
<li>vim(推荐)</li>
<li>其他在后续需要安装的</li>
</ul>
<h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="主机申请"><a href="#主机申请" class="headerlink" title="主机申请"></a>主机申请</h2><p>申请主机的过程就不叙述了,我的云主机配置如下:</p>
<p><img src="https://cdn.jsdelivr.net/gh/ZHYCarge/photo/image-20210923102824100.png" alt="image-20210923102824100"></p>
<h2 id="更换镜像(可选)"><a href="#更换镜像(可选)" class="headerlink" title="更换镜像(可选)"></a>更换镜像(可选)</h2><p>由于有些人使用的是自己的虚拟机,因此可能会出现镜像使用的是官方的镜像,因此下载以及安装速度可能会很慢,甚至会出现无法进行下载的可能。因此对于这种情况,可以考虑更换镜像文件进行切换,更换方式如下:</p>
<p><a href="https://zhycarge.github.io/2021/07/12/ubuntu%E6%8D%A2%E6%BA%90/">Ubuntu换源</a></p>
<h2 id="更新源"><a href="#更新源" class="headerlink" title="更新源"></a>更新源</h2><p>由于服务器是Ubuntu的,因此使用的是apt的包管理器,因此在使用前需要先更新软件库,否则会导致软件无法进行安装。命令如下:</p>
<p><code>apt update</code>检查是否拥有可更新的包</p>
<p><code>apt upgrade</code>安装更新包</p>
<h2 id="安装友好的交互式shell(推荐)"><a href="#安装友好的交互式shell(推荐)" class="headerlink" title="安装友好的交互式shell(推荐)"></a>安装友好的交互式shell(推荐)</h2><p>由于bash emmm一言难尽。。。因此需要安装一个比较友好的shell来进行替代,推荐两个,新手推荐安装fish:</p>
<ul>
<li>fish</li>
</ul>
<p>安装命令如下:</p>
<p><code>apt install fish</code></p>
<blockquote>
<p>请注意:fish有些语法与bash不通,一些语法在bash中可以运行但是在fish中不可以进行运行,因此在运行此类代码时需要先转换为bash环境进行运行(后面会出现),因此遇到此类问题,代码为斜体*<code>我是个例子</code>*</p>
</blockquote>
<ul>
<li>zsh</li>
</ul>
<p>安装命令如下:</p>
<p><code>apt install zsh</code></p>
<p>推荐配套安装[oh-my-zsh]</p>
<p><code>sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"</code></p>
<p>两款shell的对比:</p>
<ul>
<li><p>fish讲究的是开箱即用,因此基本不需要进行任何配置,直接使用就好,但是有些情况会不支持bash的语法(简单快捷)</p>
</li>
<li><p>zsh的配置要比fish要麻烦许多,但是有oh-my-zsh会好很多,感觉与arch一样,需要自己进行配置,不会与bash脚本产生冲突,配置好的zsh会比fish好用很多(深度发烧友喜爱)</p>
</li>
</ul>
<p>zsh的配置链接:<a href="https://zhuanlan.zhihu.com/p/35283688">oh-my-zsh配置</a></p>
<h2 id="安装vim-推荐"><a href="#安装vim-推荐" class="headerlink" title="安装vim(推荐)"></a>安装vim(推荐)</h2><p>不习惯nano以及vi,嗯. 安装命令如下:</p>
<p><code>apt install vim </code></p>
<h2 id="创建Hadoop用户"><a href="#创建Hadoop用户" class="headerlink" title="创建Hadoop用户"></a>创建Hadoop用户</h2><p>由于root用户是超级用户,并且后续配置可能会涉及到一些变量配置,为了系统安全,推荐创建一个新用户</p>
<ol>
<li>创建用户</li>
</ol>
<p><code>useradd -m hadoop -s /bin/bash</code></p>
<blockquote>
<p>如果配置了其他的shell,在后面的<code>/bin/bash</code>可以换成其他的</p>
</blockquote>
<ol start="2">
<li>设置帐号密码</li>
</ol>
<p><code>passwd hadoop</code></p>
<blockquote>
<p>linux中,密码不会外显,因此直接输入就好</p>
</blockquote>
<ol start="3">
<li>将此用户增加管理员权限</li>
</ol>
<p><code>sudo adduser hadoop sudo</code></p>
<ol start="4">
<li>使用hadoop用户登录</li>
</ol>
<p><code>su - hadoop</code></p>