CentOS 7 服务器搭建开源软件完整指南

全面涵盖笔记管理、博客搭建、监控面板、相册管理等常用开源软件部署方案

警告
本文最后更新于 2024-08-20,文中内容可能已过时。

概述

CentOS 7作为稳定的企业级Linux发行版,是搭建各类开源软件的理想选择。本指南涵盖了在CentOS 7环境下部署常用开源软件的全套解决方案,包括笔记管理、博客搭建、监控面板、相册管理等功能性应用。

本文档适合以下场景:

  • 个人知识管理和笔记记录
  • 博客网站搭建和维护
  • 服务器性能监控和可视化
  • 个人照片和媒体文件管理
  • 多平台笔记同步解决方案

Joplin Server 笔记同步服务

Joplin Server为开源笔记软件Joplin提供云同步服务,支持多设备笔记数据同步。

服务部署

创建专用目录和配置文件:

1
2
3
mkdir -p /data/joplin
cd /data/joplin
vim docker-compose.yml
 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
version: '3'
services:
    db:
        image: postgres:13
        volumes:
            - ./data/postgres:/var/lib/postgresql/data
        ports:
            - "5432:5432"
        restart: unless-stopped
        environment:
            - POSTGRES_PASSWORD=joplin
            - POSTGRES_USER=joplin
            - POSTGRES_DB=joplin
    app:
        image: joplin/server:latest
        depends_on:
            - db
        ports:
            - "22300:22300"
        restart: unless-stopped
        environment:
            - APP_PORT=22300
            - APP_BASE_URL=http://你的IP:22300
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=joplin
            - POSTGRES_DATABASE=joplin
            - POSTGRES_USER=joplin
            - POSTGRES_PORT=5432
            - POSTGRES_HOST=db

启动服务

1
2
3
4
5
# 启动容器
docker compose up -d

# 查看服务状态
docker compose ps

访问配置

  • 访问地址: http://你的IP:22300
  • 默认用户名: admin@localhost
  • 默认密码: admin

初始化设置

首次登录后需要修改默认密码,确保账户安全。

Joplin Server登录界面
(图1)

客户端同步配置

在Joplin桌面或移动端应用中配置同步参数:

  1. 打开Joplin应用,点击"工具"
  2. 在弹窗中点击"选项"
  3. 选择同步选项卡
  4. 输入服务器地址和认证信息
  5. 启动同步测试

Joplin客户端同步设置
(图2)

同步目标配置
(图3)

同步配置完成
(图4)

Hugo 静态博客生成器

Hugo是快速、灵活的静态网站生成器,适合搭建个人博客和文档网站。

Nginx环境配置

为Hugo博客配置带SSL的Nginx环境:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 安装Nginx依赖
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

# 下载Nginx源码
cd /任意目录A
wget http://nginx.org/download/nginx-1.15.9.tar.gz
tar -zxvf nginx-1.15.9.tar.gz
cd nginx-1.15.9

# 编译Nginx(启用SSL模块)
./configure --prefix=/任意目录B/nginx --with-http_ssl_module
make && make install
cd ..
rm -rf nginx-1.15.9  # 删除源码目录(安装已完成,留着占用空间)

# 配置环境变量
echo 'export NGINX_HOME=/任意目录B/nginx' >> /etc/profile
echo 'export PATH=$PATH:$NGINX_HOME/sbin' >> /etc/profile
source /etc/profile

# 验证安装
nginx -V

Git环境配置

如果是自己去 github 下载资源,再上传到服务器,不配 git 也可以

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 安装git
yum install git

# 配置git
git config --global user.name "your_user_name"
git config --global user.email "your_mail"

# 查看配置是否生效
git config --list

# 生成本地ssh key添加到github
ssh-keygen -t rsa -C "your_mail"

# 查看公钥
cat /root/.ssh/id_rsa.pub

# 进入github的settings设置,点击[SSH and GPG keys],添加公钥即可

# 验证是否配置成功
ssh git@github.com

Hugo安装配置

 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
cd /任意临时目录

# 下载Hugo扩展版
wget https://github.com/gohugoio/hugo/releases/download/v0.127.0/hugo_extended_0.127.0_Linux-64bit.tar.gz
tar xvf hugo_extended_0.127.0_Linux-64bit.tar.gz

# 移动到安装目录
cp ./hugo /任意目录A

cd /任意目录A

# 创建站点
hugo new site hugoblog
cd hugoblog

# 初始化Git仓库
git init

# 下载主题/手动上传(以FixIt主题为例)
git submodule add https://github.com/hugo-fixit/FixIt.git themes/FixIt

# 创建第一篇文章
hugo new content/posts/my-first-post.md

# 打开编辑文章后,要注意一点的是 draft 表示草稿的意思,应该把这里改为 false 或删除这段,不然文章即使写入也生成不了

# 本地预览网站效果,使用浏览器打开 http://localhost:1313 预览
# 如果你对预览效果满意,ctrl + c 停止,进入下一步。
# 如果不满意,编辑 config.toml 配置文件,再次预
hugo server -D --disableFastRender

# 构建 Hugo 网站,在 Hugo 网站文件夹的根目录下,执行 hugo 命令来构建
# 注意: Hugo 会将构建的网站内容默认保存至网站根目录的 public/ 文件夹中。 输入 hugo 的生成方式只会往 public 文件夹里添加内容,但是不会删除外部已经不存在而 public 里面还存在的文件,
# 所以一般用 hugo -F --cleanDestinationDir 命令,表示每次生成的 public 都是全新的,会覆盖原来的。
hugo

hugo -F --cleanDestinationDir

Nginx配置示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
    listen       80;
    server_name  你的域名;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name 你的域名;
  
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        root   /任意目录A/hugoblog/public;
        index  index.html index.htm;
    }
}

Hugo配置文件

  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
# +-----------------------------------+
# |             主题配置              |
# +-----------------------------------+
baseURL = 'https://你的域名/'
languageCode = 'zh-cn'
title = ''                                # 这个配置可以让导航栏的logo和主页的logo在鼠标放上是显示PiLiQiu,而不是图片本身的名称
theme = "FixIt-0.4.0-alpha.1"             # 主题名称
defaultContentLanguage = 'zh-cn'          # 文章页面的预计阅读时间、多少字、右侧的"目录"两个字显示为中文,不添加这个设置,都会显示英文
mainSections = ["posts"]                  # 不设置默认是内容最多的一种

[params]
  version = "0.4.0-alpha.1"               # FixIt 主题版本
  Description = "记录美好生活"              # 网站描述
  keywords = ["piliqiu", "PiLiQiu"]       # 网站关键词
  DefaultTheme = "auto"                   # 网站默认主题样式
  Fingerprint = "sha256"                  # 哪种哈希函数用来 SRI
  DateFormat = "2006-01-02"               # 日期格式 
  Images = ["/preview.png"]               # 网站图片(用于 Open Graph 和 Twitter Cards)
  EnablePWA = false                       # 开启 PWA 支持(开启后,页面会有一堆js、cs报404)
  capitalizeTitles = true                 # 是否大写标题
  ExternalIcon = true                     # 是否自动显示外链图标
  WithSiteTitle = true                    # 是否在每个页面标题中添加网站标题,记得在 hugo.toml 中设置网站标题 (例如 title = "title")
  titleDelimiter = "-"                    # 当网站标题被添加到每个页面标题时的标题分隔符
  indexWithSubtitle = false               # 是否在主页标题中添加网站副标题,请记得通过 params.header.subtitle.name 设置网站副标题
  summaryPlainify = false                 # 是否显示纯文本摘要
  enableTranslationMerge = false          # 是否启用从其他语言合并缺失翻译的功能
  disableThemeInject = false              # FixIt 在主页的 HTML 头中注入主题元标记


  # +---------------------------------+
  # |             作者配置             |
  # +---------------------------------+
  [params.author]
    name = "PiLiQiu"
    email = ""
    link = "https://piliqiu.com/"
    avatar = "/favicon-96x96.png"




  # +-----------------------------------------+
  # |              app应用图标配置             |
  # |              (与前面的pwa有关联)         |
  # +-----------------------------------------+
  [params.app]
    name = "PiLiQiu"            # title 当添加到 iOS 主屏幕或者 Android 启动器时的标题,覆盖默认标题
    shortName = ""
    noFavicon = false           # 是否隐藏网站图标资源链接
    svgFavicon = "/favicon.svg" # 更现代的 SVG 网站图标,可替代旧的 .png 和 .ico 文件
    iconColor = "#5bbad5"       # Safari 图标颜色
    tileColor = "#da532c"       # Windows v8-10 磁贴颜色
    
    [params.app.themeColor]     # Android 浏览器主题色
      light = "#f8f8f8"         # light: 浅色主题颜色,默认:#f8f8f8
      dark = "#252627"          # dark: 深色主题颜色,默认:#252627




  # +---------------------------------+
  # |             搜索配置             |
  # +---------------------------------+
  # 为了生成搜索功能所需要的 search.json, 请在你的站点配置中添加 search 输出文件类型到 outputs 部分的 home 字段中
  [params.search]
    enable = true                         # 是否启用搜索
    type = "fuse"                         # 搜索引擎的类型,可选值:algolia、fuse,默认:fuse
    contentLength = 4000                  # 文章内容最长索引长度
    placeholder = "搜索文章标题或内容……"     # 搜索框的占位提示语
    maxResultLength = 10                  # 最大结果数目
    snippetLength = 30                    # 结果内容片段长度
    highlightTag = "em"                   # 搜索结果中高亮部分的 HTML 标签
    absoluteURL = false                   # 是否在搜索索引中使用基于 baseURL 的绝对路径

    [params.search.fuse]                  # Fuse 搜索配置
      isCaseSensitive = false             # 是否区分大小写,默认:false
      minMatchCharLength = 2              # 最小匹配字符长度,默认:2
      findAllMatches = false              # 是否查找所有匹配项,默认:false
      location = 0                        # 位置,默认:0
      threshold = 0.3                     # 阈值,默认:0.3
      distance = 100                      # 距离,默认:100
      ignoreLocation = false              # 是否忽略位置,默认:false
      useExtendedSearch = false           # 是否使用扩展搜索,默认:false
      ignoreFieldNorm = false             # 是否忽略字段规范化,默认:false


  # +------------------------------------------+
  # |             页面头部导航栏配置             |
  # +------------------------------------------+
  [params.header]
    desktopMode = "sticky"                      # 桌面端导航栏模式
    mobileMode = "auto"                         # 移动端导航栏模式

    [params.header.title]                       # 页面头部导航栏标题配置
      logo = "/web-app-manifest-512x512.png"    # LOGO 的 URL
      name = ""                                 # 标题名称
      pre = ""                                  # 在名称之前添加其他信息
      post = ""                                 # 在名称之后添加其他信息
      typeit = false                            # 是否为标题显示打字机动画

    [params.header.subtitle]                    # 页面头部导航栏副标题配置
      name = ""                                 # 副标题名称
      typeit = false                            # 是否为副标题显示打字机动画




  # +---------------------------------------+
  # |             面包屑导航配置             |
  # +---------------------------------------+
  [params.breadcrumb]
    enable = true
    sticky = true             # 是否固定面包屑导航
    showHome = true           # 是否显示主页链接
    separator = "/"           # 分隔符
    capitalize = false        # 是否大写面包屑导航



  # +-------------------------------------+
  # |             文章导航配置             |
  # +-------------------------------------+
  [params.navigation]
    inSection = false           # 是否在 section 页面范围内显示文章导航
    reverse = false             # 是否反转 下一篇 / 上一篇 文章导航顺序




  # +----------------------------------------+
  # |             页面底部信息配置             |
  # +----------------------------------------+
  [params.footer]
    enable = true
    copyright = true                    # 是否显示版权信息
    author = true                       # 是否显示作者
    since = "2023"                      # 网站创立年份
    gov = ""                            # 公网安备信息
    icp = '<a href="https://beian.miit.gov.cn" target="_blank">豫ICP备xxxxxx号-1</a>'
    license = '<a rel="license external nofollow noopener noreferrer" href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a>'
    
    [params.footer.powered]             # Hugo 和主题信息
      enable = true                     # 是否显示 Hugo 和主题信息
      hugoLogo = false                  # 是否显示 Hugo Logo
      themeLogo = false                 # 是否显示主题 Logo
      
      
    [params.footer.siteTime]            # 网站创立时间
      enable = false
      animate = true                    # 是否显示动画
      icon = "fa-solid fa-heartbeat"    # 图标
      pre = ""                          # 前缀
      value = ""                        # 网站创立时间
      
      
    [params.footer.order]               # 页面底部行排序
      powered = 0                       # Hugo 和主题信息
      copyright = 0                     # 版权信息
      statistics = 0                    # 统计信息
      visitor = 0                       # 访客信息
      beian = 0                         # 备案信息



  # +-------------------------------------+
  # |             归档页面配置             |
  # +-------------------------------------+
  [params.archives]
    paginate = 20           # 归档页面每页显示文章数量,默认:20
    dateFormat = "01-02"    # 日期格式,默认:01-02



  # +----------------------------------------------------+
  # |             Section-(所有文章)页面配置             |
  # +----------------------------------------------------+
  [params.section]
    paginate = 20           # 归档页面每页显示文章数量,默认:20
    dateFormat = "01-02"    # 日期格式,默认:01-02
    
    [params.section.feed]   # Section feed 配置用于 RSS, Atom 和 JSON feed
      limit = -1            # 包含在 feed 中的文章数目。如果设置为 -1,代表所有文章。
      fullText = false      # 是否在 feed 中显示全文内容。


  # +---------------------------------------------------+
  # |              List(目录或标签)页面配置             |
  # +---------------------------------------------------+
  [params.list]
    paginate = 20           # list 页面每页显示文章数量,默认:20
    dateFormat = "01-02"    # 日期格式,默认:01-02
    
    [params.list.feed]
      limit = -1
      fullText = false




  # +----------------------------------------+
  # |             最近更新文章设置             |
  # +----------------------------------------+
  [params.recentlyUpdated]
    archives = true             # 是否在归档页面显示最近更新文章,默认:true
    section = true              # 是否在 section 页面显示最近更新文章,默认:true
    list = true                 # 是否在 list 页面显示最近更新文章,默认:true
    days = 30                   # 最近更新文章的天数,默认:30
    maxCount = 10               # 最大文章数目,默认:10



  # +-----------------------------------+
  # |             标签云配置             |
  # +-----------------------------------+
  [params.tagcloud]
    enable = true               # 是否启用标签云,默认:false
    min = 14                    # 最小字体大小,单位:px,默认:14
    max = 32                    # 最大字体大小,单位:px,默认:32
    peakCount = 10              # 每个标签的最大文章数,默认:10
    orderby = "name"            # 标签排序方式,可选值:name、count,默认:name


  # +---------------------------------+
  # |             主页配置             |
  # +---------------------------------+
  [params.home]
    paginate = 10                                             # RSS 文章数目,默认:10
    
    [params.home.profile]                                    # 主页个人信息配置
      enable = true                                          # 是否显示个人信息,默认:false
      gravatarEmail = ""                                     # Gravatar 邮箱,用于优先在主页显示的头像
      avatarURL = "/coding.png"                              # 主页显示头像的 URL
      avatarMenu = ""                                        # 头像菜单链接的 identifier
      title = ""                                             # 主页显示的网站标题(支持 HTML 格式)
      subtitle = "不积跬步,无以至千里;不积小流,无以成江海。"     # 主页显示的网站副标题
      typeit = true                                           # 是否为副标题显示打字机动画,默认:true
      social = false                                          # 是否显示社交账号,默认:true
      disclaimer = ""                                         # 免责声明(支持 HTML 格式)
    
    [params.home.posts]   # 主页文章列表配置
      enable = true       # 是否显示文章列表,默认:true
      paginate = 6        # 主页每页显示文章数量,默认:6



  # +---------------------------------------+
  # |             打字机动画配置             |
  # +---------------------------------------+
  [params.typeit]
    speed = 100           # 打字速度,默认:100
    cursorSpeed = 1000    # 光标速度,默认:1000
    cursorChar = "|"      # 光标字符,默认:|
    duration = -1         # 动画持续时间,默认:-1
    loop = false          # 是否循环播放,默认:false




  # +----------------------------------------+
  # |             shortcode 配置             |
  # +----------------------------------------+
  # Mermaid 是一个基于Javascript的图表绘制库,它允许在Markdown文件中使用简单的文本语法来描述图表,
  # 并在网页中渲染成SVG图表。Mermaid支持多种图表类型,包括流程图、时序图、类图等
  [params.repoVersion]
    url = "https://github.com/hugo-fixit/FixIt/releases/tag/v"
    name = "FixIt"


  # +--------------------------------------+
  # |             Mermaid 配置             |
  # +--------------------------------------+
  [params.mermaid]
    cdn = ""                          # 核心脚本地址
    zenuml = ""                       # ZenUML 脚本地址
    themes = ["default", "dark"]
    securityLevel = "loose"           # 图表的安全级别 ["strict", "loose", "antiscript", "sandbox"]
    look = "handDrawn"                # 图表的外观样式 ["classic", "handDrawn"]
    fontFamily = ""                   # 图表的字体
    layoutLoaders = []                # 图表的字体
    layout = "dagre"                  # 图表的默认布局算法



  # +--------------------------------------+
  # |             PanguJS 配置             |
  # +--------------------------------------+
  # 主要是为了在博客页面中优化中文文本的显示效果,特别是在处理中文与英文、数字混排时的间距问题。
  # PanguJS 是一个轻量级的 JavaScript 库,它可以在不改变原有 HTML 结构的情况下,智能地在中文、英文、数字之间添加适当的空格,使得文本的阅读体验更加舒适
  [params.pangu]
    enable = false          # 是否启用 PanguJS,默认:false
    selector = "article"    # 选择器,默认:article



  # +---------------------------------+
  # |             水印配置             |
  # +---------------------------------+
  [params.watermark]
    enable = false
    content = ""
    opacity = 0.1
    width = 150
    height = 20
    rowSpacing = 60
    colSpacing = 30
    rotate = 15
    fontSize = 0.85
    fontFamily = "inherit"


  # +----------------------------------------+
  # |             JSON 查看器配置             |
  # +----------------------------------------+
  [params.jsonViewer]
    enable = true
    expandDepth = 1
    copyable = true
    sort = false
    boxed = true

  # +----------------------------------------+
  # |             不蒜子计数器配置             |
  # +----------------------------------------+
  [params.busuanzi]
    enable = true                         # 是否启用不蒜子计数器,默认:false
    source = "https://vercount.one/js"    # 不蒜子计数器核心脚本地址。默认:https://vercount.one/js。支持 Vercount, 不蒜子, etc.
    siteViews = true                      # 是否显示网站访问量,默认:true
    pageViews = true                      # 是否显示页面访问量,默认:true



  # +-------------------------------------+
  # |             网站验证代码             |
  # +-------------------------------------+
  # 涉及将不同平台(如Google、Bing、Yandex等)提供的验证代码添加到博客的HTML模板中,以便这些平台能够验证博客的所有权
  # 需要在相应的平台(如Google Search Console)上注册你的网站,并按照提示获取验证代码
  [params.verification]
    google = ""
    bing = ""
    yandex = ""
    pinterest = ""
    baidu = ""
    so = ""
    sogou = ""



  # +----------------------------------+
  # |             SEO 配置             |
  # +----------------------------------+
  [params.seo]
    image = "/preview.png"          # 网站默认图片
    thumbnailUrl = "/preview.png"   # 网站缩略图 URL




  # +-------------------------------------+
  # |             网站分析配置             |
  # +-------------------------------------+
  # 收集、分析和理解网站访问者的行为和趋势,从而帮助网站所有者或管理员优化网站性能、提升用户体验,并最终实现业务目标
  [params.analytics]
    enable = false
    [params.analytics.google]
      id = ""
      anonymizeIP = true
    [params.analytics.fathom]
      id = ""
      server = ""
        [params.analytics.baidu]
      id = ""
    [params.analytics.umami]
      data_website_id = ""
      src = ""
      data_host_url = ""
      data_domains = ""
    [params.analytics.plausible]
      data_domain = ""
      src = ""
    [params.analytics.cloudflare]
      token = ""
    [params.analytics.splitbee]
      enable = false
      no_cookie = true
      do_not_track = true
      data_token = ""




  # +----------------------------------------+
  # |             Cookie 许可配置             |
  # +----------------------------------------+
  [params.cookieconsent]
    enable = false                                                # 是否启用 Cookie Consent,默认:true
    
    [params.cookieconsent.content]                                # 用于 Cookie 许可横幅的文本字符串
      message = "本网站使用 Cookies 来改善您的浏览体验。"              # Cookie 许可横幅的消息
      dismiss = "同意"                                             # Cookie 许可横幅的关闭按钮文本
      link = "了解更多"                                             # Cookie 许可横幅的链接文本


  # +----------------------------------+
  # |             CDN 配置             |
  # +----------------------------------+
  # CDN通过在全球范围内部署边缘节点服务器,将内容缓存到离用户最近的节点,从而减少数据传输时间,提高访问速度
  [params.cdn]
    data = ""



  # +------------------------------------+
  # |             兼容性设置             |
  # +------------------------------------+
  [params.compatibility]
    polyfill = false    # 是否使用 Polyfill.io 来兼容旧式浏览器,默认:false
    objectFit = false   # 是否使用 object-fit-images 来兼容旧式浏览器,默认:false



  # +---------------------------------------+
  # |             Gravatar 配置             |
  # +---------------------------------------+
  [params.gravatar]
    enable = false
    host = "www.gravatar.com"
    style = ""



  # +------------------------------------------+
  # |             返回顶部按钮配置             |
  # +------------------------------------------+
  [params.backToTop]
    enable = true           # 是否启用返回顶部按钮,默认:true
    scrollpercent = true    # 是否显示滚动百分比,默认:false



  # +----------------------------------------+
  # |             阅读进度条配置             |
  # +----------------------------------------+
  [params.readingProgress]
    enable = true             # 是否启用阅读进度条,默认:false
    start = "left"            # 阅读进度条开始位置,可选值:left、right,默认:left
    position = "top"          # 阅读进度条位置,可选值:top、bottom,默认:top
    reversed = false          # 是否反转阅读进度条,默认:false
    light = ""                # 浅色主题颜色,默认:""
    dark = ""                 # 深色主题颜色,默认:""
    height = "2px"            # 阅读进度条高度,默认:2px





  # +-------------------------- ----------------------+
  # |             页面加载期间顶部的进度条             |
  # +-------------------------------------------------+
  [params.pace]
    enable = true       # 是否启用 Pace.js,默认:false
    color = "blue"      # 进度条颜色,可选值:black、blue、green、orange、pink、purple、red、silver、white、yellow,默认:blue
    theme = "minimal"   # 进度条主题,可选值:barber-shop、big-counter、bounce、center-atom、center-circle、center-radar、center-simple、corner-indicator、fill-left、flash、flat-top、loading-bar、mac-osx、material、minimal,默认:minimal




  # +------------------------------------------------------------------+
  # |             全局 Feed 配置用于 RSS, Atom 和 JSON feed             |
  # +------------------------------------------------------------------+
  [params.feed]
    # 包含在 feed 中的文章数目。如果设置为 -1,代表所有文章。
    limit = 10
    # 是否在 feed 中显示全文内容。
    fullText = true
    
    [params.feed.follow]
      feedId = ""
      userId = ""


  # +--------------------------------------+
  # |                 图片配置              |
  # +--------------------------------------+
  [params.image]
  cacheRemote = true        # 是否缓存远程图片以获得更好的优化效果
  optimise = true           # 是否对图片进行缩放和优化





  # +--------------------------------------+
  # |             文章页面配置              |
  # +--------------------------------------+
  [params.page]
    authorAvatar = true               #  是否启用文章作者头像
    hiddenFromHomePage = false        #  是否在主页隐藏一篇文章
    hiddenFromSearch = false          #  是否在搜索结果中隐藏一篇文章
    hiddenFromRelated = false         #  是否在相关文章中隐藏一篇文章
    hiddenFromFeed = false            #  是否在 RSS、Atom 和 JSON feed 中隐藏一篇文章
    twemoji = false                   #  是否使用 twemoji
    
    #  是否使用 lightgallery
    # 设为 true,图片设置标题时,文章中的图片将以画廊形式呈现,例如:![alt](src "title")
    # 设为 "force",无论图片是否设置标题文章中的图片都将强制按照画廊形式呈现,例如:![alt](src)
    lightgallery = true
    ruby = true                       # 是否使用 ruby 扩展语法
    fraction = true                   # 是否使用 fraction 扩展语法
    fontawesome = true                # 是否使用 fontawesome 扩展语法
    
    # 许可协议信息(支持 HTML 格式)
    license = '<a rel="license external nofollow noopener noreferrer" href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a>'
    linkToMarkdown = false            #  是否显示原始 Markdown 文档内容的链接
    linkToSource = false              #  是否显示查看文章源码的链接
    linkToEdit = false                #  是否显示编辑文章的链接
    linkToReport = false              #  是否显示报告文章问题的链接
    linkToVscode = true               #  是否显示在 VSCode 中查看文章的链接
    pageStyle = "normal"              #  页面样式 ["narrow", "normal", "wide", ...]
    
    #  开启自动书签支持
    autoBookmark = false              #  如果为 true,则在关闭页面时保存阅读进度
    wordCount = true                  #  是否使用字数统计
    readingTime = true                #  是否使用预计阅读
    endFlag = ""                      #  文章结束标志
    instantPage = true                #  是否开启即时页面(预加载)
    collectionList = true             #  是否在侧边栏显示集合列表
    collectionNavigation = true       #  是否在文章末尾显示集合导航

    [params.page.repost]              #  转载配置
      enable = false
      url = ""
    
    [params.page.toc]                 #  目录配置
      enable = true                   #  是否使用目录
      keepStatic = false              #  是否保持使用文章前面的静态目录
      auto = true                     #  是否使侧边目录自动折叠展开
      position = "right"              #  目录位置 ["left", "right"]
      ordered = false                 #  取代 `markup.tableOfContents` 设置
      startLevel = 2
      endLevel = 6
      decreaseH1 = false              #  是否降低内容中的 H1 标题级别
    
    [params.page.expirationReminder]  #  在文章开头显示提示信息,提醒读者文章内容可能过时
      enable = true
      reminder = 90                   #  如果文章最后更新于这天数之前,显示提醒
      warning = 180                   #  如果文章最后更新于这天数之前,显示警告
      closeComment = false            #  如果文章到期是否关闭评论
    
    [params.page.heading]             #  页面标题配置
      capitalize = false              #  是否自动大写标题
      
      [params.page.heading.number]    #  必须设置 `params.page.toc.ordered` 为 true
        enable = false                #  是否启用自动标题编号
        [params.page.heading.number.format]
          h1 = "{title}"
          h2 = "{h2} {title}"
          h3 = "{h2}.{h3} {title}"
          h4 = "{h2}.{h3}.{h4} {title}"
          h5 = "{h2}.{h3}.{h4}.{h5} {title}"
          h6 = "{h2}.{h3}.{h4}.{h5}.{h6} {title}"
    
    [params.page.code]                #  代码块包装器配置,需要搭配 markup 并指定 version 版本才会生效
      enable = true                   #  是否启用代码块包装器
      copy = true                     #  是否显示代码块包装器的复制按钮
      edit = true                     #  是否显示代码块包装器的编辑按钮
      maxShownLines = 10              #  默认展开显示的代码行数
    
    # 数学公式配置
    # See http://fixit.lruihao.cn/documentation/content-management/markdown-syntax/extended/#formula
    [params.page.math]
      enable = true
      type = "katex"                                    # 数学公式渲染引擎,可选值:["katex", "mathjax"]
      # KaTeX server-side rendering (https://katex.org)
      # KaTeX partial config: https://gohugo.io/functions/transform/tomath/#options
      [params.page.math.katex]
        # KaTeX extension copy-tex
        copyTex = true
        throwOnError = false
        errorColor = "#ff4949"
        # custom macros map
        # syntax: <macro> = <definition>
        [params.page.math.katex.macros]
          # "\\f" = "#1f(#2)"   # usage: $\f{a}{b}$
      # MathJax server-side rendering (https://www.mathjax.org)
      # MathJax config: https://docs.mathjax.org/en/latest/options/index.html
      [params.page.math.mathjax]
        cdn = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"
        [params.page.math.mathjax.packages]
          # "[+]" = ["configmacros"]
        # custom macros map
        # syntax: <macro> = <definition>
        [params.page.math.mathjax.macros]
          # "bold" = ["{\\bf #1}", 1]   # usage: $\bold{math}$
        [params.page.math.mathjax.loader]
          load = ["ui/safe"]
          [params.page.math.mathjax.loader.paths]
            # custom = "https://cdn.jsdelivr.net/gh/sonoisa/XyJax-v3@3.0.1/build/"
          # more loader config e.g source, dependencies, provides etc.
        [params.page.math.mathjax.options]
          enableMenu = true
          # HTML tags that won't be searched for math
          skipHtmlTags = [
            "script",
            "noscript",
            "style",
            "textarea",
            "pre",
            "code",
            "math",
            "select",
            "option",
            "mjx-container"
          ]
          # class that marks tags not to search
          ignoreHtmlClass = "mathjax_ignore"
          # HTML tags that can appear within math
          [params.page.math.mathjax.options.includeHtmlTags]
            # "#comment" = ""
            # br = "\n"
            # wbr = ""
    
    [params.page.mapbox]                                    #  Mapbox GL JS 配置 (https://docs.mapbox.com/mapbox-gl-js)
      accessToken = ""                                      #  Mapbox GL JS 的 access token
      lightStyle = "mapbox://styles/mapbox/light-v11"       #  浅色主题的地图样式
      darkStyle = "mapbox://styles/mapbox/dark-v11"         #  深色主题的地图样式
      navigation = true                                     #  是否添加 NavigationControl
      geolocate = true                                      #  是否添加 GeolocateControl
      scale = true                                          #  是否添加 ScaleControl
      fullscreen = true                                     #  是否添加 FullscreenControl
    
    [params.page.cacheRemoteImages]           #  [试验性功能] 缓存图床图片到本地,详见:https://github.com/hugo-fixit/FixIt/pull/362
      enable = false
      replace = false                         # 用本地图片链接替换远程图片链接 (放置在 public/images/remote/)
    
    [params.page.related]                     #  相关内容配置 (https://gohugo.io/content-management/related/)
      enable = false
      count = 5
    
    [params.page.reward]                      #  赞赏设置
      enable = false
      animation = false
      position = "after"                      # 相对于页脚的位置,可选值:["before", "after"]
      # comment = "Buy me a coffee"
      #  二维码图片展示模式,可选值:["static", "fixed"],默认:`static`
      mode = "static"
      [params.page.reward.ways]
        # wechatpay = "/images/wechatpay.png"
        # alipay = "/images/alipay.png"
        # paypal = "/images/paypal.png"
        # bitcoin = "/images/bitcoin.png"
    
    [params.page.share]           # 文章页面的分享信息设置
      enable = false
      Twitter = false
      Facebook = false
      Linkedin = false
      Whatsapp = false
      Pinterest = false
      Tumblr = false
      HackerNews = false
      Reddit = false
      VK = false
      Buffer = false
      Xing = false
      Line = false
      Instapaper = false
      Pocket = false
      Flipboard = false
      Weibo = false
      Myspace = false
      Blogger = false
      Baidu = false
      Odnoklassniki = false
      Evernote = false
      Skype = false
      Trello = false
      Mix = false
    

    [params.page.library]             #  第三方库配置
      [params.page.library.css]
        # someCSS = "some.css"
        # 位于 "assets/"
        # 或者
        # someCSS = "https://cdn.example.com/some.css"
      [params.page.library.js]
        # someJavascript = "some.js"
        # 位于 "assets/"
        # 或者
        # someJavascript = "https://cdn.example.com/some.js"
    
    [params.page.seo]                 #  页面 SEO 配置
      images = []                     #  图片 URL
      [params.page.seo.publisher]     #  出版者信息
        name = ""
        logoUrl = ""







# +-----------------------------------------------------------+
# |             自定义输出格式(和搜索框搭配使用)             |
# +-----------------------------------------------------------+
# 为了生成搜索功能所需要的 search.json, 请在你的站点配置中添加 search 输出文件类型到 outputs 部分的 home 字段中
# outputs 配置是用来定义哪些输出格式应该为网站的不同部分(如首页、页面、区段、分类、术语等)所生成。是指Hugo在构建网站时应该生成哪些类型的文件。
# home:定义了当Hugo处理你的网站首页时,应该生成哪些输出格式。在这个例子中,它将生成HTML(用于网页)、RSS(用于RSS订阅)、JSON(可能用于某种数据输出或API)、archives(可能是一个归档页面或特定于你使用的主题的输出)和offline(可能是用于生成一个适合离线查看的版本或特定的备份格式,这也可能依赖于你使用的Hugo主题)。
# page:定义了当你为页面(除了首页和区段页面)构建内容时,应该生成哪些输出格式。在这个例子中,它将生成HTML和Markdown(虽然Markdown通常不用于最终输出,可能是用于某种特殊目的或中间步骤)。
# section:定义了当你为区段(如/blog/或/projects/)构建内容时,应该生成哪些输出格式。在这个例子中,它将生成HTML和RSS。
# taxonomy:定义了当你为分类(如标签或类别)构建内容时,应该生成哪些输出格式。在这个例子中,它将生成HTML。
# term:定义了当你为术语(分类中的具体项,如某个特定的标签或类别)构建内容时,应该生成哪些输出格式。在这个例子中,它将生成HTML和RSS。
[outputs]
  home = ["html", "rss", "archives", "offline", "search"]
  page = ["html", "markdown"]
  section = ["html", "rss"]
  taxonomy = ["html"]
  term = ["html", "rss"]





# +-----------------------------------------------------+
# |             解析配置(和代码配置搭配使用)             |
# +-----------------------------------------------------+
# 参考网址:https://gohugo.io/getting-started/configuration-markup/
# 参考网址:https://fixit.lruihao.cn/zh-cn/documentation/content-management/markdown-syntax/extended/#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7
# -------------------------------------------------------------------------------------
# 需要指定 version 版本才会生效
[markup]
  # ------自定义属性------
  [markup.goldmark]

    [markup.goldmark.parser]
        # ------文章底部的?动画需要这个属性------
        [markup.goldmark.parser.attribute]
          block = true
          title = true
    
    [markup.goldmark.renderer]
      unsafe = true

    # ------下划线、标记文本、下标 和 上标 语法------
    [markup.goldmark.extensions]
      strikethrough = false
      # https://gohugo.io/getting-started/configuration-markup/#extras
      [markup.goldmark.extensions.extras]
        [markup.goldmark.extensions.extras.delete]
          enable = true
        [markup.goldmark.extensions.extras.insert]
          enable = true
        [markup.goldmark.extensions.extras.mark]
          enable = true
        [markup.goldmark.extensions.extras.subscript]
          enable = true
        [markup.goldmark.extensions.extras.superscript]
          enable = true

  [markup.highlight]
    codeFences = true
    lineNos = true
    lineNumbersInTable = true
    noClasses = false

# +-----------------------------------+
# |             分类法配置             |
# +-----------------------------------+
[taxonomies]
  category = "categories"
  tag = "tags"
  collection = "collections"




# +-----------------------------------+
# |             菜单配置              |
# +-----------------------------------+

[menu]
  # ----> 菜单1 <----
  [[menu.main]]
    identifier = "posts"
    # 父级菜单项的标识符 (identifier)
    parent = ""
    # 你可以在名称(允许 HTML 格式)之前添加其他信息,例如图标
    pre = '<i class="fa-regular fa-newspaper fa-fw fa-sm" aria-hidden="true"></i>'
    # 你可以在名称(允许 HTML 格式)之后添加其他信息,例如图标
    post = ""
    name = "文章"
    url = "/posts"
    # 当你将鼠标悬停在此菜单链接上时,将显示的标题
    title = ""
    weight = 1
    #  向菜单项添加用户定义的内容
    [menu.main.params]
      # 添加 CSS 类到菜单项
      class = ""
      # 是否为草稿菜单,类似草稿页面
      draft = false
      # 添加 fontawesome 图标到菜单项
      icon = ""
      # 设置菜单项类型,可选值:["mobile", "desktop"]
      type = ""
      # 是否显示子菜单项分割线
      divided = false


  # ----> 菜单2 <----
  [[menu.main]]
    identifier = "guides"
    parent = ""
    pre = '<i class="fa-regular fa-compass fa-fw fa-sm" aria-hidden="true"></i>'
    post = ''
    name = "教程"
    url = "/guides"
    title = ""
    weight = 2


  # ----> 菜单3 <----
  [[menu.main]]
    identifier = "note"
    parent = ""
    pre = '<i class="fa-solid fa-circle-nodes fa-fw fa-sm" aria-hidden="true"></i>'
    post = ''
    name = "笔记"
    url = ""
    title = ""
    weight = 3


  # ----> 菜单3-子菜单1 <----
  [[menu.main]]
    identifier = "java"
    parent = "note"
    pre = '<i class="fa-brands fa-java"></i>'
    post = ""
    name = "java"
    url = "/java"
    title = ""
    weight = 1


  # ----> 菜单3-子菜单2 <----
  [[menu.main]]
    identifier = "Python"
    parent = "note"
    pre = '<i class="fa-brands fa-python"></i>'
    post = ""
    name = "python"
    url = "/python"
    title = ""
    weight = 2


  # ----> 菜单3-子菜单3 <----
  [[menu.main]]
    identifier = "前端"
    parent = "note"
    pre = '<i class="fa-brands fa-html5"></i>'
    post = ""
    name = "html"
    url = "/html"
    title = ""
    weight = 3


  # ----> 菜单4 <----
  [[menu.main]]
    identifier = "arrange"
    parent = ""
    pre = '<i class="fa-solid fa-archive fa-fw fa-sm"></i>'
    post = ''
    name = "归档"
    url = ""
    title = ""
    weight = 4


  # ----> 菜单4-子菜单1 <----
  [[menu.main]]
    identifier = "category"
    parent = "arrange"
    pre = '<i class="fa-solid fa-folder-tree fa-fw fa-sm"></i>'
    post = ""
    name = "分类"
    url = "/categories"
    title = ""
    weight = 1


  # ----> 菜单4-子菜单2 <----
  [[menu.main]]
    identifier = "archive"
    parent = "arrange"
    pre = '<i class="fa-solid fa-layer-group fa-fw fa-sm"></i>'
    post = ""
    name = "合集"
    url = "/archives"
    title = ""
    weight = 3


  # ----> 菜单4-子菜单3 <----
  [[menu.main]]
    identifier = "tag"
    parent = "arrange"
    pre = '<i class="fa-solid fa-tags fa-fw fa-sm"></i>'
    post = ""
    name = "标签"
    url = "/tags"
    title = ""
    weight = 3

依赖库问题解决

如果遇到GLIBCXX版本问题:

 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
# [root@hecs-344585 bin]# hugo new site hugoblog
# hugo: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by hugo)
# hugo: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by hugo)
# hugo: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by hugo)

# 查看当前的版本
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

# 执行命令升级
sudo yum provides libstdc++.so.6

cd /任意临时目录

# 下载最新版本的libstdc.so_.6.0.26
sudo wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip

# 解压
unzip libstdc.so_.6.0.26.zip

# 将下载的最新版本拷贝到 /usr/lib64
cp libstdc++.so.6.0.26 /usr/lib64

cd  /usr/lib64

# 查看 /usr/lib64 下 libstdc++.so.6 链接的版本
ls -l | grep libstdc++

# 删除/usr/lib64 原来的软连接 libstdc++.so.6,删除之前先备份一份
sudo rm libstdc++.so.6

# 链接新的版本
sudo ln -s libstdc++.so.6.0.26 libstdc++.so.6

# 查看新版本,成功
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

Netdata 系统监控面板

Netdata提供实时的系统性能监控和可视化界面。

快速安装

1
2
3
4
5
# 下载安装脚本(使用任意临时目录)
wget -O /任意临时目录/netdata-kickstart.sh https://my-netdata.io/kickstart.sh

# 执行安装
sh /任意临时目录/netdata-kickstart.sh

Netdata安装过程1
(图5)

Netdata安装过程2
(图6)

Netdata安装过程3
(图7)

Netdata安装过程4
(图8)

Netdata安装过程5
(图9)

Netdata安装完成
(图10)

服务管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 启动/停止服务
systemctl start netdata
systemctl stop netdata
systemctl restart netdata

# 设置开机自启
systemctl enable netdata

# 查看服务状态
systemctl status netdata

# 查看实时日志
journalctl -u netdata -f

# 卸载(如果需要)
./netdata-uninstaller.sh --force

访问配置

  • 默认端口: 19999
  • 访问地址: http://你的IP:19999

配置文件管理

1
2
3
4
5
# 获取默认配置文件
wget -O /etc/netdata/netdata.conf http://localhost:19999/netdata.conf

# 修改默认端口
vim /etc/netdata/netdata.conf
1
2
[web]
    default port = 你的自定义端口

内核同页合并(KSM)优化

KSM可以显著减少内存使用,特别适合虚拟化环境:

1
2
3
4
5
6
# 启用KSM
# /sys/kernel/mm/ksm/run 是一个可写的文件,用于控制KSM是否激活,向该文件写入 1 表示启用 KSM,而写入 0 则表示禁用 KSM
echo 1 > /sys/kernel/mm/ksm/run

# 设置 KSM 扫描和合并页面时的休眠时间(以毫秒为单位)。/sys/kernel/mm/ksm/sleep_millisecs 文件允许你调整 KSM 在两次扫描尝试合并相同页面之间的等待时间
echo 1000 > /sys/kernel/mm/ksm/sleep_millisecs

创建systemd服务使KSM配置持久化:

1
sudo vim /etc/systemd/system/ksm-settings.service
1
2
3
4
5
6
7
8
9
[Unit]  
Description=Set KSM parameters  

[Service]  
Type=oneshot  
ExecStart=/bin/bash -c 'echo 1 > /sys/kernel/mm/ksm/run; echo 1000 > /sys/kernel/mm/ksm/sleep_millisecs'  

[Install]  
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
# 重新加载 systemd 的守护进程(daemon)配置
sudo systemctl daemon-reload

# 设置开机启动
sudo systemctl enable ksm-settings.service

# 重启服务器,并检查这些设置是否按预期被设置
cat /sys/kernel/mm/ksm/run  
cat /sys/kernel/mm/ksm/sleep_millisecs

在 netdata 右侧的列表中,如果 Memory -> ksm 能找到,代表 ksm 已开启,如果找不到 ksm,代表没有开启

KSM监控状态
(图11)

中文界面配置

繁体中文界面

1
2
# 下载繁体中文包
git clone https://github.com/jasoncheng7115/netdata-cpatch.git

简体中文界面

1
2
# 下载简体中文包
git clone https://github.com/YuanzhuL/netdata-cpatch.git
1
2
3
4
# 将这 4 个文件复制到目标路径下覆盖
cp -r netdata-cpatch/* /usr/share/netdata/web/

# 刷新页面应用中文界面

中文界面配置1
(图12)

jQuery版本兼容性修复

中文界面效果
(图13)

检查当前Netdata使用的jQuery版本:

1
2
cd /usr/share/netdata/web/lib
ls jquery*

修改dashboard.js文件中的jQuery版本号:

jQuery版本检查
(图14)

修改jQuery版本
(图15)

PhotoPrism 个人相册管理

PhotoPrism是功能强大的个人照片管理和AI识别相册解决方案。

环境准备

1
2
3
4
5
6
7
# 安装Docker
yum install -y docker
systemctl start docker
systemctl enable docker

# 安装Docker Compose
yum install -y docker-compose

配置文件部署

1
2
3
4
5
6
7
8
9
# 创建项目目录
mkdir /home/photoprism
cd /home/photoprism

# 下载官方配置
wget https://dl.photoprism.app/docker/docker-compose.yml

# 编辑配置文件
vim docker-compose.yml

修改关键配置项:

1
2
3
4
5
6
# 站点URL配置
PHOTOPRISM_SITE_URL: "http://你的域名:2342/"

# 存储路径映射
volumes:
  - "/你的图片目录:/photoprism/originals"

服务启动

1
2
3
4
5
6
7
8
# 后台启动服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

访问配置

  • 默认端口: 2342
  • 访问地址: http://你的IP:2342/
  • 管理员账户: 配置文件中指定

PhotoPrism登录界面
(图16)

密码修改

首次登录后应立即修改默认密码:

修改登录密码
(图17)

图片索引管理

将图片文件上传到配置的存储目录,然后在PhotoPrism中建立索引:

资料库索引管理
(图18)

优势

  • 保持原始文件结构
  • 只建立索引不移动文件
  • 便于后期备份和维护

Trilium Notes 层级笔记系统

Trilium Notes提供强大的层级笔记管理和多实例支持功能。

项目信息

下载安装

方式一:SSH上传

通过SSH工具将安装包上传至服务器

安装包上传
(图19)

方式二:直接下载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 下载中文版服务器端
wget https://github.com/Nriver/trilium-translation/releases/download/v0.55.1_20220922/trilium-cn-linux-x64-server.zip

# 安装解压工具
yum install -y unzip zip

# 解压文件
unzip trilium-cn-linux-x64-server.zip

# 移动到安装目录
sudo mv trilium-linux-x64-server /任意目录/trilium

# 通过 ./trilium.sh 启动

依赖库问题解决

GLIBCXX版本问题

 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
# 查看当前的版本
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

# 执行命令升级
sudo yum provides libstdc++.so.6

cd /任意临时目录

# 下载最新版本的libstdc.so_.6.0.26
sudo wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip

# 解压
unzip libstdc.so_.6.0.26.zip

# 将下载的最新版本拷贝到 /usr/lib64
cp libstdc++.so.6.0.26 /usr/lib64

cd /usr/lib64

# 查看 /usr/lib64 下 libstdc++.so.6 链接的版本
ls -l | grep libstdc++

# 删除/usr/lib64 原来的软连接 libstdc++.so.6,删除之前先备份一份
sudo rm libstdc++.so.6

# 链接新的版本
sudo ln -s libstdc++.so.6.0.26 libstdc++.so.6

# 查看新版本,成功
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

系统工具缺失

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 安装bison (These critical programs are missing or too old: bison)
sudo yum install bison

# 升级make命令 (make 命令版本过低,升级 make 命令)
cd /任意临时目录
wget http://ftp.gnu.org/pub/gnu/make/make-4.3.tar.gz
tar -zxvf make-4.3.tar.gz 
cd make-4.3
./configure --prefix=/usr
make && make install
make -v

# 升级bison
cd /任意临时目录
wget http://ftp.gnu.org/pub/gnu/bison/bison-3.0.5.tar.gz
tar -zxvf bison-3.0.5.tar.gz
cd bison-3.0.5
./configure
make && make install
bison --version

GCC版本升级

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 启用Developer Tools
yum -y install centos-release-scl
yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils

# 启用新版本GCC (这个只是暂时的,当你的 shell 关闭后或者重启就会恢复原来的版本)
scl enable devtoolset-8 bash

# 永久启用
echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile
source /etc/bashrc

# 查看GCC版本
gcc --version
g++ --version

SCL源问题解决

由于CentOS 7的SCL源已停止维护,需要配置阿里云镜像:

1
2
3
4
5
6
7
# 备份原有配置
cd /etc/yum.repos.d/
mv CentOS-SCLo-scl.repo CentOS-SCLo-scl.repo.bak
mv CentOS-SCLo-scl-rh.repo CentOS-SCLo-scl-rh.repo.bak

# 创建新的配置文件
vim CentOS-SCLo-rh.repo
1
2
3
4
5
6
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

GLIBC版本问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 安装更高版本glibc
cd /任意临时目录
# 官方网站:https://ftp.gnu.org/gnu/glibc/
# 清华镜像:https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/
wget http://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz
tar -zxvf glibc-2.29.tar.gz
cd glibc-2.29
# 创建 build 目录 (代码运行需要 build 目录),进入 build 目录后,再进行后面的操作
mkdir build
cd build

# 注意:--prefix=/usr 不可修改,只能是 --prefix=/usr,否则安装不成功,后面坑一堆!
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin  
make && make install

# 验证安装
ll /lib64/libc*
strings /lib64/libc.so.6 | grep GLIBC

服务配置

创建systemd服务文件:

1
vim /etc/systemd/system/trilium.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[Unit]
Description=Trilium Daemon
After=syslog.target network.target
    
[Service]
Type=simple
ExecStart=/xxx/trilium/trilium.sh
WorkingDirectory=/xxx/trilium/
RestartSec=5s
TimeoutStopSec=20s
Restart=on-failure
    
[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
systemctl start trilium     # 启动服务
systemctl stop trilium      # 停止服务
systemctl restart trilium   # 重新启动服务
systemctl status trilium    # 查看服务启动状态
journalctl -u trilium       # 查看服务日志
systemctl enable trilium    # 设置开机启动
systemctl disable trilium   # 取消开机启动

访问配置

服务启动后通过 IP:8080 访问管理界面:

Trilium启动界面
(图20)

客户端安装

Windows客户端

解压 trilium-cn-windows-x64.zip 后直接运行 .exe 文件

如果之前安装过原版,需要清理缓存:

1
2
3
# 删除用户数据目录
# Windows: C:\Users\用户名\AppData\Roaming\
# 删除 Trilium Notes、trilium-data 文件夹

Linux客户端

解压 trilium-cn-linux-x64.tar.gz 后运行可执行文件

数据管理

数据文件说明

  • document.db: 所有笔记内容
  • config.ini: 软件设置文件
  • backup/: 自动备份目录
  • log/: 日志文件目录

数据存储位置

  • Windows客户端: C:\Users\用户名\AppData\Roaming\trilium-data
  • Linux客户端: /home/用户名/.local/share/trilium-data
  • Mac客户端: /Users/用户名/Library/ApplicationSupport/trilium-data
  • Linux服务器: /home/用户名/trilium-data
  • Docker: 与docker-compose.yml同目录的trilium-data文件夹

自定义数据目录

Linux环境变量方式:

1
export TRILIUM_DATA_DIR=/path/to/your/custom/directory

Windows批处理文件 (startWindows.bat):

在 trilium 安装目录下,创建一个 startWindows.bat 文件 (编码格式 utf-8),内容如下所示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
@echo off
::这几句是为防止乱码的
REM 
chcp 65001
CLS
echo =====当前的Trilium数据存储位置环境变量是=====
set TRILIUM_DATA_DIR

echo =====重新设置Trilium数据存储位置环境变量=====
::这个 H:\ProgramFiles\my-trilium-data 可以替换成 你想要的 位置
::这样每次启动就用 指定的 临时 环境变量
set TRILIUM_DATA_DIR=H:\ProgramFiles\my-trilium-data

echo =====修改后Trilium数据存储位置环境变量是=====
set TRILIUM_DATA_DIR

echo =====后台启动trilium=====
start /b trilium.exe

/images/guides/CentOS7服务器搭建开源软件完整指南/21.png

Linux Shell脚本 (startLinux.sh):

在 trilium-linux 安装目录下,创建一个 startLinux.sh 文件,内容如下所示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/sh
echo "=====当前的Trilium数据存储位置环境变量是====="
echo $TRILIUM_DATA_DIR
echo "=====重新设置Trilium数据存储位置环境变量====="
export TRILIUM_DATA_DIR=/media/shijunzhi/TOSHIBA/ProgramFiles/my-trilium-data
echo "=====修改后Trilium数据存储位置环境变量是====="
echo $TRILIUM_DATA_DIR
echo "=====后台启动Trilium====="
nohup ./trilium &
# trilium 程序的输出内容在当前目录的 nohup.out 文件中

多实例配置

Windows双开配置

创建两个批处理文件:

startWindowsWork.bat:

1
2
3
set TRILIUM_DATA_DIR=H:\ProgramFiles\work-trilium-data
set TRILIUM_PORT=8090
start /b trilium.exe

startWindowsLife.bat:

1
2
3
set TRILIUM_DATA_DIR=H:\ProgramFiles\life-trilium-data
set TRILIUM_PORT=8100
start /b trilium.exe

Linux双开配置

创建两个Shell脚本:

startLinuxWork.sh:

1
2
3
export TRILIUM_DATA_DIR=/media/user/Work/trilium-data
export TRILIUM_PORT=8090
nohup ./trilium &

startLinuxLife.sh:

1
2
3
export TRILIUM_DATA_DIR=/media/user/Life/trilium-data
export TRILIUM_PORT=8100
nohup ./trilium &

数据备份恢复

备份策略

Trilium提供三种自动备份:

  • 每日备份: backup-daily.db
  • 每周备份: backup-weekly.db
  • 每月备份: backup-monthly.db

手动备份

在Trilium界面中点击"立即备份"创建当前时点的备份文件

数据恢复流程

  1. 停止Trilium服务

    1
    
    systemctl stop trilium
  2. 备份当前数据文件

    1
    2
    3
    
    mv trilium-data/document.db trilium-data/document.db.backup
    mv trilium-data/document.db-wal trilium-data/document.db-wal.backup
    mv trilium-data/document.db-shm trilium-data/document.db-shm.backup
  3. 恢复备份文件

    1
    2
    
    cp trilium-data/backup/backup-weekly.db trilium-data/document.db
    chmod 600 trilium-data/document.db
  4. 重启服务

    1
    
    systemctl start trilium

注意事项:

  • 如配置了同步功能,需要在所有同步节点执行相同操作
  • 恢复备份会覆盖当前所有数据,请提前做好当前数据备份
  • 定期测试备份文件的完整性

WordPress 动态博客系统

WordPress是全球最流行的内容管理系统,适合搭建功能丰富的博客和网站。

LNMP环境搭建

使用LNMP (Linux + Nginx + MySQL + PHP) 架构部署WordPress:

MySQL数据库配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 登录MySQL
mysql -uroot -p你的密码

# 创建WordPress数据库
CREATE DATABASE wordpress DEFAULT CHARACTER SET UTF8;

# 创建专用用户
# 用户名:admin
# 密码:admin123
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin123';

# 授权wordpress数据库所有表的访问权限
GRANT ALL ON wordpress.* to 'admin'@'localhost';

# 刷新权限
FLUSH PRIVILEGES;

# 退出MySQL
EXIT;

关闭防火墙

1
2
systemctl stop firewalld.service
systemctl disable firewalld.service

WordPress安装部署

文件部署

1
2
3
4
5
6
7
8
# 解压WordPress
unzip wordpress-6.4.1-zh_CN.zip

# 重命名目录
mv wordpress-6.4.1-zh_CN wordpress

# 移动到Nginx目录
mv wordpress /usr/local/nginx/html/

Nginx配置

修改nginx.conf配置文件:

Nginx配置修改
(图22)

将网站根目录改为:

1
root html/wordpress;

这样前端在访问时,输入的地址是:IP:端口,而不是 IP:端口/wordpress

权限设置

1
2
3
# 设置网站目录权限
chmod -R 755 /usr/local/nginx/html/
chown -R www:www wordpress

服务启动

1
2
3
4
5
6
# 重载Nginx配置
nginx -s reload

# 启动Nginx服务
systemctl start nginx
systemctl enable nginx

WordPress初始化

访问 http://你的IP/wp-admin/setup-config.php 进行在线初始化配置

问题解决

主题上传问题

如果无法上传主题,提示需要FTP信息,这一般是用户组的问题,在 ngnix.conf 中第一行查看用户组名,发现用户组是 www www,而 wordpress 文件夹的用户组为 root,那我们就将 wordpress 文件夹的用户组改为 www www

1
2
# 修改文件所有者
chown -R www:www wordpress

域名配置优化

修改Nginx配置支持域名访问:

域名配置
(图23)

WordPress地址设置问题: 发现设置域名后,只有访问首页地址栏显示的是 域名,访问其它页面地址栏显示的仍是 ip,网上的方案都是在 设置-常规 中修改 WordPress地址站点地址,我采用这种方法后,发现虽然访问任何页面,它的地址栏显示的都是域名,但是页面的样式加载不出来,这是因为页面样式仍是通过 ip 获取的

解决方案: 在当前主题目录 /usr/local/nginx/html/wordpress/wp-content/themes/ 下的 functions.php 文件中添加:

1
2
update_option('siteurl','http://你的域名.com');
update_option('home','http://你的域名.com');

然后,再次访问后台会发现 WordPress地址站点地址 自己变了,变成了 http://piliqiu.com,此时访问任何页面地址栏显示的都是域名,并且样式也可以加载出来了

地址配置
(图24)

伪静态配置

WordPress后台设置

在WordPress后台"设置-固定链接"中配置伪静态:

伪静态设置
(图25)

Nginx伪静态规则

在nginx.conf的location块中添加:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
location / {
    index index.html index.php;
    if (-f $request_filename/index.html){
        rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename/index.php){
        rewrite (.*) $1/index.php;
    }
    if (!-f $request_filename){
        rewrite (.*) /index.php;
    }
}

Nginx伪静态配置
(图26)

应用配置

1
2
3
# 重载Nginx配置
nginx -s reload
systemctl restart nginx

防盗链配置

配置Nginx防盗链

在nginx.conf中添加防盗链规则:

防盗链配置
(图27)

1
2
3
4
valid_referers 你的域名.com;
if ($invalid_referer) {
    return 401;
}

注意: if( 之间必须有空格

防盗链页面配置

创建401.html页面:

401页面配置
(图28)

指定错误页面路径:

错误页面路径
(图29)

配置资源引用路径:

401.html 需要依靠其他的 css、js 文件

而在 nginx.conf 文件中,root html/wordpress,所以,默认是从 html/wordpress 这个层级开始找的,所以,js、css 的位置从这层目录开始

资源路径配置
(图30)

HTML资源引用示例:

HTML资源引用
(图31)

CSS样式路径调整:

CSS路径配置
(图32)

总结

本文档提供了一套完整的CentOS 7开源软件部署解决方案,涵盖了:

  1. 笔记管理: Joplin Server、Trilium Notes
  2. 博客搭建: Hugo、WordPress
  3. 系统监控: Netdata
  4. 相册管理: PhotoPrism

每个解决方案都包含了详细的安装、配置、优化和故障排查指南,适合个人用户和小型团队快速搭建稳定的服务器应用环境。

部署建议:

  • 根据实际需求选择合适的软件组合
  • 在生产环境部署前先在测试环境验证
  • 定期更新和备份,确保系统安全稳定
  • 根据使用情况调整配置参数优化性能

0%