-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
512 lines (271 loc) · 287 KB
/
atom.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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>星辰大海</title>
<subtitle>立德、立功、立言</subtitle>
<link href="http://xsea.cc/atom.xml" rel="self"/>
<link href="http://xsea.cc/"/>
<updated>2023-05-25T12:58:48.582Z</updated>
<id>http://xsea.cc/</id>
<author>
<name>Liuh</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>Centos7.9防火墙配置</title>
<link href="http://xsea.cc/2023/05/62f1cb3f.html"/>
<id>http://xsea.cc/2023/05/62f1cb3f.html</id>
<published>2023-05-09T06:13:39.000Z</published>
<updated>2023-05-25T12:58:48.582Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>在 CentOS 7 中,可以使用 <code>firewalld</code> 命令来管理防火墙,包括放开指定端口</p></blockquote><span id="more"></span><p>在 CentOS 7 中,可以使用 <code>firewalld</code> 命令来管理防火墙,包括放开指定端口。下面是放开指定端口的步骤:</p><ol><li>首先,检查防火墙的状态,确认是否正在运行。可以使用以下命令:</li></ol><pre><code>sudo systemctl status firewalld</code></pre><p>如果防火墙正在运行,则会输出 <code>active (running)</code> 。如果防火墙没有运行,则可以使用以下命令启动防火墙:</p><pre><code>sudo systemctl start firewalld</code></pre><ol start="2"><li>放开指定端口。例如,要放开 8080 端口,可以使用以下命令:</li></ol><pre><code>sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent</code></pre><p>其中, <code>--zone=public</code> 表示将规则应用于公共区域, <code>--add-port=8080/tcp</code> 表示放开 8080 端口的 TCP 协议连接, <code>--permanent</code> 表示将规则永久保存。执行完该命令后,需要重新加载防火墙规则才能生效,可以使用以下命令:</p><pre><code>sudo firewall-cmd --reload</code></pre><ol start="3"><li>查看已经放开的端口。可以使用以下命令查看当前已经放开的端口:</li></ol><pre><code>sudo firewall-cmd --zone=public --list-ports</code></pre><p>如果输出中包含 <code>8080/tcp</code> ,则表示已经成功放开了 8080 端口。</p><p>注意:在放开端口之前,需要确保该端口是需要开放的,并且已经配置好了相关服务。同时,也要注意安全问题,只开放必要的端口,并设置合适的防火墙规则。</p>]]></content>
<summary type="html"><blockquote>
<p>在 CentOS 7 中,可以使用 <code>firewalld</code> 命令来管理防火墙,包括放开指定端口</p>
</blockquote></summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Centos" scheme="http://xsea.cc/tags/Centos/"/>
<category term="防火墙" scheme="http://xsea.cc/tags/%E9%98%B2%E7%81%AB%E5%A2%99/"/>
<category term="firewall" scheme="http://xsea.cc/tags/firewall/"/>
</entry>
<entry>
<title>Centos7.9安装typecho</title>
<link href="http://xsea.cc/2023/04/6f80e107.html"/>
<id>http://xsea.cc/2023/04/6f80e107.html</id>
<published>2023-04-11T15:07:31.000Z</published>
<updated>2023-05-25T12:58:48.582Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="centos79安装typecho"><a class="markdownIt-Anchor" href="#centos79安装typecho">#</a> Centos7.9 安装 typecho</h1><blockquote><p>简介<br>环境信息:<br>系统: Centos 7.9<br>PHP: 8.2.4<br>Typecho: 1.2.0</p></blockquote><span id="more"></span><h2 id="一-安装php-824环境"><a class="markdownIt-Anchor" href="#一-安装php-824环境">#</a> 一、安装 PHP (8.2.4) 环境</h2><h3 id="安装必要依赖包"><a class="markdownIt-Anchor" href="#安装必要依赖包">#</a> 安装必要依赖包</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum <span class="token function">install</span> <span class="token parameter variable">-y</span> bzip2-devel libcurl-devel libxml2-devel sqlite-devel oniguruma oniguruma-devel libxml2 libxml2-devel <span class="token function">bzip2</span> bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel zstd libzstd-devel <span class="token function">curl</span> libcurl-devel libpng libpng-devel</pre></td></tr></table></figure><h3 id="检查-libzip-版本"><a class="markdownIt-Anchor" href="#检查-libzip-版本">#</a> 检查 libzip 版本</h3><p>libzip 版本要求: <code>libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0... </code></p><p>使用以下命令,查看当前安装版本</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">rpm</span> <span class="token parameter variable">-q</span> libzip</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">rpm</span> <span class="token parameter variable">-q</span> libzip-devel</pre></td></tr></table></figure><p>如果有且版本不符合,卸载</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum remove libzip-devel libzip</pre></td></tr></table></figure><p>重新从官网下载源码并编译安装</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment">#下载安装</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">wget</span> https://libzip.org/download/libzip-1.3.2.tar.gz</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> libzip-1.3.2.tar.gz</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token builtin class-name">cd</span> libzip-1.3.2</pre></td></tr><tr><td data-num="5"></td><td><pre>./configure</pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token function">make</span> <span class="token operator">&&</span> <span class="token function">make</span> <span class="token function">install</span></pre></td></tr></table></figure><p>安装完成后,查看是否存在 /usr/local/lib/pkgconfig 目录,如果存在,执行如下命令来设置 PKG_CONFIG_PATH:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token builtin class-name">export</span> <span class="token assign-left variable">PKG_CONFIG_PATH</span><span class="token operator">=</span><span class="token string">"/usr/local/lib/pkgconfig/"</span></pre></td></tr></table></figure><h3 id="从官网下载-php-源码包"><a class="markdownIt-Anchor" href="#从官网下载-php-源码包">#</a> 从官网下载 PHP 源码包</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">wget</span> https://www.php.net/distributions/php-8.2.4.tar.gz</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 解压</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> php-8.2.4.tar.gz</pre></td></tr></table></figure><h3 id="configure-配置及安装"><a class="markdownIt-Anchor" href="#configure-配置及安装">#</a> ./configure 配置及安装</h3><p>安装目录: <code>/usr/local/php-8</code></p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token builtin class-name">cd</span> php-8.2.4</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 配置</span></pre></td></tr><tr><td data-num="3"></td><td><pre>./configure <span class="token parameter variable">--prefix</span><span class="token operator">=</span>/usr/local/php-8 --enable-fpm --with-pgsql --with-mysqli --enable-mbstring --with-bz2 --with-curl --enable-gd --with-zip --with-zlib --with-openssl --without-pear --disable-phar</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># make, -j 选项用于控制多进程的并发度。-j 指定的是线程的数量,-j2 表示最多启动 2 个线程</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token function">make</span> <span class="token parameter variable">-j2</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token function">make</span> <span class="token function">install</span></pre></td></tr></table></figure><h3 id="配置环境变量"><a class="markdownIt-Anchor" href="#配置环境变量">#</a> 配置环境变量</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment">#设置环境变量</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">touch</span> /etc/profile.d/php.sh</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">chmod</span> <span class="token number">755</span> /etc/profile.d/php.sh </pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">'\nexport PATH=/usr/local/php-8/bin:$PATH\n'</span> <span class="token operator">>></span> /etc/profile.d/php.sh</pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token builtin class-name">source</span> /etc/profile.d/php.sh</pre></td></tr><tr><td data-num="6"></td><td><pre></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># 执行 php -v 查看版本</span></pre></td></tr><tr><td data-num="8"></td><td><pre>php <span class="token parameter variable">-v</span></pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token operator">>></span> PHP <span class="token number">8.2</span>.4 <span class="token punctuation">(</span>cli<span class="token punctuation">)</span> <span class="token punctuation">(</span>built: Apr <span class="token number">11</span> <span class="token number">2023</span> <span class="token number">22</span>:32:28<span class="token punctuation">)</span> <span class="token punctuation">(</span>NTS<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token operator">>></span> Copyright <span class="token punctuation">(</span>c<span class="token punctuation">)</span> The PHP Group</pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token operator">>></span> Zend Engine v4.2.4, Copyright <span class="token punctuation">(</span>c<span class="token punctuation">)</span> Zend Technologies</pre></td></tr></table></figure><h3 id="复制配置文件到正确的路径"><a class="markdownIt-Anchor" href="#复制配置文件到正确的路径">#</a> 复制配置文件到正确的路径</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 在源代码目录 php-8.2.4 中下执行以下命令</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token builtin class-name">cd</span> php-8.2.4</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">cp</span> php.ini-production /usr/local/php-8/lib/php.ini</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token function">cp</span> /usr/local/php-8/etc/php-fpm.conf.default /usr/local/php-8/etc/php-fpm.conf</pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token function">cp</span> /usr/local/php-8/etc/php-fpm.d/www.conf.default /usr/local/php-8/etc/php-fpm.d/www.conf</pre></td></tr></table></figure><h3 id="配置php-fpm服务开机启动"><a class="markdownIt-Anchor" href="#配置php-fpm服务开机启动">#</a> 配置 php-fpm 服务,开机启动</h3><p>设置 pid</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 打开 php-fpm.conf</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">vim</span> /usr/local/php-8/etc/php-fpm.conf</pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># 找到 pid 信息行,并修改为</span></pre></td></tr><tr><td data-num="5"></td><td><pre>pid <span class="token operator">=</span> /var/run/php-fpm.pid</pre></td></tr></table></figure><p>新建 php-fpm.service 文件</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">vim</span> /usr/lib/systemd/system/php-fpm.service</pre></td></tr></table></figure><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>Unit<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token assign-left variable">Description</span><span class="token operator">=</span>The PHP fpm <span class="token function">service</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token assign-left variable">After</span><span class="token operator">=</span>syslog.target network.target</pre></td></tr><tr><td data-num="4"></td><td><pre> </pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token punctuation">[</span>Service<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token assign-left variable">Type</span><span class="token operator">=</span>forking</pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token assign-left variable">PIDFile</span><span class="token operator">=</span>/var/run/php-fpm.pid</pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token assign-left variable">ExecStart</span><span class="token operator">=</span>/usr/local/php-8/sbin/php-fpm</pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token assign-left variable">ExecReload</span><span class="token operator">=</span>/bin/kill <span class="token parameter variable">-USR2</span> <span class="token variable">$MAINPID</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token assign-left variable">PrivateTmp</span><span class="token operator">=</span>true</pre></td></tr><tr><td data-num="11"></td><td><pre> </pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token punctuation">[</span>Install<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token assign-left variable">WantedBy</span><span class="token operator">=</span>multi-user.target</pre></td></tr></table></figure><p>serivce 相关命令</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>systemctl <span class="token builtin class-name">enable</span> php-fpm.service <span class="token comment"># 设置开机启动</span></pre></td></tr><tr><td data-num="2"></td><td><pre>systemctl disable php-fpm.service <span class="token comment"># 停止开机启动</span></pre></td></tr><tr><td data-num="3"></td><td><pre>systemctl start php-fpm.service <span class="token comment"># 启动服务</span></pre></td></tr><tr><td data-num="4"></td><td><pre>systemctl stop php-fpm.service <span class="token comment"># 停止服务</span></pre></td></tr><tr><td data-num="5"></td><td><pre>systemctl status php-fpm.service <span class="token comment"># 查看服务状态</span></pre></td></tr><tr><td data-num="6"></td><td><pre>systemctl restart php-fpm.service <span class="token comment"># 重启服务</span></pre></td></tr><tr><td data-num="7"></td><td><pre>systemctl list-units <span class="token parameter variable">--type</span><span class="token operator">=</span>service <span class="token comment"># 查看所有已启动的服务</span></pre></td></tr></table></figure><h2 id="二-安装typecho"><a class="markdownIt-Anchor" href="#二-安装typecho">#</a> 二、安装 typecho</h2>]]></content>
<summary type="html"><h1 id="centos79安装typecho"><a class="markdownIt-Anchor" href="#centos79安装typecho">#</a> Centos7.9 安装 typecho</h1>
<blockquote>
<p>简介<br>
环境信息:<br>
系统: Centos 7.9<br>
PHP: 8.2.4<br>
Typecho: 1.2.0</p>
</blockquote></summary>
<category term="Java" scheme="http://xsea.cc/categories/Java/"/>
<category term="EncryptedTag" scheme="http://xsea.cc/tags/EncryptedTag/"/>
<category term="web" scheme="http://xsea.cc/tags/web/"/>
<category term="http" scheme="http://xsea.cc/tags/http/"/>
</entry>
<entry>
<title>让ChatGPT教你使用Hexo搭建博客</title>
<link href="http://xsea.cc/2023/03/c3f3fbf7.html"/>
<id>http://xsea.cc/2023/03/c3f3fbf7.html</id>
<published>2023-03-23T03:39:58.000Z</published>
<updated>2023-05-25T12:58:48.586Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>问 ChatGPT: 怎么用 hexo 搭建一个博客网站</p></blockquote><span id="more"></span><h1 id="使用hexo搭建博客网站"><a class="markdownIt-Anchor" href="#使用hexo搭建博客网站">#</a> 使用 Hexo 搭建博客网站</h1><p>Hexo 是一个快速、简洁且高效的博客框架,它使用 Markdown 解析文章,支持 EJS、Swig 等模板引擎渲染页面,可以快速生成静态网页。</p><h2 id="安装nodejs"><a class="markdownIt-Anchor" href="#安装nodejs">#</a> 安装 Node.js</h2><p>Hexo 是基于 Node.js 的,所以需要先安装 Node.js。可以在<span class="exturl" data-url="aHR0cHM6Ly9ub2RlanMub3JnLw=="> Node.js 官网</span>下载安装包进行安装。</p><h2 id="安装hexo"><a class="markdownIt-Anchor" href="#安装hexo">#</a> 安装 Hexo</h2><p>安装 Node.js 之后,就可以使用 npm 安装 Hexo 了。在命令行中输入以下命令:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">npm</span> <span class="token function">install</span> <span class="token parameter variable">-g</span> hexo-cli</pre></td></tr></table></figure><h2 id="初始化博客"><a class="markdownIt-Anchor" href="#初始化博客">#</a> 初始化博客</h2><p>安装 Hexo 之后,需要初始化博客。在命令行中进入想要存放博客的目录,然后输入以下命令:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>hexo init blog</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token builtin class-name">cd</span> blog</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">npm</span> <span class="token function">install</span></pre></td></tr></table></figure><h2 id="生成静态页面"><a class="markdownIt-Anchor" href="#生成静态页面">#</a> 生成静态页面</h2><p>在博客目录下,输入以下命令可以生成静态页面:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>hexo generate <span class="token comment"># 可使用简短命令 hexo g</span></pre></td></tr></table></figure><h2 id="启动本地服务器"><a class="markdownIt-Anchor" href="#启动本地服务器">#</a> 启动本地服务器</h2><p>在博客目录下,输入以下命令可以启动本地服务器:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>hexo server <span class="token comment"># 可使用简短命令 hexo s</span></pre></td></tr></table></figure><h2 id="发布博客"><a class="markdownIt-Anchor" href="#发布博客">#</a> 发布博客</h2><p>在博客目录下,输入以下命令可以发布博客:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>hexo deploy <span class="token comment"># 可使用简短命令 hexo d</span></pre></td></tr></table></figure><h2 id="更换主题"><a class="markdownIt-Anchor" href="#更换主题">#</a> 更换主题</h2><p>Hexo 支持更换主题,可以在<span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL3RoZW1lcy8="> Hexo 官网</span>下载主题,然后将主题解压到博客目录下的 themes 文件夹中,最后在博客目录下的_config.yml 文件中修改 theme 字段为主题名称即可。</p><h2 id="编写文章"><a class="markdownIt-Anchor" href="#编写文章">#</a> 编写文章</h2><p>在博客目录下,输入以下命令可以新建一篇文章:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>hexo new MyNewPost</pre></td></tr></table></figure><p>新建的文章会在博客目录下的 source/_posts 文件夹中生成一个 Markdown 文件,可以使用 Markdown 语法编写文章</p><blockquote><p>问 ChatGPT: 怎么配置使用 hexo admin</p></blockquote><h1 id="使用hexo-admin管理博客"><a class="markdownIt-Anchor" href="#使用hexo-admin管理博客">#</a> 使用 Hexo Admin 管理博客</h1><p>Hexo Admin 是一个基于 Web 的 Hexo 博客管理工具,可以方便地管理博客文章、页面、标签、分类、设置等内容。</p><h2 id="安装hexo-admin"><a class="markdownIt-Anchor" href="#安装hexo-admin">#</a> 安装 Hexo Admin</h2><p>在博客目录下,输入以下命令可以安装 Hexo Admin:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">npm</span> <span class="token function">install</span> <span class="token parameter variable">--save</span> hexo-admin</pre></td></tr></table></figure><h2 id="启用hexo-admin"><a class="markdownIt-Anchor" href="#启用hexo-admin">#</a> 启用 Hexo Admin</h2><p>在博客目录下的_config.yml 文件中添加以下配置:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># Hexo Admin</span></pre></td></tr><tr><td data-num="2"></td><td><pre>admin:</pre></td></tr><tr><td data-num="3"></td><td><pre> username: admin</pre></td></tr><tr><td data-num="4"></td><td><pre> password_hash: 098f6bcd4621d373cade4e832627b4f6 <span class="token comment"># admin</span></pre></td></tr><tr><td data-num="5"></td><td><pre> secret: a-secret-used-to-protect-your-password</pre></td></tr><tr><td data-num="6"></td><td><pre> deployCommand: hexo deploy</pre></td></tr></table></figure><p>其中,username 为管理员用户名,password_hash 为管理员密码的 MD5 值,可以使用<span class="exturl" data-url="aHR0cDovL3Rvb2wuY2hpbmF6LmNvbS90b29scy9tZDUuYXNweA=="> MD5 在线加密</span>进行加密,secret 为用于保护密码的密钥,deployCommand 为发布博客的命令。</p><h2 id="启动hexo-admin"><a class="markdownIt-Anchor" href="#启动hexo-admin">#</a> 启动 Hexo Admin</h2><p>在博客目录下,输入以下命令可以启动 Hexo Admin:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>hexo server <span class="token parameter variable">-d</span></pre></td></tr></table></figure><p>然后在浏览器中访问 <a href="**http://localhost:4000/admin">http://localhost:4000/admin</a></p><p>即可进入 Hexo Admin 管理界面。</p><h2 id="编写文章-2"><a class="markdownIt-Anchor" href="#编写文章-2">#</a> 编写文章</h2><p>在 Hexo Admin 管理界面中,可以方便地新建、编辑、删除文章,也可以管理页面、标签、分类、设置等内容。</p>]]></content>
<summary type="html"><blockquote>
<p>问 ChatGPT: 怎么用 hexo 搭建一个博客网站</p>
</blockquote></summary>
<category term="建站" scheme="http://xsea.cc/categories/%E5%BB%BA%E7%AB%99/"/>
<category term="ChatGPT" scheme="http://xsea.cc/tags/ChatGPT/"/>
<category term="AI" scheme="http://xsea.cc/tags/AI/"/>
<category term="Hexo" scheme="http://xsea.cc/tags/Hexo/"/>
</entry>
<entry>
<title>Windows切换JDK版本(Bat脚本)</title>
<link href="http://xsea.cc/2023/03/1e014c62.html"/>
<id>http://xsea.cc/2023/03/1e014c62.html</id>
<published>2023-03-21T06:46:57.000Z</published>
<updated>2023-05-25T12:58:48.584Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>当我们系统中有多个 JDK 版本时,要切换时每次都要手动修改:</p><p>右键打开我的电脑 >> 属性 >> 系统高级设置 >> 环境变量, 修改 JAVA_HOME 的值</p><p>非常麻烦,所以写个脚本,一键搞定;</p></blockquote><p>先来看看效果:</p><p><img data-src="https://static.xhal.net/picgo/uTools_1679382309562.png" alt=""></p><p>我们将 JDK 统一放置在同一个目录下,比如 <code>D:\Env\Java</code></p><p>脚本简单实现逻辑,就是将这指定目录下,所有子目录都找出来,并按顺序生成编号</p><p>脚本根据用户输入的编号对应的目录,更新环境变量 <code>JAVA_HOME</code></p><p>脚本内容如下 (<strong>特别注意: 使用 GBK 编码保存脚本文件,否则会中文乱码</strong>):</p><figure class="highlight powershell"><figcaption data-lang="PowerShell"></figcaption><table><tr><td data-num="1"></td><td><pre>@<span class="token function">echo</span> off</pre></td></tr><tr><td data-num="2"></td><td><pre>:: 获取管理员执行权限</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token operator">%</span>1 mshta vbscript:CreateObject<span class="token punctuation">(</span><span class="token string">"Shell.Application"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>ShellExecute<span class="token punctuation">(</span><span class="token string">"cmd.exe"</span><span class="token punctuation">,</span><span class="token string">"/c %~s0 ::"</span><span class="token punctuation">,</span><span class="token string">""</span><span class="token punctuation">,</span><span class="token string">"runas"</span><span class="token punctuation">,</span>1<span class="token punctuation">)</span><span class="token punctuation">(</span>window<span class="token punctuation">.</span>close<span class="token punctuation">)</span>&&<span class="token keyword">exit</span></pre></td></tr><tr><td data-num="4"></td><td><pre>cd <span class="token operator">/</span>d <span class="token string">"%~dp0"</span></pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre>:: 设置容器大小 及 标题</pre></td></tr><tr><td data-num="7"></td><td><pre>mode con cols=120 lines=30</pre></td></tr><tr><td data-num="8"></td><td><pre>title JDK-Version change script of Bat</pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre>setlocal EnableDelayedExpansion</pre></td></tr><tr><td data-num="11"></td><td><pre></pre></td></tr><tr><td data-num="12"></td><td><pre>:menu</pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token function">echo</span> 当前 JDK 版本:</pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token function">echo</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span></pre></td></tr><tr><td data-num="15"></td><td><pre>java <span class="token operator">-</span>version</pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token function">echo</span><span class="token punctuation">.</span></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token function">echo</span><span class="token punctuation">.</span></pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token function">echo</span> ========================================================</pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token function">echo</span> <span class="token comment">################ JDK 版本切换,可选操作 ################</span></pre></td></tr><tr><td data-num="20"></td><td><pre><span class="token function">echo</span><span class="token punctuation">.</span></pre></td></tr><tr><td data-num="21"></td><td><pre><span class="token function">echo</span> <span class="token punctuation">[</span>0<span class="token punctuation">]</span> 取消切换</pre></td></tr><tr><td data-num="22"></td><td><pre></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token function">set</span> <span class="token string">"options="</span></pre></td></tr><tr><td data-num="24"></td><td><pre><span class="token function">set</span> <span class="token string">"count=0"</span></pre></td></tr><tr><td data-num="25"></td><td><pre>:: 指定根目录,遍历子文件夹</pre></td></tr><tr><td data-num="26"></td><td><pre><span class="token keyword">for</span> <span class="token operator">/</span>d <span class="token operator">%</span><span class="token operator">%</span>d in <span class="token punctuation">(</span><span class="token string">"D:\Env\Java\*"</span><span class="token punctuation">)</span> <span class="token keyword">do</span> <span class="token punctuation">(</span></pre></td></tr><tr><td data-num="27"></td><td><pre> <span class="token function">set</span> <span class="token operator">/</span>a <span class="token string">"count+=1"</span></pre></td></tr><tr><td data-num="28"></td><td><pre> <span class="token function">set</span> <span class="token string">"options=!options! !count!"</span></pre></td></tr><tr><td data-num="29"></td><td><pre> <span class="token function">set</span> <span class="token string">"dir[!count!]=%%d"</span></pre></td></tr><tr><td data-num="30"></td><td><pre><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="31"></td><td><pre></pre></td></tr><tr><td data-num="32"></td><td><pre>::<span class="token function">echo</span> <span class="token function">Select</span> a directory:</pre></td></tr><tr><td data-num="33"></td><td><pre><span class="token keyword">for</span> <span class="token operator">%</span><span class="token operator">%</span>i in <span class="token punctuation">(</span><span class="token operator">%</span>options%<span class="token punctuation">)</span> <span class="token keyword">do</span> <span class="token punctuation">(</span></pre></td></tr><tr><td data-num="34"></td><td><pre> <span class="token function">echo</span> <span class="token punctuation">[</span><span class="token operator">%</span><span class="token operator">%</span>i<span class="token punctuation">]</span> 切换至版本: <span class="token operator">!</span><span class="token function">dir</span><span class="token punctuation">[</span><span class="token operator">%</span><span class="token operator">%</span>i<span class="token punctuation">]</span><span class="token operator">!</span></pre></td></tr><tr><td data-num="35"></td><td><pre><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="36"></td><td><pre><span class="token function">echo</span><span class="token punctuation">.</span></pre></td></tr><tr><td data-num="37"></td><td><pre><span class="token function">echo</span> ========================================================</pre></td></tr><tr><td data-num="38"></td><td><pre><span class="token function">echo</span><span class="token punctuation">.</span></pre></td></tr><tr><td data-num="39"></td><td><pre>:tipsChoose</pre></td></tr><tr><td data-num="40"></td><td><pre><span class="token function">set</span> <span class="token operator">/</span>p <span class="token string">"choice=Enter the number of your choice: "</span></pre></td></tr><tr><td data-num="41"></td><td><pre></pre></td></tr><tr><td data-num="42"></td><td><pre><span class="token keyword">if</span> <span class="token string">"%choice%"</span> EQU <span class="token string">"0"</span> <span class="token punctuation">(</span></pre></td></tr><tr><td data-num="43"></td><td><pre> goto <span class="token keyword">exit</span></pre></td></tr><tr><td data-num="44"></td><td><pre><span class="token punctuation">)</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token operator">%</span>choice% gtr <span class="token operator">%</span>count% <span class="token punctuation">(</span></pre></td></tr><tr><td data-num="45"></td><td><pre> <span class="token function">echo</span> 请输入<span class="token punctuation">[</span> 0 <span class="token operator">--</span> <span class="token operator">%</span>count% <span class="token punctuation">]</span>范围内的数字</pre></td></tr><tr><td data-num="46"></td><td><pre> <span class="token function">echo</span> 》》》</pre></td></tr><tr><td data-num="47"></td><td><pre> goto tipsChoose</pre></td></tr><tr><td data-num="48"></td><td><pre><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="49"></td><td><pre></pre></td></tr><tr><td data-num="50"></td><td><pre><span class="token function">set</span> <span class="token string">"JAVA_HOME=!dir[%choice%]!"</span></pre></td></tr><tr><td data-num="51"></td><td><pre><span class="token keyword">if</span> <span class="token string">"!JAVA_HOME!"</span> == <span class="token string">""</span> <span class="token punctuation">(</span></pre></td></tr><tr><td data-num="52"></td><td><pre> <span class="token function">echo</span> 获取的目录为空,请输入正确范围内的数字!</pre></td></tr><tr><td data-num="53"></td><td><pre> goto tipsChoose</pre></td></tr><tr><td data-num="54"></td><td><pre><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="55"></td><td><pre>setx JAVA_HOME <span class="token string">"!JAVA_HOME!"</span> <span class="token operator">/</span>m</pre></td></tr><tr><td data-num="56"></td><td><pre></pre></td></tr><tr><td data-num="57"></td><td><pre><span class="token function">echo</span> JAVA_HOME 已切换至: <span class="token operator">!</span>JAVA_HOME!</pre></td></tr><tr><td data-num="58"></td><td><pre></pre></td></tr><tr><td data-num="59"></td><td><pre></pre></td></tr><tr><td data-num="60"></td><td><pre><span class="token function">echo</span> 按任意键退出<span class="token punctuation">.</span><span class="token punctuation">.</span> & pause > nul</pre></td></tr><tr><td data-num="61"></td><td><pre></pre></td></tr><tr><td data-num="62"></td><td><pre>:<span class="token keyword">exit</span></pre></td></tr></table></figure>]]></content>
<summary type="html"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" cla</summary>
<category term="Shell" scheme="http://xsea.cc/categories/Shell/"/>
<category term="Shell" scheme="http://xsea.cc/tags/Shell/"/>
<category term="Windows" scheme="http://xsea.cc/tags/Windows/"/>
</entry>
<entry>
<title>【转】此生为人,实属意外</title>
<link href="http://xsea.cc/2023/03/130185c4.html"/>
<id>http://xsea.cc/2023/03/130185c4.html</id>
<published>2023-03-19T05:34:39.000Z</published>
<updated>2023-05-25T12:58:48.586Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>[转] 此生为人,实属意外,因无经验参照,不尽仁义之处,还请多多担待!</p></blockquote><span id="more"></span><p>此生为人,实属意外。本人出身耕农之家,落地时天无异象。</p><p>父母识字略过百,茅屋三间遮身,非书香门第。</p><p>几亩瘦田刨食,得以苟活幸存,全杖上天垂青,得益母爱父恩,方能蜷缩在万丈红尘。</p><p>八年学堂混个初本,弃笔从戎,未建盖世功勋。</p><p>虽命比纸薄,心恨天高。</p><p>匍匐人间,百折不挠,隐入尘烟,偶得逍遥。</p><p>学富虽无五车,却喜舞文弄墨。</p><p>居于市井窥视庙堂,偶尔故作高深,装模作样。</p><p>人前不敢卸下伪装,人后不敢直视内心肮脏。</p><p>做好人不能由始及终,行坏事不敢彻底放纵。</p><p>贪财又恐世俗不容,好色时常胆怂。</p><p>既非混世魔王,也非盖世英雄;</p><p>见庙烧香,遇佛也拜,酒肉均沾;</p><p>放生时慈悲为怀,杀生时手起刀快,既辜负了观音,也辜负了如来。</p><p>蹉跎半生,无傲人过往可寻,展望未来,亦缺少年雄心,苟且红尘偷生,虚度年华光阴。</p><p>愧疚为人子,未能尽人之孝行,让父母安心;不安为人父,未担起父之责任,承子女欢情。</p><p>自责为人有友,未对友肝胆赤诚。空叹世间知己难寻呐。</p><p>此生为人,实属意外,因无经验参照,不尽仁义之处,还请多多担待!</p>]]></content>
<summary type="html"><blockquote>
<p>[转] 此生为人,实属意外,因无经验参照,不尽仁义之处,还请多多担待!</p>
</blockquote></summary>
<category term="人生感悟" scheme="http://xsea.cc/categories/%E4%BA%BA%E7%94%9F%E6%84%9F%E6%82%9F/"/>
<category term="人生" scheme="http://xsea.cc/tags/%E4%BA%BA%E7%94%9F/"/>
</entry>
<entry>
<title>【ChatGPT】给我写一首歌,关键词:love,sea</title>
<link href="http://xsea.cc/2023/03/27c52b84.html"/>
<id>http://xsea.cc/2023/03/27c52b84.html</id>
<published>2023-03-19T01:57:05.000Z</published>
<updated>2023-05-25T12:58:48.585Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>现在 ChatGPT 大火,也试着让他写一首歌试试;记录下</p></blockquote><span id="more"></span><h2 id="歌曲名海洋之恋"><a class="markdownIt-Anchor" href="#歌曲名海洋之恋">#</a> 歌曲名:海洋之恋</h2><p>(Verse 1)<br>G D Em C<br> 海洋星空满天下<br> G D Em C<br> 海浪声声宛如歌<br> G D Em C<br> 你的眼中有无尽<br> G D Em C<br> 深情永存我心坎</p><p>(Chorus)<br>G D Em C<br> 爱情似海一般宽广<br> G D Em C<br> 充满欢乐充满平静<br> G D Em C<br> 像海浪一样不停的起伏<br> G D Em C<br> 带给我们无尽的希望</p><p>(Verse 2)<br>G D Em C<br> 海边散步与你相依<br> G D Em C<br> 心跳声声共鸣悠长<br> G D Em C<br> 沙滩上的足印纹迹<br> G D Em C<br> 证明永恒的爱情绝不褪色</p><p>(Bridge)<br>Am G D C<br> 有时海浪狂暴无常<br> Am G D C<br> 但爱情却能镇定内心<br> Am G D C<br> 当风暴来临带来变革<br> Am G D C<br> 我们的爱情不变,继续成长</p><p>(Chorus)<br>G D Em C<br> 爱情似海一般宽广<br> G D Em C<br> 充满欢乐充满平静<br> G D Em C<br> 像海浪一样不停的起伏<br> G D Em C<br> 带给我们无尽的希望</p><p>(Outro)<br>G D Em C<br> 海洋星空满天下<br> G D Em C<br> 我们的爱情生生不息<br> G D Em C<br> 你的眼中有无尽<br> G D Em C<br> 深情永存我心坎</p><blockquote><p>PS: G D Em C</p><p>这些是吉他和弦符号,用来表示在这个歌曲中需要弹奏的和弦。</p><p>具体来说,G 表示吉他上的 G 大调和弦,D 表示 D 大调和弦,Em 表示 E 小调和弦,C 表示 C 大调和弦。在这个曲谱中,吉他手需要弹奏这些和弦来伴奏歌曲。</p></blockquote>]]></content>
<summary type="html"><blockquote>
<p>现在 ChatGPT 大火,也试着让他写一首歌试试;记录下</p>
</blockquote></summary>
<category term="人工智能" scheme="http://xsea.cc/categories/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
<category term="ChatGPT" scheme="http://xsea.cc/tags/ChatGPT/"/>
<category term="AI" scheme="http://xsea.cc/tags/AI/"/>
<category term="创作" scheme="http://xsea.cc/tags/%E5%88%9B%E4%BD%9C/"/>
<category term="音乐" scheme="http://xsea.cc/tags/%E9%9F%B3%E4%B9%90/"/>
</entry>
<entry>
<title>Linux/Centos 环境Shell会话关闭后,本会话启动进程被终止</title>
<link href="http://xsea.cc/2023/02/37631c5.html"/>
<id>http://xsea.cc/2023/02/37631c5.html</id>
<published>2023-02-13T13:27:04.000Z</published>
<updated>2023-05-25T12:58:48.585Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>原因排查:Linux/Centos 环境 Shell 会话关闭后,本会话启动进程被终止</p><p>记录下工作中遇到的问题,希望给遇到的小伙伴参考</p></blockquote><span id="more"></span><p>原文链接: <span class="exturl" data-url="aHR0cHM6Ly9hc2suY3Nkbi5uZXQvcXVlc3Rpb25zLzc4ODEyOTQvNTQwNjA2OTE=">Linux/Centos 环境 shell 会话关闭后,java 进程被结束</span></p><h3 id="一-操作环境-软件版本等信息"><a class="markdownIt-Anchor" href="#一-操作环境-软件版本等信息">#</a> 一、操作环境、软件版本等信息</h3><blockquote><p>Centos 7.9.2009</p><p>Java8</p></blockquote><h3 id="二-问题场景"><a class="markdownIt-Anchor" href="#二-问题场景">#</a> 二、问题场景:</h3><blockquote><p>1、 原启动命令 <code>java -jar xxx.jar > test.log 2>&1 &</code> 在 <code>start.sh</code> 脚本文件里</p><p>2、有两台一样的服务器, 环境配置都一样; 之前一直是正常的(shell 会话关闭,也可正常运行)</p><p>3、其中一台重启后,手动上去执行此脚本启动后;会话关闭进程就没了</p></blockquote><h3 id="三-尝试过的解决方法"><a class="markdownIt-Anchor" href="#三-尝试过的解决方法">#</a> 三、尝试过的解决方法</h3><blockquote><p>1、 在命令前增加 <code>nohup</code> , 尝试无效</p><p>2、 在命令前增加 <code>nohup</code> ,并使用 exit 退出 shell 会话, 尝试无效</p><p>3、 检查设置参数 shopt huponexit huponexit 原本值就为 off, 尝试重新设置后, 一样无效</p><p>4、 使用 <code>screen</code> 启动, 尝试无效</p></blockquote><h3 id="四-最终排查原因-及-解决方案"><a class="markdownIt-Anchor" href="#四-最终排查原因-及-解决方案">#</a> 四、最终排查原因 及 解决方案</h3><h4 id="问题原因-ssh-版本被更新"><a class="markdownIt-Anchor" href="#问题原因-ssh-版本被更新">#</a> 问题原因: <code>SSH</code> 版本被更新</h4><blockquote><p>没问题的服务器 SSH 版本(旧的): 7.4p1</p><p>有问题的服务器 SSH 版本(新的): 8.9p1</p></blockquote><h4 id="解决方案"><a class="markdownIt-Anchor" href="#解决方案">#</a> 解决方案:</h4><p>在 <code>[email protected]</code> 中 [Service] 节点下,添加 <code>KillMode=process</code> 后</p><p>使用命令 <code>systemctl restart sshd.service</code> 重启 sshd 服务</p><p>参考连接:<br><span class="exturl" data-url="aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vYnl6Z3NzL3AvMTU1NzMzNDQuaHRtbA==">https://www.cnblogs.com/byzgss/p/15573344.html</span></p>]]></content>
<summary type="html"><blockquote>
<p>原因排查:Linux/Centos 环境 Shell 会话关闭后,本会话启动进程被终止</p>
<p>记录下工作中遇到的问题,希望给遇到的小伙伴参考</p>
</blockquote></summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Linux" scheme="http://xsea.cc/tags/Linux/"/>
<category term="Centos" scheme="http://xsea.cc/tags/Centos/"/>
<category term="Shell" scheme="http://xsea.cc/tags/Shell/"/>
</entry>
<entry>
<title>Redis7 源码安装</title>
<link href="http://xsea.cc/2023/01/dacefe23.html"/>
<id>http://xsea.cc/2023/01/dacefe23.html</id>
<published>2023-01-02T13:03:52.000Z</published>
<updated>2023-05-25T12:58:48.584Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>源码安装 Redis7, 下载源码、解压、执行安装命令</p></blockquote><span id="more"></span><h3 id="1-下载-redis-7-源码"><a class="markdownIt-Anchor" href="#1-下载-redis-7-源码">#</a> 1、下载 Redis 7 源码</h3><p>可以从 Redis 官网(<span class="exturl" data-url="aHR0cHM6Ly9yZWRpcy5pby9kb3dubG9hZCVFRiVCQyU4OSVFNiU4OCU5NiVFOCU4MCU4NQ==">https://redis.io/download)或者</span> GitHub 上(<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3JlZGlzL3JlZGlzL3JlbGVhc2VzJUVGJUJDJTg5JUU0JUI4JThCJUU4JUJEJUJEJUU2JTlDJTgwJUU2JTk2JUIwJUU3JTg5JTg4JUU2JTlDJUFDJUU3JTlBJTg0">https://github.com/redis/redis/releases)下载最新版本的</span> Redis 源码包,也可以使用以下命令下载最新的稳定版:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">wget</span> https://download.redis.io/releases/redis-7.0.0.tar.gz</pre></td></tr></table></figure><h3 id="2-解压源码包"><a class="markdownIt-Anchor" href="#2-解压源码包">#</a> 2、解压源码包</h3><p>使用以下命令解压下载的源码包:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">tar</span> xzf redis-7.0.0.tar.gz</pre></td></tr></table></figure><h3 id="3-编译安装"><a class="markdownIt-Anchor" href="#3-编译安装">#</a> 3、编译安装</h3><p>进入解压后的 Redis 目录,执行以下命令编译 Redis:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token builtin class-name">cd</span> redis-7.0.0</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">make</span></pre></td></tr></table></figure><p>这一步会生成 Redis 的可执行文件,包括 redis-server、redis-cli 等。</p><h3 id="4-安装-redis"><a class="markdownIt-Anchor" href="#4-安装-redis">#</a> 4、安装 Redis</h3><p>执行以下命令安装 Redis:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">make</span> <span class="token function">install</span></pre></td></tr></table></figure><p>这一步会将 Redis 可执行文件复制到 /usr/local/bin 目录下,并将 Redis 配置文件复制到 /etc/redis 目录下。</p><p>若需要指定安装目录,则添加 <code>PREFIX</code> 配置</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 指定 安装目录 PREFIX</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">make</span> <span class="token assign-left variable">PREFIX</span><span class="token operator">=</span>/usr/local/redis <span class="token function">install</span></pre></td></tr></table></figure><h3 id="5-配置-redis"><a class="markdownIt-Anchor" href="#5-配置-redis">#</a> 5、配置 Redis</h3><p>编辑 /etc/redis/redis.conf 配置文件,修改 Redis 的配置,例如修改监听的端口、设置密码、配置持久化等。</p><h3 id="6-启动-redis"><a class="markdownIt-Anchor" href="#6-启动-redis">#</a> 6、启动 Redis</h3><p>执行以下命令启动 Redis:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>redis-server /etc/redis/redis.conf</pre></td></tr></table></figure><p>如果 Redis 需要认证,还需要在启动 Redis 时指定密码:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>redis-server /etc/redis/redis.conf <span class="token parameter variable">--requirepass</span> your_password</pre></td></tr></table></figure><h3 id="7-测试-redis"><a class="markdownIt-Anchor" href="#7-测试-redis">#</a> 7、测试 Redis</h3><p>执行以下命令连接 Redis 并测试:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>redis-cli</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token number">127.0</span>.0.1:637<span class="token operator"><span class="token file-descriptor important">9</span>></span> <span class="token function">ping</span></pre></td></tr><tr><td data-num="3"></td><td><pre>PONG</pre></td></tr></table></figure><p>如果 Redis 返回 PONG,则说明 Redis 已经正常运行。</p><p>以上是 Redis 7 源码安装的步骤,需要注意的是,在安装 Redis 时需要根据实际情况修改配置,例如修改监听的端口、设置密码、配置持久化等。同时,在部署 Redis 时,还需要注意安全性和性能等问题,例如限制 Redis 的网络访问权限、优化 Redis 的性能等。</p>]]></content>
<summary type="html"><blockquote>
<p>源码安装 Redis7, 下载源码、解压、执行安装命令</p>
</blockquote></summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Redis" scheme="http://xsea.cc/tags/Redis/"/>
</entry>
<entry>
<title>CentOS7源码安装PostgreSQL15</title>
<link href="http://xsea.cc/2022/12/54208668.html"/>
<id>http://xsea.cc/2022/12/54208668.html</id>
<published>2022-12-01T13:37:35.000Z</published>
<updated>2023-05-25T12:58:48.581Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><span id="more"></span><h1 id="centos-7-源码安装-postgresql"><a class="markdownIt-Anchor" href="#centos-7-源码安装-postgresql">#</a> CentOS 7 源码安装 PostgreSQL</h1><h2 id="环境信息"><a class="markdownIt-Anchor" href="#环境信息">#</a> 环境信息</h2><blockquote><p>系统版本: CentOS 7.9.2009 x86_64</p><p>PostgreSQL 版本号:15.0</p></blockquote><h2 id="资源准备"><a class="markdownIt-Anchor" href="#资源准备">#</a> 资源准备</h2><blockquote><p>PostgreSQL 官网下载 url: <span class="exturl" data-url="aHR0cHM6Ly9mdHAucG9zdGdyZXNxbC5vcmcvcHViL3NvdXJjZS92MTUuMC9wb3N0Z3Jlc3FsLTE1LjAudGFyLmd6">https://ftp.postgresql.org/pub/source/v15.0/postgresql-15.0.tar.gz</span></p></blockquote><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos downloads<span class="token punctuation">]</span><span class="token comment"># wget https://ftp.postgresql.org/pub/source/v15.0/postgresql-15.0.tar.gz</span></pre></td></tr></table></figure><h2 id="环境准备"><a class="markdownIt-Anchor" href="#环境准备">#</a> 环境准备</h2><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 安装必要组件</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos downloads<span class="token punctuation">]</span><span class="token comment"># yum -y install gcc gcc-c++ readline-devel zlib-devel</span></pre></td></tr></table></figure><h2 id="安装步骤"><a class="markdownIt-Anchor" href="#安装步骤">#</a> 安装步骤</h2><ol><li>解压下载的压缩包</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos downloads<span class="token punctuation">]</span><span class="token comment"># tar -zxf postgresql-15.0.tar.gz </span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos downloads<span class="token punctuation">]</span><span class="token comment"># ll</span></pre></td></tr><tr><td data-num="3"></td><td><pre>drwxrwxrwx <span class="token number">6</span> <span class="token number">1107</span> <span class="token number">1107</span> <span class="token number">4096</span> Oct <span class="token number">11</span> 05:01 postgresql-15.0</pre></td></tr><tr><td data-num="4"></td><td><pre>-rw-r--r-- <span class="token number">1</span> root root <span class="token number">29385837</span> Oct <span class="token number">11</span> 05:01 postgresql-15.0.tar.gz</pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 进入解压目录,使用 ./configure 编译</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos downloads<span class="token punctuation">]</span><span class="token comment"># cd postgresql-15.0/</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos postgresql-15.0<span class="token punctuation">]</span><span class="token comment"># ./configure</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token punctuation">..</span><span class="token punctuation">..</span><span class="token punctuation">..</span> 以上省略N行</pre></td></tr><tr><td data-num="10"></td><td><pre>configure: using <span class="token assign-left variable">compiler</span><span class="token operator">=</span>gcc <span class="token punctuation">(</span>GCC<span class="token punctuation">)</span> <span class="token number">4.8</span>.5 <span class="token number">20150623</span> <span class="token punctuation">(</span>Red Hat <span class="token number">4.8</span>.5-44<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="11"></td><td><pre>configure: using <span class="token assign-left variable">CFLAGS</span><span class="token operator">=</span>-Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement <span class="token parameter variable">-Werror</span><span class="token operator">=</span>vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing <span class="token parameter variable">-fwrapv</span> -fexcess-precision<span class="token operator">=</span>standard <span class="token parameter variable">-O2</span></pre></td></tr><tr><td data-num="12"></td><td><pre>configure: using <span class="token assign-left variable">CPPFLAGS</span><span class="token operator">=</span> <span class="token parameter variable">-D_GNU_SOURCE</span> </pre></td></tr><tr><td data-num="13"></td><td><pre>configure: using <span class="token assign-left variable">LDFLAGS</span><span class="token operator">=</span> -Wl,--as-needed</pre></td></tr><tr><td data-num="14"></td><td><pre>configure: creating ./config.status</pre></td></tr><tr><td data-num="15"></td><td><pre>config.status: creating GNUmakefile</pre></td></tr><tr><td data-num="16"></td><td><pre>config.status: creating src/Makefile.global</pre></td></tr><tr><td data-num="17"></td><td><pre>config.status: creating src/include/pg_config.h</pre></td></tr><tr><td data-num="18"></td><td><pre>config.status: creating src/include/pg_config_ext.h</pre></td></tr><tr><td data-num="19"></td><td><pre>config.status: creating src/interfaces/ecpg/include/ecpg_config.h</pre></td></tr><tr><td data-num="20"></td><td><pre>config.status: linking src/backend/port/tas/dummy.s to src/backend/port/tas.s</pre></td></tr><tr><td data-num="21"></td><td><pre>config.status: linking src/backend/port/posix_sema.c to src/backend/port/pg_sema.c</pre></td></tr><tr><td data-num="22"></td><td><pre>config.status: linking src/backend/port/sysv_shmem.c to src/backend/port/pg_shmem.c</pre></td></tr><tr><td data-num="23"></td><td><pre>config.status: linking src/include/port/linux.h to src/include/pg_config_os.h</pre></td></tr><tr><td data-num="24"></td><td><pre>config.status: linking src/makefiles/Makefile.linux to src/Makefile.port</pre></td></tr></table></figure><ol start="2"><li>执行安装命令</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos postgresql-15.0<span class="token punctuation">]</span><span class="token comment"># make && make install</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">..</span><span class="token punctuation">..</span><span class="token punctuation">..</span> 以上省略N行</pre></td></tr><tr><td data-num="3"></td><td><pre>make<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>: Leaving directory <span class="token variable"><span class="token variable">`</span>/home/downloads/postgresql-15.0/src'</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token function">make</span> <span class="token parameter variable">-C</span> config <span class="token function">install</span></pre></td></tr><tr><td data-num="5"></td><td><pre>make<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>: Entering directory <span class="token variable">`</span></span>/home/downloads/postgresql-15.0/config<span class="token string">'</pre></td></tr><tr><td data-num="6"></td><td><pre>/usr/bin/mkdir -p '</span>/usr/local/pgsql/lib/pgxs/config<span class="token string">'</pre></td></tr><tr><td data-num="7"></td><td><pre>/usr/bin/install -c -m 755 ./install-sh '</span>/usr/local/pgsql/lib/pgxs/config/install-sh<span class="token string">'</pre></td></tr><tr><td data-num="8"></td><td><pre>/usr/bin/install -c -m 755 ./missing '</span>/usr/local/pgsql/lib/pgxs/config/missing<span class="token string">'</pre></td></tr><tr><td data-num="9"></td><td><pre>make[1]: Leaving directory `/home/downloads/postgresql-15.0/config'</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos postgresql-15.0<span class="token punctuation">]</span><span class="token comment">#</span></pre></td></tr></table></figure><p>以上命令执行成功后,默认会创建目录 <code>/usr/local/pgsql</code></p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos postgresql-15.0<span class="token punctuation">]</span><span class="token comment"># cd /usr/local/pgsql/</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos pgsql<span class="token punctuation">]</span><span class="token comment"># ll</span></pre></td></tr><tr><td data-num="3"></td><td><pre>total <span class="token number">16</span></pre></td></tr><tr><td data-num="4"></td><td><pre>drwxr-xr-x <span class="token number">2</span> root root <span class="token number">4096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 bin</pre></td></tr><tr><td data-num="5"></td><td><pre>drwxr-xr-x <span class="token number">6</span> root root <span class="token number">4096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 include</pre></td></tr><tr><td data-num="6"></td><td><pre>drwxr-xr-x <span class="token number">4</span> root root <span class="token number">4096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 lib</pre></td></tr><tr><td data-num="7"></td><td><pre>drwxr-xr-x <span class="token number">6</span> root root <span class="token number">4096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 share</pre></td></tr></table></figure><ol start="3"><li>创建系统用户、配置权限(以上操作如果是 root 用户执行,否则跳过此步骤)</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 添加用户</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos pgsql<span class="token punctuation">]</span><span class="token comment"># useradd postgres</span></pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># 设置密码 (特别注意: 如果是外网环境,千万不要设置简单的密码或甚至同账号,否则很容易被黑客攻破)</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos pgsql<span class="token punctuation">]</span><span class="token comment"># echo 'post@gres@qw_231' | passwd --stdin postgres</span></pre></td></tr><tr><td data-num="6"></td><td><pre>Changing password <span class="token keyword">for</span> user postgres.</pre></td></tr><tr><td data-num="7"></td><td><pre>passwd: all authentication tokens updated successfully.</pre></td></tr><tr><td data-num="8"></td><td><pre></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># 目录授权给新建用户 postgres</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos pgsql<span class="token punctuation">]</span><span class="token comment"># cd ..</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos local<span class="token punctuation">]</span><span class="token comment"># chown -R postgres:postgres pgsql/</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos local<span class="token punctuation">]</span><span class="token comment"># cd pgsql/</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos pgsql<span class="token punctuation">]</span><span class="token comment"># ll</span></pre></td></tr><tr><td data-num="14"></td><td><pre>total <span class="token number">16</span></pre></td></tr><tr><td data-num="15"></td><td><pre>drwxr-xr-x <span class="token number">2</span> postgres postgres <span class="token number">4096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 bin</pre></td></tr><tr><td data-num="16"></td><td><pre>drwxr-xr-x <span class="token number">6</span> postgres postgres <span class="token number">4096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 include</pre></td></tr><tr><td data-num="17"></td><td><pre>drwxr-xr-x <span class="token number">4</span> postgres postgres <span class="token number">4096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 lib</pre></td></tr><tr><td data-num="18"></td><td><pre>drwxr-xr-x <span class="token number">6</span> postgres postgres <span class="token number">4096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 share</pre></td></tr></table></figure><ol start="4"><li>初始化数据库</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 进入 bin 目录,查看可用 命令</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos pgsql<span class="token punctuation">]</span><span class="token comment"># cd bin/</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos bin<span class="token punctuation">]</span><span class="token comment"># ll</span></pre></td></tr><tr><td data-num="4"></td><td><pre>total <span class="token number">13732</span></pre></td></tr><tr><td data-num="5"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">83936</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 clusterdb</pre></td></tr><tr><td data-num="6"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">88264</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 createdb</pre></td></tr><tr><td data-num="7"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">88464</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 createuser</pre></td></tr><tr><td data-num="8"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">79152</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 dropdb</pre></td></tr><tr><td data-num="9"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">79096</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 dropuser</pre></td></tr><tr><td data-num="10"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">1013232</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 ecpg</pre></td></tr><tr><td data-num="11"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">148752</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 initdb</pre></td></tr><tr><td data-num="12"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">115192</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_amcheck</pre></td></tr><tr><td data-num="13"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">48640</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_archivecleanup</pre></td></tr><tr><td data-num="14"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">156904</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_basebackup</pre></td></tr><tr><td data-num="15"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">207232</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pgbench</pre></td></tr><tr><td data-num="16"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">67624</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_checksums</pre></td></tr><tr><td data-num="17"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">47088</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_config</pre></td></tr><tr><td data-num="18"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">61616</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_controldata</pre></td></tr><tr><td data-num="19"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">77256</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_ctl</pre></td></tr><tr><td data-num="20"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">408376</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_dump</pre></td></tr><tr><td data-num="21"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">115840</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_dumpall</pre></td></tr><tr><td data-num="22"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">78712</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_isready</pre></td></tr><tr><td data-num="23"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">103552</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_receivewal</pre></td></tr><tr><td data-num="24"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">103792</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_recvlogical</pre></td></tr><tr><td data-num="25"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">71760</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_resetwal</pre></td></tr><tr><td data-num="26"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">193768</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_restore</pre></td></tr><tr><td data-num="27"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">152224</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_rewind</pre></td></tr><tr><td data-num="28"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">54064</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_test_fsync</pre></td></tr><tr><td data-num="29"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">43336</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_test_timing</pre></td></tr><tr><td data-num="30"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">167208</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_upgrade</pre></td></tr><tr><td data-num="31"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">123584</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_verifybackup</pre></td></tr><tr><td data-num="32"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">118088</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 pg_waldump</pre></td></tr><tr><td data-num="33"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">9006040</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 postgres</pre></td></tr><tr><td data-num="34"></td><td><pre>lrwxrwxrwx <span class="token number">1</span> postgres postgres <span class="token number">8</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 postmaster -<span class="token operator">></span> postgres</pre></td></tr><tr><td data-num="35"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">699088</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 psql</pre></td></tr><tr><td data-num="36"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">93152</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 reindexdb</pre></td></tr><tr><td data-num="37"></td><td><pre>-rwxr-xr-x <span class="token number">1</span> postgres postgres <span class="token number">97472</span> Oct <span class="token number">13</span> <span class="token number">22</span>:50 vacuumdb</pre></td></tr></table></figure><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 查看 初始化 db help</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos bin<span class="token punctuation">]</span><span class="token comment"># ./initdb --help</span></pre></td></tr><tr><td data-num="3"></td><td><pre>initdb initializes a PostgreSQL database cluster.</pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre>Usage:</pre></td></tr><tr><td data-num="6"></td><td><pre> initdb <span class="token punctuation">[</span>OPTION<span class="token punctuation">]</span><span class="token punctuation">..</span>. <span class="token punctuation">[</span>DATADIR<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="7"></td><td><pre></pre></td></tr><tr><td data-num="8"></td><td><pre>Options:</pre></td></tr><tr><td data-num="9"></td><td><pre> -A, <span class="token parameter variable">--auth</span><span class="token operator">=</span>METHOD default authentication method <span class="token keyword">for</span> <span class="token builtin class-name">local</span> connections</pre></td></tr><tr><td data-num="10"></td><td><pre> --auth-host<span class="token operator">=</span>METHOD default authentication method <span class="token keyword">for</span> <span class="token builtin class-name">local</span> TCP/IP connections</pre></td></tr><tr><td data-num="11"></td><td><pre> --auth-local<span class="token operator">=</span>METHOD default authentication method <span class="token keyword">for</span> local-socket connections</pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token punctuation">[</span>-D, <span class="token parameter variable">--pgdata</span><span class="token operator">=</span><span class="token punctuation">]</span>DATADIR location <span class="token keyword">for</span> this database cluster</pre></td></tr><tr><td data-num="13"></td><td><pre> -E, <span class="token parameter variable">--encoding</span><span class="token operator">=</span>ENCODING <span class="token builtin class-name">set</span> default encoding <span class="token keyword">for</span> new databases</pre></td></tr><tr><td data-num="14"></td><td><pre> -g, --allow-group-access allow group read/execute on data directory</pre></td></tr><tr><td data-num="15"></td><td><pre> --icu-locale<span class="token operator">=</span>LOCALE <span class="token builtin class-name">set</span> ICU locale ID <span class="token keyword">for</span> new databases</pre></td></tr><tr><td data-num="16"></td><td><pre> -k, --data-checksums use data page checksums</pre></td></tr><tr><td data-num="17"></td><td><pre> <span class="token parameter variable">--locale</span><span class="token operator">=</span>LOCALE <span class="token builtin class-name">set</span> default locale <span class="token keyword">for</span> new databases</pre></td></tr><tr><td data-num="18"></td><td><pre> --lc-collate<span class="token operator">=</span>, --lc-ctype<span class="token operator">=</span>, --lc-messages<span class="token operator">=</span>LOCALE</pre></td></tr><tr><td data-num="19"></td><td><pre> --lc-monetary<span class="token operator">=</span>, --lc-numeric<span class="token operator">=</span>, --lc-time<span class="token operator">=</span>LOCALE</pre></td></tr><tr><td data-num="20"></td><td><pre> <span class="token builtin class-name">set</span> default locale <span class="token keyword">in</span> the respective category <span class="token keyword">for</span></pre></td></tr><tr><td data-num="21"></td><td><pre> new databases <span class="token punctuation">(</span>default taken from environment<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="22"></td><td><pre> --no-locale equivalent to <span class="token parameter variable">--locale</span><span class="token operator">=</span>C</pre></td></tr><tr><td data-num="23"></td><td><pre> --locale-provider<span class="token operator">=</span><span class="token punctuation">{</span>libc<span class="token operator">|</span>icu<span class="token punctuation">}</span></pre></td></tr><tr><td data-num="24"></td><td><pre> <span class="token builtin class-name">set</span> default locale provider <span class="token keyword">for</span> new databases</pre></td></tr><tr><td data-num="25"></td><td><pre> <span class="token parameter variable">--pwfile</span><span class="token operator">=</span>FILE <span class="token builtin class-name">read</span> password <span class="token keyword">for</span> the new superuser from <span class="token function">file</span></pre></td></tr><tr><td data-num="26"></td><td><pre> -T, --text-search-config<span class="token operator">=</span>CFG</pre></td></tr><tr><td data-num="27"></td><td><pre> default text search configuration</pre></td></tr><tr><td data-num="28"></td><td><pre> -U, <span class="token parameter variable">--username</span><span class="token operator">=</span>NAME database superuser name</pre></td></tr><tr><td data-num="29"></td><td><pre> -W, <span class="token parameter variable">--pwprompt</span> prompt <span class="token keyword">for</span> a password <span class="token keyword">for</span> the new superuser</pre></td></tr><tr><td data-num="30"></td><td><pre> -X, <span class="token parameter variable">--waldir</span><span class="token operator">=</span>WALDIR location <span class="token keyword">for</span> the write-ahead log directory</pre></td></tr><tr><td data-num="31"></td><td><pre> --wal-segsize<span class="token operator">=</span>SIZE size of WAL segments, <span class="token keyword">in</span> megabytes</pre></td></tr><tr><td data-num="32"></td><td><pre></pre></td></tr><tr><td data-num="33"></td><td><pre>Less commonly used options:</pre></td></tr><tr><td data-num="34"></td><td><pre> -d, <span class="token parameter variable">--debug</span> generate lots of debugging output</pre></td></tr><tr><td data-num="35"></td><td><pre> --discard-caches <span class="token builtin class-name">set</span> <span class="token assign-left variable">debug_discard_caches</span><span class="token operator">=</span><span class="token number">1</span></pre></td></tr><tr><td data-num="36"></td><td><pre> <span class="token parameter variable">-L</span> DIRECTORY where to <span class="token function">find</span> the input files</pre></td></tr><tr><td data-num="37"></td><td><pre> -n, --no-clean <span class="token keyword">do</span> not clean up after errors</pre></td></tr><tr><td data-num="38"></td><td><pre> -N, --no-sync <span class="token keyword">do</span> not <span class="token function">wait</span> <span class="token keyword">for</span> changes to be written safely to disk</pre></td></tr><tr><td data-num="39"></td><td><pre> --no-instructions <span class="token keyword">do</span> not print instructions <span class="token keyword">for</span> next steps</pre></td></tr><tr><td data-num="40"></td><td><pre> -s, <span class="token parameter variable">--show</span> show internal settings</pre></td></tr><tr><td data-num="41"></td><td><pre> -S, --sync-only only <span class="token function">sync</span> database files to disk, <span class="token keyword">then</span> <span class="token builtin class-name">exit</span></pre></td></tr><tr><td data-num="42"></td><td><pre></pre></td></tr><tr><td data-num="43"></td><td><pre>Other options:</pre></td></tr><tr><td data-num="44"></td><td><pre> -V, <span class="token parameter variable">--version</span> output version information, <span class="token keyword">then</span> <span class="token builtin class-name">exit</span></pre></td></tr><tr><td data-num="45"></td><td><pre> -?, <span class="token parameter variable">--help</span> show this help, <span class="token keyword">then</span> <span class="token builtin class-name">exit</span></pre></td></tr><tr><td data-num="46"></td><td><pre></pre></td></tr><tr><td data-num="47"></td><td><pre>If the data directory is not specified, the environment variable PGDATA</pre></td></tr><tr><td data-num="48"></td><td><pre>is used.</pre></td></tr><tr><td data-num="49"></td><td><pre></pre></td></tr><tr><td data-num="50"></td><td><pre>Report bugs to <span class="token operator"><</span>[email protected]<span class="token operator">></span>.</pre></td></tr><tr><td data-num="51"></td><td><pre>PostgreSQL home page: <span class="token operator"><</span>https://www.postgresql.org/<span class="token operator">></span></pre></td></tr></table></figure><p>我们指定工作数据目录为 <code>/usr/local/pgsql/data</code> (可以是任意其它地址)</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos bin<span class="token punctuation">]</span><span class="token comment"># ./initdb /usr/local/pgsql/data</span></pre></td></tr><tr><td data-num="2"></td><td><pre>initdb: error: cannot be run as root</pre></td></tr><tr><td data-num="3"></td><td><pre>initdb: hint: Please log <span class="token keyword">in</span> <span class="token punctuation">(</span>using, e.g., <span class="token string">"su"</span><span class="token punctuation">)</span> as the <span class="token punctuation">(</span>unprivileged<span class="token punctuation">)</span> user that will own the server process.</pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># 提示不可用 root 用户执行,切换为刚刚新建的用户 postgres</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token punctuation">[</span>root@VM-20-8-centos bin<span class="token punctuation">]</span><span class="token comment"># su - postgres</span></pre></td></tr><tr><td data-num="7"></td><td><pre>Last failed login: Thu Oct <span class="token number">13</span> <span class="token number">10</span>:16:54 CST <span class="token number">2022</span> from <span class="token number">142.93</span>.208.41 on ssh:notty</pre></td></tr><tr><td data-num="8"></td><td><pre>There were <span class="token number">38</span> failed login attempts since the last successful login.</pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos ~<span class="token punctuation">]</span>$ <span class="token builtin class-name">cd</span> /usr/local/pgsql/bin/</pre></td></tr><tr><td data-num="10"></td><td><pre></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment"># 进入 pgsql/bin 目录,再次执行</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos bin<span class="token punctuation">]</span>$ ./initdb /usr/local/pgsql/data</pre></td></tr><tr><td data-num="13"></td><td><pre>The files belonging to this database system will be owned by user <span class="token string">"postgres"</span><span class="token builtin class-name">.</span></pre></td></tr><tr><td data-num="14"></td><td><pre>This user must also own the server process.</pre></td></tr><tr><td data-num="15"></td><td><pre></pre></td></tr><tr><td data-num="16"></td><td><pre>The database cluster will be initialized with locale <span class="token string">"en_US.UTF-8"</span><span class="token builtin class-name">.</span></pre></td></tr><tr><td data-num="17"></td><td><pre>The default database encoding has accordingly been <span class="token builtin class-name">set</span> to <span class="token string">"UTF8"</span><span class="token builtin class-name">.</span></pre></td></tr><tr><td data-num="18"></td><td><pre>The default text search configuration will be <span class="token builtin class-name">set</span> to <span class="token string">"english"</span><span class="token builtin class-name">.</span></pre></td></tr><tr><td data-num="19"></td><td><pre></pre></td></tr><tr><td data-num="20"></td><td><pre>Data page checksums are disabled.</pre></td></tr><tr><td data-num="21"></td><td><pre></pre></td></tr><tr><td data-num="22"></td><td><pre>creating directory /usr/local/pgsql/data <span class="token punctuation">..</span>. ok</pre></td></tr><tr><td data-num="23"></td><td><pre>creating subdirectories <span class="token punctuation">..</span>. ok</pre></td></tr><tr><td data-num="24"></td><td><pre>selecting dynamic shared memory implementation <span class="token punctuation">..</span>. posix</pre></td></tr><tr><td data-num="25"></td><td><pre>selecting default max_connections <span class="token punctuation">..</span>. <span class="token number">100</span></pre></td></tr><tr><td data-num="26"></td><td><pre>selecting default shared_buffers <span class="token punctuation">..</span>. 128MB</pre></td></tr><tr><td data-num="27"></td><td><pre>selecting default <span class="token function">time</span> zone <span class="token punctuation">..</span>. Asia/Shanghai</pre></td></tr><tr><td data-num="28"></td><td><pre>creating configuration files <span class="token punctuation">..</span>. ok</pre></td></tr><tr><td data-num="29"></td><td><pre>running bootstrap script <span class="token punctuation">..</span>. ok</pre></td></tr><tr><td data-num="30"></td><td><pre>performing post-bootstrap initialization <span class="token punctuation">..</span>. ok</pre></td></tr><tr><td data-num="31"></td><td><pre>syncing data to disk <span class="token punctuation">..</span>. ok</pre></td></tr><tr><td data-num="32"></td><td><pre></pre></td></tr><tr><td data-num="33"></td><td><pre>initdb: warning: enabling <span class="token string">"trust"</span> authentication <span class="token keyword">for</span> <span class="token builtin class-name">local</span> connections</pre></td></tr><tr><td data-num="34"></td><td><pre>initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next <span class="token function">time</span> you run initdb.</pre></td></tr><tr><td data-num="35"></td><td><pre></pre></td></tr><tr><td data-num="36"></td><td><pre>Success. You can now start the database server using:</pre></td></tr><tr><td data-num="37"></td><td><pre></pre></td></tr><tr><td data-num="38"></td><td><pre> pg_ctl <span class="token parameter variable">-D</span> /usr/local/pgsql/data <span class="token parameter variable">-l</span> logfile start</pre></td></tr></table></figure><ol start="5"><li>启动数据库</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos data<span class="token punctuation">]</span>$ /usr/local/pgsql/bin/pg_ctl <span class="token parameter variable">-D</span> /usr/local/pgsql/data/ <span class="token parameter variable">-l</span> /usr/local/pgsql/logs/logfile.log start</pre></td></tr><tr><td data-num="2"></td><td><pre>waiting <span class="token keyword">for</span> server to start<span class="token punctuation">..</span><span class="token punctuation">..</span> <span class="token keyword">done</span></pre></td></tr><tr><td data-num="3"></td><td><pre>server started</pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># 查看启用端口及进程</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos data<span class="token punctuation">]</span>$ <span class="token function">netstat</span> <span class="token parameter variable">-ntlp</span> <span class="token operator">|</span> <span class="token function">grep</span> postgres</pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">(</span>Not all processes could be identified, non-owned process info</pre></td></tr><tr><td data-num="8"></td><td><pre> will not be shown, you would have to be root to see it all.<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="9"></td><td><pre>tcp <span class="token number">0</span> <span class="token number">0</span> <span class="token number">127.0</span>.0.1:5432 <span class="token number">0.0</span>.0.0:* LISTEN <span class="token number">911</span>/postgres </pre></td></tr><tr><td data-num="10"></td><td><pre>tcp6 <span class="token number">0</span> <span class="token number">0</span> ::1:5432 :::* LISTEN <span class="token number">911</span>/postgres</pre></td></tr></table></figure><ol start="6"><li>进入 <code>/usr/local/pgsql/bin</code> 目录,创建用户、数据库及授权</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># psql 进入命令行</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos bin<span class="token punctuation">]</span>$ ./psql </pre></td></tr><tr><td data-num="3"></td><td><pre>psql <span class="token punctuation">(</span><span class="token number">15.0</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="4"></td><td><pre>Type <span class="token string">"help"</span> <span class="token keyword">for</span> help.</pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 创建用户 及 配置密码</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token assign-left variable">postgres</span><span class="token operator">=</span><span class="token comment"># create user platform with password 'x_platform_zxdvf12Ll';</span></pre></td></tr><tr><td data-num="8"></td><td><pre>CREATE ROLE</pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 创建数据库 指定 所属用户</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token assign-left variable">postgres</span><span class="token operator">=</span><span class="token comment"># create database x_platform owner platform;</span></pre></td></tr><tr><td data-num="12"></td><td><pre>CREATE DATABASE</pre></td></tr><tr><td data-num="13"></td><td><pre></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token comment"># 授权 对应 数据库 所有权限 给用户</span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token assign-left variable">postgres</span><span class="token operator">=</span><span class="token comment"># GRANT ALL PRIVILEGES ON DATABASE x_platform to platform;</span></pre></td></tr><tr><td data-num="16"></td><td><pre>GRANT</pre></td></tr><tr><td data-num="17"></td><td><pre></pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token comment"># 退出命令行</span></pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token assign-left variable">postgres</span><span class="token operator">=</span><span class="token comment"># \q</span></pre></td></tr><tr><td data-num="20"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos bin<span class="token punctuation">]</span>$</pre></td></tr></table></figure><ol start="7"><li>psql 登陆数据库</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># -U 指定用户,-d 指定数据库,-h 指定服务器,-p 指定端口</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos bin<span class="token punctuation">]</span>$ ./psql <span class="token parameter variable">-U</span> platform <span class="token parameter variable">-d</span> x_platform <span class="token parameter variable">-h</span> <span class="token number">127.0</span>.0.1 <span class="token parameter variable">-p</span> <span class="token number">5432</span></pre></td></tr><tr><td data-num="3"></td><td><pre>psql <span class="token punctuation">(</span><span class="token number">15.0</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="4"></td><td><pre>Type <span class="token string">"help"</span> <span class="token keyword">for</span> help.</pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token assign-left variable">x_platform</span><span class="token operator">=</span><span class="token operator">></span></pre></td></tr></table></figure><ol start="8"><li>停止、重启命令</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 停止 pg_ctl stop -D $PGDATA -m smart # 等所有的连接终止后关闭数据库。如果客户端连接不终止,则无法关闭数据库</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 停止 pg_ctl stop -D $PGDATA -m fast # 相当于 oracle 数据库的 immdiate 模式</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># 停止 pg_ctl stop -D $PGDATA -m immediate # 相当于 oracle 数据库的 abort 模式</span></pre></td></tr><tr><td data-num="4"></td><td><pre>/usr/local/pgsql/bin/pg_ctl stop <span class="token parameter variable">-D</span> /usr/local/pgsql/data/ <span class="token parameter variable">-m</span> smart</pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 重启</span></pre></td></tr><tr><td data-num="7"></td><td><pre>/usr/local/pgsql/bin/pg_ctl <span class="token parameter variable">-D</span> /usr/local/pgsql/data/ <span class="token parameter variable">-l</span> /usr/local/pgsql/logs/logfile.log restart</pre></td></tr></table></figure><ol start="9"><li>备份,还原</li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># dump 备份至文件</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 命令格式: ./pg_dump -U 用户名 -h 127.0.0.1 -p 5432 数据库名 > 备份至文件名</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos bin<span class="token punctuation">]</span>$ ./pg_dump <span class="token parameter variable">-U</span> platform <span class="token parameter variable">-h</span> <span class="token number">127.0</span>.0.1 <span class="token parameter variable">-p</span> <span class="token number">5432</span> x_platform <span class="token operator">></span> /home/postgres/x_platform_14-20221014.bak</pre></td></tr><tr><td data-num="4"></td><td><pre>Password: 输入对应数据库账号的密码</pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 恢复数据库,还原 dump 文件</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># pg_dump 创建的备份文件可以被工具 psql 识别。因此可以使用 psql 来读取 pg_dump 创建的备份文件,实现恢复数据库的功能。例如:</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># 命令格式: psql 数据库名 < 备份至文件名</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># 命令格式: psql -U 用户名 -h 127.0.0.1 -p 5432 数据库名 < 备份至文件名</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 指定的数据库必须已经存在。如果不存在,用户应当先创建 dbname 指定的数据库,然后再执行恢复数据的命令。</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment"># psql 也支持和 pg_dump 一样的命令行选项,如 - h 和 - p 等。创建数据库 dbname 时,必须使用 template0 作为模板数据库,可以使用工具 createdb 创建数据库</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># 也可以在 psql 中执行 SQL 命令 create database 来创建数据库。下面是两个实例:</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token comment">#(1)createdb -T template0 dbname(数据库名)</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token comment">#(2)create database dbname template=template0</span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token punctuation">[</span>postgres@VM-20-8-centos bin<span class="token punctuation">]</span>$ ./psql <span class="token parameter variable">-U</span> platform <span class="token parameter variable">-h</span> <span class="token number">127.0</span>.0.1 <span class="token parameter variable">-p</span> <span class="token number">5432</span> 数据库名 <span class="token operator"><</span> 备份至文件名</pre></td></tr></table></figure><h1 id="安装方式二rpm-安装方式"><a class="markdownIt-Anchor" href="#安装方式二rpm-安装方式">#</a> 安装方式二(RPM 安装方式):</h1><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># Install the repository RPM:</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">sudo</span> yum <span class="token function">install</span> <span class="token parameter variable">-y</span> https://download.postgresql.org/pub/repos/yum/reporpms/EL-6-x86_64/pgdg-redhat-repo-latest.noarch.rpm</pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># Install PostgreSQL:</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token function">sudo</span> yum <span class="token function">install</span> <span class="token parameter variable">-y</span> postgresql14-server</pre></td></tr><tr><td data-num="6"></td><td><pre></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># Optionally initialize the database and enable automatic start:</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token function">sudo</span> <span class="token function">service</span> postgresql-14 initdb</pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token function">sudo</span> <span class="token function">chkconfig</span> postgresql-14 on</pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token function">sudo</span> <span class="token function">service</span> postgresql-14 start</pre></td></tr></table></figure><h1 id="linux启动-postgresql-通用脚本-z_postgressh"><a class="markdownIt-Anchor" href="#linux启动-postgresql-通用脚本-z_postgressh">#</a> Linux 启动 PostgreSQL 通用脚本 <code>z_postgres.sh</code></h1><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token shebang important">#!/bin/sh</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># Copyright (c) xhal.cc 2022. All Rights Reserved.</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># Project Name: platform</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># Author: Hal [[email protected]]</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># Date: 2022/10/17 下午 8:59</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># Version: 1.0</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># LastModified: 2022/10/17 下午 8:59</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment"># Linux 启动 PostgreSQL 通用脚本</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token comment">#进入当前目录</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token assign-left variable">BASE_PATH</span><span class="token operator">=</span>/usr/local/pgsql</pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token assign-left variable">BASE_BIN_PATH</span><span class="token operator">=</span><span class="token variable">$BASE_PATH</span>/bin</pre></td></tr><tr><td data-num="16"></td><td><pre></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token assign-left variable">DATA_PATH</span><span class="token operator">=</span><span class="token variable">$BASE_PATH</span>/data/</pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token assign-left variable">LOG_FILE_PATH</span><span class="token operator">=</span>/usr/local/pgsql/logs/logfile.log</pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token assign-left variable">PROCESS_NAME</span><span class="token operator">=</span>postgres</pre></td></tr><tr><td data-num="20"></td><td><pre><span class="token comment"># PostgreSQL 默认端口 5432</span></pre></td></tr><tr><td data-num="21"></td><td><pre><span class="token assign-left variable">PROCESS_PORT</span><span class="token operator">=</span><span class="token number">5432</span></pre></td></tr><tr><td data-num="22"></td><td><pre></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token comment">#使用说明 用来提示参数</span></pre></td></tr><tr><td data-num="24"></td><td><pre><span class="token function-name function">usage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="25"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"Usage: sh 脚本名.sh [start|stop|restart|status]"</span></pre></td></tr><tr><td data-num="26"></td><td><pre> <span class="token builtin class-name">exit</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="27"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="28"></td><td><pre></pre></td></tr><tr><td data-num="29"></td><td><pre><span class="token comment">#检查程序是否已运行</span></pre></td></tr><tr><td data-num="30"></td><td><pre><span class="token function-name function">is_exist</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="31"></td><td><pre> <span class="token comment"># 根据应用名称,获取进程 pid (当存在多个时不适用)</span></pre></td></tr><tr><td data-num="32"></td><td><pre> <span class="token comment"># pid=$(ps -ef|grep $PROCESS_NAME|grep -v grep|awk '{print $2}')</span></pre></td></tr><tr><td data-num="33"></td><td><pre></pre></td></tr><tr><td data-num="34"></td><td><pre> <span class="token comment"># 根据端口号 获取对应 pid (需要 root 权限)</span></pre></td></tr><tr><td data-num="35"></td><td><pre> <span class="token comment"># pid=$(netstat -nlp | grep :$PROCESS_PORT | awk '{print $7}' | awk -F"/" '{ print $1 }');</span></pre></td></tr><tr><td data-num="36"></td><td><pre> <span class="token assign-left variable">pid</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">lsof</span> <span class="token parameter variable">-t</span> -i:$PROCESS_PORT<span class="token variable">)</span></span></pre></td></tr><tr><td data-num="37"></td><td><pre> <span class="token comment">#如果不存在返回 1 存在返回 0</span></pre></td></tr><tr><td data-num="38"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-z</span> <span class="token string">"<span class="token variable">${pid}</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="39"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="40"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="41"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">0</span></pre></td></tr><tr><td data-num="42"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="43"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="44"></td><td><pre></pre></td></tr><tr><td data-num="45"></td><td><pre><span class="token comment">#启动方法</span></pre></td></tr><tr><td data-num="46"></td><td><pre><span class="token function-name function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="47"></td><td><pre> is_exist</pre></td></tr><tr><td data-num="48"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="49"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${PROCESS_NAME}</span> - [PORT:<span class="token variable">${PROCESS_PORT}</span>] is already running .pid =<span class="token variable">${pid}</span> ."</span></pre></td></tr><tr><td data-num="50"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="51"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token variable">$BASE_PATH</span>/<span class="token variable">$PROCESS_NAME</span></pre></td></tr><tr><td data-num="52"></td><td><pre> <span class="token variable">$BASE_BIN_PATH</span>/pg_ctl <span class="token parameter variable">-D</span> <span class="token variable">$DATA_PATH</span> <span class="token parameter variable">-l</span> <span class="token variable">$LOG_FILE_PATH</span> start</pre></td></tr><tr><td data-num="53"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${PROCESS_NAME}</span> - [PORT:<span class="token variable">${PROCESS_PORT}</span>] start success"</span></pre></td></tr><tr><td data-num="54"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="55"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="56"></td><td><pre></pre></td></tr><tr><td data-num="57"></td><td><pre><span class="token comment">#停止方法</span></pre></td></tr><tr><td data-num="58"></td><td><pre><span class="token function-name function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="59"></td><td><pre> is_exist</pre></td></tr><tr><td data-num="60"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="61"></td><td><pre> <span class="token comment"># 停止 pg_ctl stop -D $PGDATA -m smart # 等所有的连接终止后关闭数据库。如果客户端连接不终止,则无法关闭数据库</span></pre></td></tr><tr><td data-num="62"></td><td><pre> <span class="token comment"># 停止 pg_ctl stop -D $PGDATA -m fast # 相当于 oracle 数据库的 immdiate 模式</span></pre></td></tr><tr><td data-num="63"></td><td><pre> <span class="token comment"># 停止 pg_ctl stop -D $PGDATA -m immediate # 相当于 oracle 数据库的 abort 模式</span></pre></td></tr><tr><td data-num="64"></td><td><pre> <span class="token variable">$BASE_BIN_PATH</span>/pg_ctl stop <span class="token parameter variable">-D</span> <span class="token variable">$DATA_PATH</span> <span class="token parameter variable">-m</span> smart</pre></td></tr><tr><td data-num="65"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="66"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${PROCESS_NAME}</span> - [PORT:<span class="token variable">${PROCESS_PORT}</span>] is not running"</span></pre></td></tr><tr><td data-num="67"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="68"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="69"></td><td><pre></pre></td></tr><tr><td data-num="70"></td><td><pre><span class="token comment">#输出状态</span></pre></td></tr><tr><td data-num="71"></td><td><pre><span class="token function-name function">status</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="72"></td><td><pre> is_exist</pre></td></tr><tr><td data-num="73"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="74"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${PROCESS_NAME}</span> - [PORT:<span class="token variable">${PROCESS_PORT}</span>] is running . pid is <span class="token variable">${pid}</span>"</span></pre></td></tr><tr><td data-num="75"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="76"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${PROCESS_NAME}</span> - [PORT:<span class="token variable">${PROCESS_PORT}</span>] is not running"</span></pre></td></tr><tr><td data-num="77"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="78"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="79"></td><td><pre></pre></td></tr><tr><td data-num="80"></td><td><pre><span class="token comment">#重启</span></pre></td></tr><tr><td data-num="81"></td><td><pre><span class="token function-name function">restart</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="82"></td><td><pre> <span class="token variable">$BASE_BIN_PATH</span>/pg_ctl <span class="token parameter variable">-D</span> <span class="token variable">$DATA_PATH</span> <span class="token parameter variable">-l</span> <span class="token variable">$LOG_FILE_PATH</span> restart</pre></td></tr><tr><td data-num="83"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="84"></td><td><pre></pre></td></tr><tr><td data-num="85"></td><td><pre><span class="token comment">#根据输入参数执行对应的方法,不输入则执行使用说明</span></pre></td></tr><tr><td data-num="86"></td><td><pre><span class="token keyword">case</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token keyword">in</span></pre></td></tr><tr><td data-num="87"></td><td><pre> <span class="token string">"start"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="88"></td><td><pre> start</pre></td></tr><tr><td data-num="89"></td><td><pre><span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="90"></td><td><pre> <span class="token string">"stop"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="91"></td><td><pre> stop</pre></td></tr><tr><td data-num="92"></td><td><pre><span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="93"></td><td><pre> <span class="token string">"status"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="94"></td><td><pre> status</pre></td></tr><tr><td data-num="95"></td><td><pre><span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="96"></td><td><pre> <span class="token string">"restart"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="97"></td><td><pre> restart</pre></td></tr><tr><td data-num="98"></td><td><pre><span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="99"></td><td><pre> *<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="100"></td><td><pre> usage</pre></td></tr><tr><td data-num="101"></td><td><pre><span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="102"></td><td><pre><span class="token keyword">esac</span></pre></td></tr></table></figure>]]></content>
<summary type="html"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" cla</summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Centos" scheme="http://xsea.cc/tags/Centos/"/>
<category term="PostgreSQL" scheme="http://xsea.cc/tags/PostgreSQL/"/>
</entry>
<entry>
<title>Redis+Keepalived_实现双机主从互备【互为主从、主从自动切换】</title>
<link href="http://xsea.cc/2022/10/8b778184.html"/>
<id>http://xsea.cc/2022/10/8b778184.html</id>
<published>2022-10-06T02:30:03.000Z</published>
<updated>2023-03-15T16:09:42.828Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>实际生产中,系统压力不大且仅两台物理服务器;实际一个 Redis 服务完全够用,但为了高可用及容灾备份,又不够哨兵模式的三台,所以做此实现方案。</p></blockquote><h2 id="1-资源配置"><a class="markdownIt-Anchor" href="#1-资源配置">#</a> 1、资源配置:</h2><blockquote><p>实际服务器:<br>192.168.30.7【从】 、 192.168.30.8【主】</p><p>(Redis) 虚拟 IP: 192.168.30.6<br> 系统服务,配置连接此虚拟 IP 即可</p></blockquote><h2 id="2-在两台服务器上安装-redis-安装目录-usrlocalredis"><a class="markdownIt-Anchor" href="#2-在两台服务器上安装-redis-安装目录-usrlocalredis">#</a> 2、在两台服务器上安装 Redis 安装目录 <code>/usr/local/redis</code></h2><p>安装步骤,可参考上篇教程: <span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXF3MjMxL2FydGljbGUvZGV0YWlscy8xMjkwNTIyNjA=">Centos7.9 源码安装 Redis 5.x</span></p><p>**【必须用到】** 里面的启动脚本文件 <code>redis.sh</code></p><h2 id="3-增加redis配置文件-masterconf-slaveconf"><a class="markdownIt-Anchor" href="#3-增加redis配置文件-masterconf-slaveconf">#</a> 3、增加 redis 配置文件 <code>master.conf</code> / <code>slave.conf</code></h2><p>在目录 <code>/usr/local/redis/conf </code> 下新增<br> <code>master.conf</code> 从原 <code>redis.conf</code> 复制,配置文件两台服务器一样就行,如果有配置访问密码一定要一致</p><p><code>slave.conf</code> 配置文件,主要区别如下:<br>192.168.30.8【主】配置:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># replicaof 配置对方 IP 端口</span></pre></td></tr><tr><td data-num="2"></td><td><pre>replicaof <span class="token number">192.168</span>.30.7 <span class="token number">6379</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># 访问密码</span></pre></td></tr><tr><td data-num="4"></td><td><pre>masterauth <span class="token string">"xxx123"</span></pre></td></tr></table></figure><p>192.168.30.7【从】配置:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># replicaof 配置对方 IP 端口</span></pre></td></tr><tr><td data-num="2"></td><td><pre>replicaof <span class="token number">192.168</span>.30.8 <span class="token number">6379</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># 访问密码</span></pre></td></tr><tr><td data-num="4"></td><td><pre>masterauth <span class="token string">"xxx123"</span></pre></td></tr></table></figure><p>配置文件修改完成后,启动服务:<br>启动 Redis 192.168.30.8【主】 以 【master】 方式启动</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@centos7 redis<span class="token punctuation">]</span><span class="token comment"># /usr/local/redis/redis.sh startmaster</span></pre></td></tr></table></figure><p>启动 Redis 192.168.30.7【从】 以 【slave】 方式启动</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@centos7 redis<span class="token punctuation">]</span><span class="token comment"># /usr/local/redis/redis.sh startslave</span></pre></td></tr></table></figure><h2 id="4-支持-keepalived-配置脚本文件"><a class="markdownIt-Anchor" href="#4-支持-keepalived-配置脚本文件">#</a> 4、支持 Keepalived 配置脚本文件</h2><p>于目录 <code>/usr/local/redis/</code> 创建脚本 <code>vip_keepalived.sh</code> (主从一样):</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token shebang important">#!/bin/sh</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># 虚拟 IP (Virtual IP) 检测实现 - keepalived 调用实现</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># </span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># Keepalived vrrp_script 原理:</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 根据调用的 script 脚本结果进行分析:</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># - 如果执行结果【为 0】, 且 weight 配置的值【大于 0】,则优先级相应的【增加】</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># - 如果执行结果【非 0】, 且 weight 配置的值【小于 0】,则优先级相应的【减少】</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># </span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 实现原理: 本方案 weight 配置的值 建议【大于 0】, priority 相等、preempt 模式</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment"># 1、检测当前节点服务是否正常、若正常且为 master 主节点,则使 vip 为指向本机</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># 2、若本机节点服务进程不存在(则由从节点判定),以下为从节点判断逻辑</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token comment"># - 当前节点服务进程是否正常,若正常则判断下 redis 中的 role 是否为 slave</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token comment"># - 如果是 slave ,判断 master_link_status 是否为 up</span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token comment"># - 如果不为 up, 则代表主节点连接不上,则修改本节点为 master, 则使 vip 为指向本节点</span></pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token comment"># PS: 本脚本需要配合 redis.sh 使用</span></pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token comment"># @author [email protected] 2022-09-08</span></pre></td></tr><tr><td data-num="19"></td><td><pre></pre></td></tr><tr><td data-num="20"></td><td><pre><span class="token assign-left variable">BASE_PATH</span><span class="token operator">=</span>/usr/local/redis</pre></td></tr><tr><td data-num="21"></td><td><pre></pre></td></tr><tr><td data-num="22"></td><td><pre><span class="token comment"># 备份方案,仅检测服务状态 (此方案不能切换为 master)</span></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token comment"># 0 表示检查进程是否运行</span></pre></td></tr><tr><td data-num="24"></td><td><pre><span class="token comment"># /usr/bin/killall -0 redis-server </span></pre></td></tr><tr><td data-num="25"></td><td><pre></pre></td></tr><tr><td data-num="26"></td><td><pre><span class="token comment"># 本方案 weight 配置的值 建议【大于 0】, priority 相等、preempt 模式</span></pre></td></tr><tr><td data-num="27"></td><td><pre></pre></td></tr><tr><td data-num="28"></td><td><pre><span class="token comment"># 1、检测当前节点服务是否正常、若正常且为 master 主节点,返回 0 </span></pre></td></tr><tr><td data-num="29"></td><td><pre></pre></td></tr><tr><td data-num="30"></td><td><pre><span class="token function-name function">check</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="31"></td><td><pre> <span class="token comment"># 判断运行的角色 [master, slave] master 返回 0, slave 返回 1, 其它 返回 2, redis 未运行 返回 9</span></pre></td></tr><tr><td data-num="32"></td><td><pre> <span class="token variable">$BASE_PATH</span>/redis.sh role</pre></td></tr><tr><td data-num="33"></td><td><pre> <span class="token assign-left variable">redisRole</span><span class="token operator">=</span><span class="token variable">$?</span></pre></td></tr><tr><td data-num="34"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"当前 redis role值: [<span class="token variable">$redisRole</span>]"</span></pre></td></tr><tr><td data-num="35"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$redisRole</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="36"></td><td><pre> <span class="token comment"># redis 有运行,且为 master 主节点,返回 0</span></pre></td></tr><tr><td data-num="37"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">0</span></pre></td></tr><tr><td data-num="38"></td><td><pre> <span class="token keyword">elif</span> <span class="token punctuation">[</span> <span class="token variable">$redisRole</span> <span class="token parameter variable">-eq</span> <span class="token string">"1"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="39"></td><td><pre> <span class="token comment">#echo "redis 有运行,且为 slave 状态"</span></pre></td></tr><tr><td data-num="40"></td><td><pre> <span class="token comment"># 判断 master_link_status 是否为 up</span></pre></td></tr><tr><td data-num="41"></td><td><pre> <span class="token variable">$BASE_PATH</span>/redis.sh slaveup</pre></td></tr><tr><td data-num="42"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="43"></td><td><pre> <span class="token comment">#echo "slave 连接 master 正常" </span></pre></td></tr><tr><td data-num="44"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="45"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="46"></td><td><pre> <span class="token comment"># slave 连接 master 已断开,修改本节点为 master</span></pre></td></tr><tr><td data-num="47"></td><td><pre> <span class="token variable">$BASE_PATH</span>/redis.sh tomaster</pre></td></tr><tr><td data-num="48"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">0</span></pre></td></tr><tr><td data-num="49"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="50"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="51"></td><td><pre> <span class="token comment">#echo "其它状态,直接返回对应结果 [$redisRole]"</span></pre></td></tr><tr><td data-num="52"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token variable">$redisRole</span></pre></td></tr><tr><td data-num="53"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="54"></td><td><pre></pre></td></tr><tr><td data-num="55"></td><td><pre> <span class="token comment">#echo "redis 未运行,直接返回 1"</span></pre></td></tr><tr><td data-num="56"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="57"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="58"></td><td><pre></pre></td></tr><tr><td data-num="59"></td><td><pre>check</pre></td></tr></table></figure><p>于目录 <code>/usr/local/redis/</code> 创建脚本 <code>vip_log.sh</code> (主从一样):</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token shebang important">#!/bin/sh</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 记录 Keepalived 切换事件日志</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># @author [email protected] 2022-09-08</span></pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token assign-left variable">now</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">date</span> <span class="token string">"+%Y-%m-%d %H:%M:%S"</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token assign-left variable">LOG_FILE_PATH</span><span class="token operator">=</span>/usr/local/redis/logs/keepalived.log</pre></td></tr><tr><td data-num="7"></td><td><pre></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$now</span> -- <span class="token variable">$1</span>"</span> <span class="token operator">>></span> <span class="token variable">$LOG_FILE_PATH</span></pre></td></tr></table></figure><h2 id="5-修改-keepalived-配置"><a class="markdownIt-Anchor" href="#5-修改-keepalived-配置">#</a> 5、修改 Keepalived 配置</h2><p>修改 192.168.30.8【主】 Keepalived 配置 <code>/etc/keepalived/keepalived.conf</code></p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@centos7 redis<span class="token punctuation">]</span><span class="token comment"># vim /etc/keepalived/keepalived.conf</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token operator">!</span> Configuration File <span class="token keyword">for</span> keepalived</pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># Redis 相关配置,开始 =======================</span></pre></td></tr><tr><td data-num="6"></td><td><pre>vrrp_script chk_redis <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> script <span class="token string">"/usr/local/redis/vip_keepalived.sh "</span></pre></td></tr><tr><td data-num="8"></td><td><pre> interval <span class="token number">5</span> <span class="token comment"># 检测时间间隔</span></pre></td></tr><tr><td data-num="9"></td><td><pre> weight <span class="token number">88</span> <span class="token comment"># 如果条件成立的话【script 执行结果为 0】,则权重值按此增加</span></pre></td></tr><tr><td data-num="10"></td><td><pre> fall <span class="token number">2</span> <span class="token comment"># 定义检测失败的最大次数,如果设置为 3 表示请求失败 2 次时,就认为节点故障</span></pre></td></tr><tr><td data-num="11"></td><td><pre> rise <span class="token number">1</span> <span class="token comment"># 定义请求成功的次数,如果设置为 1 表示一次请求成功后,就认为节点恢复正常</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="13"></td><td><pre></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token comment"># 定义虚拟路由,VI_Redis 为虚拟路由的标示符,自己定义名称</span></pre></td></tr><tr><td data-num="15"></td><td><pre>vrrp_instance VI_Redis <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="16"></td><td><pre> state BACKUP <span class="token comment"># 来决定主从 MASTER BACKUP</span></pre></td></tr><tr><td data-num="17"></td><td><pre> interface ens192 <span class="token comment"># 绑定虚拟 IP 的网络接口,根据自己的机器填写</span></pre></td></tr><tr><td data-num="18"></td><td><pre> virtual_router_id <span class="token number">8</span> <span class="token comment"># 虚拟路由的 ID 号, 两个节点设置必须一样</span></pre></td></tr><tr><td data-num="19"></td><td><pre> mcast_src_ip <span class="token number">192.168</span>.30.8 <span class="token comment"># 填写本机 ip</span></pre></td></tr><tr><td data-num="20"></td><td><pre> priority <span class="token number">100</span> <span class="token comment"># 节点优先级,主要比从节点优先级高</span></pre></td></tr><tr><td data-num="21"></td><td><pre> preempt <span class="token comment"># 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题</span></pre></td></tr><tr><td data-num="22"></td><td><pre> advert_int <span class="token number">1</span> <span class="token comment"># 组播信息发送间隔,两个节点设置必须一样,默认 1s</span></pre></td></tr><tr><td data-num="23"></td><td><pre> authentication <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="24"></td><td><pre> auth_type PASS</pre></td></tr><tr><td data-num="25"></td><td><pre> auth_pass <span class="token number">1111</span></pre></td></tr><tr><td data-num="26"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="27"></td><td><pre> <span class="token comment"># 将 track_script 块加入 instance 配置块</span></pre></td></tr><tr><td data-num="28"></td><td><pre> track_script <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="29"></td><td><pre> chk_redis <span class="token comment">#执行 Redis 监控的服务</span></pre></td></tr><tr><td data-num="30"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="31"></td><td><pre></pre></td></tr><tr><td data-num="32"></td><td><pre> <span class="token comment"># 变为 MASTER 后执行脚本</span></pre></td></tr><tr><td data-num="33"></td><td><pre> notify_master <span class="token string">"/usr/local/redis/vip_log.sh to_be_【master】"</span></pre></td></tr><tr><td data-num="34"></td><td><pre> <span class="token comment"># 变为 BACKUP 后执行脚本</span></pre></td></tr><tr><td data-num="35"></td><td><pre> notify_backup <span class="token string">"/usr/local/redis/vip_log.sh to_be_【slave】"</span></pre></td></tr><tr><td data-num="36"></td><td><pre> <span class="token comment"># 状态变为 FAULT 后执行脚本</span></pre></td></tr><tr><td data-num="37"></td><td><pre> notify_fault <span class="token string">"/usr/local/redis/vip_log.sh keepalived_is_Fault"</span></pre></td></tr><tr><td data-num="38"></td><td><pre> <span class="token comment"># VRRP 停止 后执行脚本</span></pre></td></tr><tr><td data-num="39"></td><td><pre> notify_stop <span class="token string">"/usr/local/redis/vip_log.sh keepalived_is_stop...!"</span></pre></td></tr><tr><td data-num="40"></td><td><pre></pre></td></tr><tr><td data-num="41"></td><td><pre> virtual_ipaddress <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="42"></td><td><pre> <span class="token number">192.168</span>.30.6 <span class="token comment">#虚拟 ip</span></pre></td></tr><tr><td data-num="43"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="44"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>修改完成后, 重启 keepalived</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@centos7 redis<span class="token punctuation">]</span><span class="token comment"># systemctl restart keepalived.service</span></pre></td></tr></table></figure><p>修改 192.168.30.7【从】 Keepalived 配置 <code>/etc/keepalived/keepalived.conf</code></p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@centos7 redis<span class="token punctuation">]</span><span class="token comment"># vim /etc/keepalived/keepalived.conf</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># Redis 相关配置,开始 =======================</span></pre></td></tr><tr><td data-num="4"></td><td><pre>vrrp_script chk_redis <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="5"></td><td><pre> script <span class="token string">"/usr/local/redis/vip_keepalived.sh "</span></pre></td></tr><tr><td data-num="6"></td><td><pre> interval <span class="token number">5</span> <span class="token comment"># 检测时间间隔</span></pre></td></tr><tr><td data-num="7"></td><td><pre> weight <span class="token number">88</span> <span class="token comment"># 如果条件成立的话【script 执行结果为 0】,则权重值按此增加</span></pre></td></tr><tr><td data-num="8"></td><td><pre> fall <span class="token number">2</span> <span class="token comment"># 定义检测失败的最大次数,如果设置为 3 表示请求失败 2 次时,就认为节点故障</span></pre></td></tr><tr><td data-num="9"></td><td><pre> rise <span class="token number">1</span> <span class="token comment"># 定义请求成功的次数,如果设置为 1 表示一次请求成功后,就认为节点恢复正常</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="11"></td><td><pre></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># 定义虚拟路由,VI_Redis 为虚拟路由的标示符,自己定义名称</span></pre></td></tr><tr><td data-num="13"></td><td><pre>vrrp_instance VI_Redis <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="14"></td><td><pre> state BACKUP <span class="token comment"># 来决定主从 MASTER BACKUP</span></pre></td></tr><tr><td data-num="15"></td><td><pre> interface ens192 <span class="token comment"># 绑定虚拟 IP 的网络接口,根据自己的机器填写</span></pre></td></tr><tr><td data-num="16"></td><td><pre> virtual_router_id <span class="token number">8</span> <span class="token comment"># 虚拟路由的 ID 号, 两个节点设置必须一样</span></pre></td></tr><tr><td data-num="17"></td><td><pre> mcast_src_ip <span class="token number">192.168</span>.30.7 <span class="token comment"># 填写本机 ip</span></pre></td></tr><tr><td data-num="18"></td><td><pre> priority <span class="token number">100</span> <span class="token comment"># 节点优先级,主要比从节点优先级高</span></pre></td></tr><tr><td data-num="19"></td><td><pre> preempt <span class="token comment"># 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题</span></pre></td></tr><tr><td data-num="20"></td><td><pre> advert_int <span class="token number">1</span> <span class="token comment"># 组播信息发送间隔,两个节点设置必须一样,默认 1s</span></pre></td></tr><tr><td data-num="21"></td><td><pre> authentication <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="22"></td><td><pre> auth_type PASS</pre></td></tr><tr><td data-num="23"></td><td><pre> auth_pass <span class="token number">1111</span></pre></td></tr><tr><td data-num="24"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="25"></td><td><pre> <span class="token comment"># 将 track_script 块加入 instance 配置块</span></pre></td></tr><tr><td data-num="26"></td><td><pre> track_script <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="27"></td><td><pre> chk_redis <span class="token comment">#执行 Redis 监控的服务</span></pre></td></tr><tr><td data-num="28"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="29"></td><td><pre></pre></td></tr><tr><td data-num="30"></td><td><pre> <span class="token comment"># 变为 MASTER 后执行脚本</span></pre></td></tr><tr><td data-num="31"></td><td><pre> notify_master <span class="token string">"/usr/local/redis/vip_log.sh to_be_【master】"</span></pre></td></tr><tr><td data-num="32"></td><td><pre> <span class="token comment"># 变为 BACKUP 后执行脚本</span></pre></td></tr><tr><td data-num="33"></td><td><pre> notify_backup <span class="token string">"/usr/local/redis/vip_log.sh to_be_【slave】"</span></pre></td></tr><tr><td data-num="34"></td><td><pre> <span class="token comment"># 状态变为 FAULT 后执行脚本</span></pre></td></tr><tr><td data-num="35"></td><td><pre> notify_fault <span class="token string">"/usr/local/redis/vip_log.sh keepalived_is_Fault"</span></pre></td></tr><tr><td data-num="36"></td><td><pre> <span class="token comment"># VRRP 停止 后执行脚本</span></pre></td></tr><tr><td data-num="37"></td><td><pre> notify_stop <span class="token string">"/usr/local/redis/vip_log.sh keepalived_is_stop...!"</span></pre></td></tr><tr><td data-num="38"></td><td><pre></pre></td></tr><tr><td data-num="39"></td><td><pre> virtual_ipaddress <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="40"></td><td><pre> <span class="token number">192.168</span>.30.6 <span class="token comment">#虚拟 ip</span></pre></td></tr><tr><td data-num="41"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="42"></td><td><pre></pre></td></tr><tr><td data-num="43"></td><td><pre><span class="token comment"># 当存在 IP 冲突时,可指定单播 ip 为对方 IP</span></pre></td></tr><tr><td data-num="44"></td><td><pre> <span class="token comment"># unicast_peer {</span></pre></td></tr><tr><td data-num="45"></td><td><pre> <span class="token comment"># 192.168.30.8 # 另一台 IP</span></pre></td></tr><tr><td data-num="46"></td><td><pre> <span class="token comment">#}</span></pre></td></tr><tr><td data-num="47"></td><td><pre></pre></td></tr><tr><td data-num="48"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>修改完成后, 重启 keepalived</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@centos7 redis<span class="token punctuation">]</span><span class="token comment"># systemctl restart keepalived.service</span></pre></td></tr></table></figure><h2 id="6-修改开机启动-redisservice-配置命令"><a class="markdownIt-Anchor" href="#6-修改开机启动-redisservice-配置命令">#</a> 6、修改开机启动 <code>redis.service</code> 配置命令</h2><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>Unit<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 服务描述</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token assign-left variable">Description</span><span class="token operator">=</span>Redis-Server</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># 在 XX 服务后启动</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token assign-left variable">After</span><span class="token operator">=</span>network.target</pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 服务运行参数; 注意本节点内命令要用绝对路径</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">[</span>Service<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># 后台运行方式</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token assign-left variable">Type</span><span class="token operator">=</span>forking</pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 启动命令 (主要修改此部分由 start 修改为 startauto)</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token assign-left variable">ExecStart</span><span class="token operator">=</span>/usr/local/redis/redis.sh startauto</pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># 是否给服务分配独立的临时空间</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token assign-left variable">PrivateTmp</span><span class="token operator">=</span>true</pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token comment"># 运行级别下服务安装的相关设置, 可设置为多用户,即系统运行级别为 3</span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token punctuation">[</span>Install<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token assign-left variable">WantedBy</span><span class="token operator">=</span>multi-user.target</pre></td></tr></table></figure>]]></content>
<summary type="html"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" cla</summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Redis" scheme="http://xsea.cc/tags/Redis/"/>
</entry>
<entry>
<title>Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码)</title>
<link href="http://xsea.cc/2022/09/f92ce47.html"/>
<id>http://xsea.cc/2022/09/f92ce47.html</id>
<published>2022-09-09T02:06:08.000Z</published>
<updated>2023-03-14T14:59:08.452Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>在这里,我们生成三个自定义变量</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment">#以下为内置变量</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token variable">$time_iso8601</span> 日期格式示例: <span class="token number">2022</span>-09-08T18:16:01+08:00</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token variable">$time_local</span> 日期格式示例: 02/Aug/2022:11:11:32 +0800</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token variable">$msec</span> 日期格式示例: <span class="token number">1663839717.105</span> 当前的Unix时间戳,单位为秒,小数为毫秒</pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment">#生成自定义变量</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token variable">$time_zh</span> 示例值: <span class="token number">2022</span>-10-08 <span class="token number">22</span>:00:18</pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token variable">$timestamp</span> 示例值: <span class="token number">1663839717105</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token variable">$time_zh_ms</span> 示例值: <span class="token number">2022</span>-10-08 <span class="token number">22</span>:00:18,888</pre></td></tr></table></figure><h3 id="方法一-set-只能在server节点内"><a class="markdownIt-Anchor" href="#方法一-set-只能在server节点内">#</a> 方法一 :set (只能在 server 节点内)</h3><p>建议创建独立 conf 文件,使用 include 方式,如: <code>time-zh.conf</code> 内容如下:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 该 文件使用方法 在 nginx 配置 server 节点内: include time-zh.conf;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># nginx 内置变量,解析为定义格式,仅支持到秒 (实现支持到毫秒)</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># $time_iso8601 日期格式示例: 2022-09-08T18:16:01+08:00</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># $time_local 日期格式示例: 02/Aug/2022:11:11:32 +0800</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># $msec 日期格式示例: 1663839717.105 当前的 Unix 时间戳,单位为秒,小数为毫秒</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># 自定义变量 - 默认值</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment">#set $time_zh $time_iso8601;</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment">#set $timestamp $msec;</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment">#set $time_zh_ms $time_zh,000;</span></pre></td></tr><tr><td data-num="12"></td><td><pre></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token comment"># 格式化日期</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$time_iso8601</span> ~ <span class="token string">"^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\+\d{2})"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$year</span> <span class="token variable">$1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$month</span> <span class="token variable">$2</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="17"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$day</span> <span class="token variable">$3</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="18"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$hour</span> <span class="token variable">$4</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="19"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$minute</span> <span class="token variable">$5</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="20"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$second</span> <span class="token variable">$6</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="21"></td><td><pre> <span class="token comment"># 时区,只到小时</span></pre></td></tr><tr><td data-num="22"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$time_zone</span> <span class="token variable">$7</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="23"></td><td><pre> <span class="token comment"># 自定义 yyyy-MM-dd hh:mi:ss 格式</span></pre></td></tr><tr><td data-num="24"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$time_zh</span> <span class="token string">"<span class="token variable">$1</span>-<span class="token variable">$2</span>-<span class="token variable">$3</span> <span class="token variable">$4</span>:<span class="token variable">$5</span>:<span class="token variable">$6</span>"</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="25"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="26"></td><td><pre><span class="token comment"># 时间戳,单位毫秒 使用 $msec 去除中间的小数点实现</span></pre></td></tr><tr><td data-num="27"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$msec</span> ~ <span class="token string">"^(\d+)\.(\d+)"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="28"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$timestamp</span> <span class="token variable">$1</span><span class="token variable">$2</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="29"></td><td><pre> <span class="token comment"># 自定义 yyyy-MM-dd hh:mi:ss,SSS 带毫秒格式</span></pre></td></tr><tr><td data-num="30"></td><td><pre> <span class="token builtin class-name">set</span> <span class="token variable">$time_zh_ms</span> <span class="token variable">$time_zh</span>,<span class="token variable">$2</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="31"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><h3 id="方法二-set_by_lua-只能在server节点内"><a class="markdownIt-Anchor" href="#方法二-set_by_lua-只能在server节点内">#</a> 方法二: set_by_lua (只能在 server 节点内)</h3><p>建议创建独立 conf 文件,使用 include 方式,如: <code>time-zh-lua.conf</code> 内容如下:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 该 文件使用方法 在 nginx 配置 server 节点内: include time-zh-lua.conf;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># nginx 内置变量,解析为定义格式,仅支持到秒 (实现支持到毫秒)</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># 取 ngx_lua 模块提供的带缓存的时间接口</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># ngx.now () 日期格式示例: 1663839717.105 当前的 Unix 时间戳,单位为秒,小数为毫秒;与 nginx 内置变量 $msec 相同</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># -- 因 nginx 有缓存时间,所以与实际服务器时间会有些许偏差,可能偏差几毫秒 - 正常业务可忽略不计</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># -- 若 一定要强一致,可先调用 ngx.update_time () 强制更新,但成本较高,不推荐使用</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># ngx.time () 日期格式示例: 1663839717 当前的 Unix 时间戳,单位为秒 (1970 年至今)</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># ngx.var.time_local 日期格式示例: 02/Aug/2022:11:11:32 +0800</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment"># ngx.utctime () 日期格式示例: 2022-09-08 10:16:01</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># ngx.localtime () 日期格式示例: 2022-09-08 18:16:01</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token comment"># ngx.today () 日期格式示例: 2022-09-08</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="15"></td><td><pre></pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token comment"># 本地时间(yyyy-MM-dd hh:mi:ss)</span></pre></td></tr><tr><td data-num="17"></td><td><pre>set_by_lua <span class="token variable">$time_zh</span> <span class="token string">'return ngx.localtime()'</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="18"></td><td><pre></pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token comment"># Unix 时间戳,单位为毫秒</span></pre></td></tr><tr><td data-num="20"></td><td><pre>set_by_lua <span class="token variable">$timestamp</span> <span class="token string">'return ngx.now() * 1000'</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="21"></td><td><pre></pre></td></tr><tr><td data-num="22"></td><td><pre><span class="token comment"># 本地时间(yyyy-MM-dd hh:mi:ss,SSS)</span></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token comment"># 毫秒数: 先用 ngx.now ()%1, 取余数去除秒的部分,再 * 1000 获取毫秒部分,再用 math.floor + 0.5 四舍五入,再用 string.format 固定 3 位长度</span></pre></td></tr><tr><td data-num="24"></td><td><pre>set_by_lua <span class="token variable">$time_zh_ms</span> <span class="token string">'return ngx.localtime()..","..string.format("%03d", math.floor(ngx.now()%1*1000+0.5))'</span><span class="token punctuation">;</span></pre></td></tr></table></figure><h3 id="方法三-map-在http节点内"><a class="markdownIt-Anchor" href="#方法三-map-在http节点内">#</a> 方法三: map (在 http 节点内)</h3><p>建议创建独立 conf 文件,使用 include 方式,如: <code>time-zh-map.conf</code> 内容如下:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 该 文件使用方法 在 nginx 配置 http 节点内: include time-zh-map.conf;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># nginx 内置变量,解析为定义格式,仅支持到秒</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># $time_iso8601 日期格式示例: 2022-09-08T18:16:01+08:00</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># $time_local 日期格式示例: 02/Aug/2022:11:11:32 +0800</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># $msec 日期格式示例: 1663839717.105 当前的 Unix 时间戳,单位为秒,小数为毫秒</span></pre></td></tr><tr><td data-num="8"></td><td><pre></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># 使用以下 map 必须增加 map_hash_bucket_size 大小,否则会报异常</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 默认值为 cpu 的缓存行大小,一般为 64</span></pre></td></tr><tr><td data-num="11"></td><td><pre>map_hash_bucket_size <span class="token number">128</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token comment"># 自定义 yyyy-MM-dd hh:mi:ss 格式</span></pre></td></tr><tr><td data-num="14"></td><td><pre>map <span class="token variable">$time_iso8601</span> <span class="token variable">$time_zh</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="15"></td><td><pre> default <span class="token variable">$time_iso8601</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token string">"~(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(\+\d{2})"</span> <span class="token string">"<span class="token variable">$1</span> <span class="token variable">$2</span>"</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="18"></td><td><pre></pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token comment"># 时间戳,单位毫秒 使用 $msec 去除中间的小数点实现</span></pre></td></tr><tr><td data-num="20"></td><td><pre>map <span class="token variable">$msec</span> <span class="token variable">$timestamp</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="21"></td><td><pre> default <span class="token variable">$msec</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="22"></td><td><pre> ~<span class="token punctuation">(</span><span class="token punctuation">\</span>d+<span class="token punctuation">)</span><span class="token punctuation">\</span>.<span class="token punctuation">(</span><span class="token punctuation">\</span>d+<span class="token punctuation">)</span> <span class="token variable">$1</span><span class="token variable">$2</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="24"></td><td><pre></pre></td></tr><tr><td data-num="25"></td><td><pre><span class="token comment"># 自定义 yyyy-MM-dd hh:mi:ss,SSS 带毫秒格式</span></pre></td></tr><tr><td data-num="26"></td><td><pre>map <span class="token string">"<span class="token variable">$time_iso8601</span> # <span class="token variable">$msec</span>"</span> <span class="token variable">$time_zh_ms</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="27"></td><td><pre> default <span class="token variable">$time_zh</span>,000<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="28"></td><td><pre> <span class="token string">"~(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(\+\d{2}:\d{2}) # (\d+)\.(\d+)$"</span> <span class="token string">"<span class="token variable">$1</span> <span class="token variable">$2</span>,<span class="token variable">$5</span>"</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="29"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><blockquote><p>PS: 若存在多个 Server, 推荐使用<strong>方法三</strong>,则不需要每个 server 配置一次</p></blockquote>]]></content>
<summary type="html"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" cla</summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Openresty" scheme="http://xsea.cc/tags/Openresty/"/>
<category term="Nginx" scheme="http://xsea.cc/tags/Nginx/"/>
</entry>
<entry>
<title>Centos7.9_源码安装Openresty1.21.4.1</title>
<link href="http://xsea.cc/2022/09/333f749f.html"/>
<id>http://xsea.cc/2022/09/333f749f.html</id>
<published>2022-09-06T03:50:08.000Z</published>
<updated>2023-05-25T12:58:48.582Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="1-环境及版本"><a class="markdownIt-Anchor" href="#1-环境及版本">#</a> 1、环境及版本</h2><p>系统版本: Centos 7.9.2009</p><p>Openresty: 1.21.4.1</p><h2 id="2-必要组件安装执行-yum-命令安装"><a class="markdownIt-Anchor" href="#2-必要组件安装执行-yum-命令安装">#</a> 2、必要组件安装 (执行 yum 命令安装)</h2><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum <span class="token function">install</span> openssl-devel gcc <span class="token function">curl</span> pcre-devel <span class="token parameter variable">-y</span></pre></td></tr></table></figure><h2 id="3-获取安装包-解压"><a class="markdownIt-Anchor" href="#3-获取安装包-解压">#</a> 3、获取安装包、解压</h2><p>访问官网地址: <span class="exturl" data-url="aHR0cHM6Ly9vcGVucmVzdHkub3Jn">https://openresty.org</span></p><p>获取下载链接: <span class="exturl" data-url="aHR0cHM6Ly9vcGVucmVzdHkub3JnL2Rvd25sb2FkL29wZW5yZXN0eS0xLjIxLjQuMS50YXIuZ3o=">https://openresty.org/download/openresty-1.21.4.1.tar.gz</span></p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 切换到目录</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token builtin class-name">cd</span> /usr/local</pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># wget 下载安装包</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token function">wget</span> https://openresty.org/download/openresty-1.21.4.1.tar.gz</pre></td></tr><tr><td data-num="6"></td><td><pre></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># 解压命令</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> openresty-1.21.4.1.tar.gz</pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 进入解压目录</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token builtin class-name">cd</span> openresty-1.21.4.1</pre></td></tr></table></figure><h2 id="4-修改源码以支持-ip_hash-可以在内网同网段生效以实现负载均衡"><a class="markdownIt-Anchor" href="#4-修改源码以支持-ip_hash-可以在内网同网段生效以实现负载均衡">#</a> 4、修改源码,以支持 <code>ip_hash</code> 可以在内网同网段生效,以实现负载均衡</h2><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@nginx openresty-1.21.4.1<span class="token punctuation">]</span><span class="token comment"># vim bundle/nginx-1.21.4/src/http/modules/ngx_http_upstream_ip_hash_module.c</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">..</span>.</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># 修改位置一: 第 80 行,数字 3 改为 4 ngx_http_upstream_ip_hash_pseudo_addr [3] 修改为 ngx_http_upstream_ip_hash_pseudo_addr [4] </span></pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token number">80</span> static u_char ngx_http_upstream_ip_hash_pseudo_addr<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token number">81</span> </pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">..</span>.</pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># 修改位置二: 第 124 行,数字 3 改为 4; [iphp->addrlen = 3] 修改为 [iphp->addrlen = 4] </span></pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token number">121</span> <span class="token keyword">case</span> AF_INET:</pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token number">122</span> sin <span class="token operator">=</span> <span class="token punctuation">(</span>struct sockaddr_in *<span class="token punctuation">)</span> r-<span class="token operator">></span>connection-<span class="token operator">></span>sockaddr<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token number">123</span> iphp-<span class="token operator">></span>addr <span class="token operator">=</span> <span class="token punctuation">(</span>u_char *<span class="token punctuation">)</span> <span class="token operator">&</span>sin-<span class="token operator">></span>sin_addr.s_addr<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token number">124</span> iphp-<span class="token operator">></span>addrlen <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token number">125</span> <span class="token builtin class-name">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token number">126</span> </pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token number">127</span> <span class="token comment">#if (NGX_HAVE_INET6)</span></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token number">128</span> <span class="token keyword">case</span> AF_INET6:</pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token number">129</span> sin6 <span class="token operator">=</span> <span class="token punctuation">(</span>struct sockaddr_in6 *<span class="token punctuation">)</span> r-<span class="token operator">></span>connection-<span class="token operator">></span>sockaddr <span class="token punctuation">;</span></pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token number">130</span> iphp-<span class="token operator">></span>addr <span class="token operator">=</span> <span class="token punctuation">(</span>u_char *<span class="token punctuation">)</span> <span class="token operator">&</span>sin6-<span class="token operator">></span>sin6_addr.s6_addr<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="20"></td><td><pre><span class="token number">131</span> iphp-<span class="token operator">></span>addrlen <span class="token operator">=</span> <span class="token number">16</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="21"></td><td><pre><span class="token number">132</span> <span class="token builtin class-name">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="22"></td><td><pre><span class="token number">133</span> <span class="token comment">#endif</span></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token number">134</span> </pre></td></tr><tr><td data-num="24"></td><td><pre><span class="token comment"># 修改位置三: 第 137 行,数字 3 改为 4; [iphp->addrlen = 3] 修改为 [iphp->addrlen = 4] </span></pre></td></tr><tr><td data-num="25"></td><td><pre></pre></td></tr><tr><td data-num="26"></td><td><pre><span class="token number">135</span> default:</pre></td></tr><tr><td data-num="27"></td><td><pre><span class="token number">136</span> iphp-<span class="token operator">></span>addr <span class="token operator">=</span> ngx_http_upstream_ip_hash_pseudo_addr<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="28"></td><td><pre><span class="token number">137</span> iphp-<span class="token operator">></span>addrlen <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="29"></td><td><pre><span class="token number">138</span> <span class="token punctuation">}</span></pre></td></tr></table></figure><h2 id="5-安装"><a class="markdownIt-Anchor" href="#5-安装">#</a> 5、安装</h2><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 执行 configure 命令 (默认安装目录 `--prefix=/usr/local/openresty`)</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 需要的模块自定义,此处仅示例</span></pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre>./configure <span class="token parameter variable">--prefix</span><span class="token operator">=</span>/usr/local/openresty <span class="token punctuation">\</span></pre></td></tr><tr><td data-num="5"></td><td><pre> --with-luajit <span class="token punctuation">\</span></pre></td></tr><tr><td data-num="6"></td><td><pre> --with-http_ssl_module <span class="token punctuation">\</span></pre></td></tr><tr><td data-num="7"></td><td><pre> --with-http_v2_module <span class="token punctuation">\</span></pre></td></tr><tr><td data-num="8"></td><td><pre> --with-http_realip_module </pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 执行安装命令</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token function">make</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token function">make</span> <span class="token function">install</span></pre></td></tr></table></figure><h2 id="6-开机启动"><a class="markdownIt-Anchor" href="#6-开机启动">#</a> 6、 开机启动</h2><h3 id="方法一-etcrclocal"><a class="markdownIt-Anchor" href="#方法一-etcrclocal">#</a> 方法一 (/etc/rc.local):</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@nginx local<span class="token punctuation">]</span><span class="token comment"># vim /etc/rc.local</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment">#!/bin/bash</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># It is highly advisable to create own systemd services or udev rules</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># to run scripts during boot instead of using this file.</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># In contrast to previous versions due to parallel execution during boot</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># this script will NOT be run after all other services.</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment"># Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># that this script will be executed during boot.</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token function">touch</span> /var/lock/subsys/local</pre></td></tr><tr><td data-num="14"></td><td><pre></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token comment"># 启动 Openresty nginx 服务</span></pre></td></tr><tr><td data-num="16"></td><td><pre>/usr/local/openresty/nginx/sbin/nginx</pre></td></tr></table></figure><blockquote><p>PS: Centos7 默认 rc.local 是不可执行的,仅是为了兼容性添加。</p><p>若重启验证不生效,则需要给此文件添加执行权限</p><p>注意:此文件执行时, <code>/etc/profile</code> 配置的环境变量不会生效</p></blockquote><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@nginx home<span class="token punctuation">]</span><span class="token comment"># chmod +x /etc/rc.d/rc.local</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@nginx rc.d<span class="token punctuation">]</span><span class="token comment"># cd /etc/rc.d/</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token punctuation">[</span>root@nginx rc.d<span class="token punctuation">]</span><span class="token comment"># ll</span></pre></td></tr><tr><td data-num="4"></td><td><pre>total <span class="token number">4</span></pre></td></tr><tr><td data-num="5"></td><td><pre>drwxr-xr-x. <span class="token number">2</span> root root <span class="token number">70</span> Mar <span class="token number">10</span> <span class="token number">15</span>:30 init.d</pre></td></tr><tr><td data-num="6"></td><td><pre>drwxr-xr-x. <span class="token number">2</span> root root <span class="token number">45</span> Mar <span class="token number">10</span> <span class="token number">15</span>:30 rc0.d</pre></td></tr><tr><td data-num="7"></td><td><pre>drwxr-xr-x. <span class="token number">2</span> root root <span class="token number">45</span> Mar <span class="token number">10</span> <span class="token number">15</span>:30 rc1.d</pre></td></tr><tr><td data-num="8"></td><td><pre>drwxr-xr-x. <span class="token number">2</span> root root <span class="token number">45</span> Mar <span class="token number">10</span> <span class="token number">15</span>:30 rc2.d</pre></td></tr><tr><td data-num="9"></td><td><pre>drwxr-xr-x. <span class="token number">2</span> root root <span class="token number">45</span> Mar <span class="token number">10</span> <span class="token number">15</span>:30 rc3.d</pre></td></tr><tr><td data-num="10"></td><td><pre>drwxr-xr-x. <span class="token number">2</span> root root <span class="token number">45</span> Mar <span class="token number">10</span> <span class="token number">15</span>:30 rc4.d</pre></td></tr><tr><td data-num="11"></td><td><pre>drwxr-xr-x. <span class="token number">2</span> root root <span class="token number">45</span> Mar <span class="token number">10</span> <span class="token number">15</span>:30 rc5.d</pre></td></tr><tr><td data-num="12"></td><td><pre>drwxr-xr-x. <span class="token number">2</span> root root <span class="token number">45</span> Mar <span class="token number">10</span> <span class="token number">15</span>:30 rc6.d</pre></td></tr><tr><td data-num="13"></td><td><pre>-rwxrwxrwx. <span class="token number">1</span> root root <span class="token number">550</span> Mar <span class="token number">10</span> <span class="token number">17</span>:36 rc.local</pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token punctuation">[</span>root@nginx rc.d<span class="token punctuation">]</span><span class="token comment">#</span></pre></td></tr></table></figure><h3 id="方法二使用-service"><a class="markdownIt-Anchor" href="#方法二使用-service">#</a> 方法二(使用 service):</h3><p>在系统服务目录 <code> /usr/lib/systemd/system/</code> 下,创建 <code>openresty.service</code> 文件</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>Unit<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 服务描述</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token assign-left variable">Description</span><span class="token operator">=</span>Openresty</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># 在 XX 服务后启动</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token assign-left variable">After</span><span class="token operator">=</span>network.target</pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 服务运行参数; 注意本节点内命令要用绝对路径</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">[</span>Service<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># PID</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token assign-left variable">PIDFile</span><span class="token operator">=</span>/var/run/openresty.pid</pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 后台运行方式</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token assign-left variable">Type</span><span class="token operator">=</span>forking</pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># 启动命令</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token assign-left variable">ExecStart</span><span class="token operator">=</span>/usr/local/openresty/bin/openresty <span class="token parameter variable">-c</span> /usr/local/openresty/nginx/conf/nginx.conf</pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token assign-left variable">ExecReload</span><span class="token operator">=</span>/bin/kill <span class="token parameter variable">-s</span> <span class="token parameter variable">-HUP</span> <span class="token variable">$MAINPID</span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token assign-left variable">ExecStop</span><span class="token operator">=</span>/bin/kill <span class="token parameter variable">-s</span> QUIT <span class="token variable">$MAINPID</span></pre></td></tr><tr><td data-num="16"></td><td><pre></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token comment"># 是否给服务分配独立的临时空间</span></pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token assign-left variable">PrivateTmp</span><span class="token operator">=</span>true</pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token comment"># 运行级别下服务安装的相关设置, 可设置为多用户,即系统运行级别为 3</span></pre></td></tr><tr><td data-num="20"></td><td><pre><span class="token punctuation">[</span>Install<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="21"></td><td><pre><span class="token assign-left variable">WantedBy</span><span class="token operator">=</span>multi-user.target</pre></td></tr></table></figure><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>systemctl <span class="token builtin class-name">enable</span> openresty.service <span class="token comment"># 设置开机启动</span></pre></td></tr><tr><td data-num="2"></td><td><pre>systemctl disable openresty.service <span class="token comment"># 停止开机启动</span></pre></td></tr><tr><td data-num="3"></td><td><pre>systemctl start openresty.service <span class="token comment"># 启动服务</span></pre></td></tr><tr><td data-num="4"></td><td><pre>systemctl stop openresty.service <span class="token comment"># 停止服务</span></pre></td></tr><tr><td data-num="5"></td><td><pre>systemctl status openresty.service <span class="token comment"># 查看服务状态</span></pre></td></tr><tr><td data-num="6"></td><td><pre>systemctl restart openresty.service <span class="token comment"># 重启服务</span></pre></td></tr><tr><td data-num="7"></td><td><pre>systemctl list-units <span class="token parameter variable">--type</span><span class="token operator">=</span>service <span class="token comment"># 查看所有已启动的服务</span></pre></td></tr></table></figure>]]></content>
<summary type="html"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" cla</summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Openresty" scheme="http://xsea.cc/tags/Openresty/"/>
</entry>
<entry>
<title>Centos7.9_源码安装Redis_5.x</title>
<link href="http://xsea.cc/2022/08/4b3066d5.html"/>
<id>http://xsea.cc/2022/08/4b3066d5.html</id>
<published>2022-08-08T00:18:08.000Z</published>
<updated>2023-05-25T12:58:48.582Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="1-环境及版本"><a class="markdownIt-Anchor" href="#1-环境及版本">#</a> 1、环境及版本</h2><p>系统版本: Centos 7.9.2009</p><p>Redis: 5.0.14</p><h2 id="2-源码安装cd-redis-5014"><a class="markdownIt-Anchor" href="#2-源码安装cd-redis-5014">#</a> 2、源码安装 cd redis-5.0.14</h2><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> redis-5.0.14.tar.gz</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token builtin class-name">cd</span> redis-5.0.14</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">make</span> </pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># 指定 安装目录 PREFIX</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token function">make</span> <span class="token assign-left variable">PREFIX</span><span class="token operator">=</span>/usr/local/redis <span class="token function">install</span></pre></td></tr></table></figure><h1 id="指定-安装目录-prefix"><a class="markdownIt-Anchor" href="#指定-安装目录-prefix">#</a> 指定 安装目录 PREFIX</h1><p>make PREFIX=/usr/local/redis install</p><h2 id="3-复制-修改-redisconf-配置"><a class="markdownIt-Anchor" href="#3-复制-修改-redisconf-配置">#</a> 3、复制、修改 [redis.conf] 配置</h2><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># 创建 redis 下的配置目录</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">mkdir</span> <span class="token parameter variable">-p</span> /usr/local/redis/conf</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">mkdir</span> <span class="token parameter variable">-p</span> /usr/local/redis/data</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token function">mkdir</span> <span class="token parameter variable">-p</span> /usr/local/redis/logs</pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 创建完成后,目录结构</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">[</span>root@centos7 redis<span class="token punctuation">]</span><span class="token comment"># tree /usr/local/redis/</span></pre></td></tr><tr><td data-num="8"></td><td><pre>/usr/local/redis/</pre></td></tr><tr><td data-num="9"></td><td><pre>├── bin</pre></td></tr><tr><td data-num="10"></td><td><pre>│ ├── redis-benchmark</pre></td></tr><tr><td data-num="11"></td><td><pre>│ ├── redis-check-aof</pre></td></tr><tr><td data-num="12"></td><td><pre>│ ├── redis-check-rdb</pre></td></tr><tr><td data-num="13"></td><td><pre>│ ├── redis-cli</pre></td></tr><tr><td data-num="14"></td><td><pre>│ ├── redis-sentinel -<span class="token operator">></span> redis-server</pre></td></tr><tr><td data-num="15"></td><td><pre>│ └── redis-server</pre></td></tr><tr><td data-num="16"></td><td><pre>├── conf <span class="token comment"># 配置文件存放目录</span></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token operator">|</span> └── redis.conf <span class="token comment"># 从 源码包 复制过来的默认配置文件</span></pre></td></tr><tr><td data-num="18"></td><td><pre>├── data <span class="token comment"># rdb 数据文件存放目录</span></pre></td></tr><tr><td data-num="19"></td><td><pre>├── logs <span class="token comment"># 日志文件存放目录</span></pre></td></tr></table></figure><p>修改 [redis.conf] 配置</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@centos7 redis<span class="token punctuation">]</span><span class="token comment"># vim conf/redis.conf</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># bind IP 配置</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token builtin class-name">bind</span> <span class="token number">0.0</span>.0.0</pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 守护进程方式运行</span></pre></td></tr><tr><td data-num="7"></td><td><pre>daemonize <span class="token function">yes</span></pre></td></tr><tr><td data-num="8"></td><td><pre></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># 日志文件路径(配置到上方创建的日志目录)</span></pre></td></tr><tr><td data-num="10"></td><td><pre>logfile <span class="token string">"/usr/local/redis/log/redis_6379.log"</span></pre></td></tr><tr><td data-num="11"></td><td><pre></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># 数据文件存放目录</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token function">dir</span> <span class="token string">"/usr/local/redis/data"</span></pre></td></tr></table></figure><h2 id="4-创建启动脚本方便操作"><a class="markdownIt-Anchor" href="#4-创建启动脚本方便操作">#</a> 4、创建启动脚本方便操作</h2><p>脚本支持效果如下:</p><p><img data-src="https://static.xhal.net/picgo/redis_command.png" alt="redis命令"></p><p>在目录 [/usr/local/redis/] 下创建脚本文件 [ <span class="exturl" data-url="aHR0cDovL3JlZGlzLnNo">redis.sh</span> ] 内容:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token shebang important">#!/bin/sh</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># Redis 启动脚本</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># </span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># @author: [email protected] 2022-08-06</span></pre></td></tr><tr><td data-num="6"></td><td><pre></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># 脚本当前目录</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token assign-left variable">SH_DIR</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">cd</span> <span class="token punctuation">$(</span> <span class="token function">dirname</span> $<span class="token punctuation">{</span><span class="token environment constant">BASH_SOURCE</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token builtin class-name">pwd</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token assign-left variable">APP_NAME</span><span class="token operator">=</span><span class="token string">"redis-server"</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment"># 根路径</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment">#APP_PATH=/usr/local/redis</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token assign-left variable">APP_PATH</span><span class="token operator">=</span><span class="token variable">$SH_DIR</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token assign-left variable">BIN_PATH</span><span class="token operator">=</span><span class="token variable">$APP_PATH</span>/bin</pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token comment"># 配置文件路径</span></pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token assign-left variable">CONF_PATH</span><span class="token operator">=</span><span class="token variable">$APP_PATH</span>/conf</pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token assign-left variable">CONF_FILE_PATH</span><span class="token operator">=</span><span class="token variable">$CONF_PATH</span>/redis.conf</pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token assign-left variable">MASTER_CONF_FILE_PATH</span><span class="token operator">=</span><span class="token variable">$CONF_PATH</span>/master.conf</pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token assign-left variable">SLAVE_CONF_FILE_PATH</span><span class="token operator">=</span><span class="token variable">$CONF_PATH</span>/slave.conf</pre></td></tr><tr><td data-num="20"></td><td><pre></pre></td></tr><tr><td data-num="21"></td><td><pre><span class="token comment"># 运行端口 - 默认 6379</span></pre></td></tr><tr><td data-num="22"></td><td><pre><span class="token assign-left variable">APP_PORT</span><span class="token operator">=</span><span class="token number">6379</span></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token comment"># Redis 密码 - 默认为空</span></pre></td></tr><tr><td data-num="24"></td><td><pre><span class="token assign-left variable">APP_PASS</span><span class="token operator">=</span><span class="token string">""</span></pre></td></tr><tr><td data-num="25"></td><td><pre></pre></td></tr><tr><td data-num="26"></td><td><pre><span class="token comment">## 从配置文件,读取端口、密码</span></pre></td></tr><tr><td data-num="27"></td><td><pre><span class="token assign-left variable">CONFIG_STR</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">cat</span> $CONF_FILE_PATH <span class="token operator">|</span> <span class="token function">grep</span> <span class="token parameter variable">-E</span> <span class="token string">'^port|^requirepass'</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="28"></td><td><pre><span class="token comment">#echo "CONFIG_STR: $CONFIG_STR"</span></pre></td></tr><tr><td data-num="29"></td><td><pre><span class="token assign-left variable">PORT_STR</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> $CONFIG_STR <span class="token operator">|</span> <span class="token function">sed</span> <span class="token string">'s/port \([0-9]*\).*/\1/g'</span> <span class="token variable">)</span></span></pre></td></tr><tr><td data-num="30"></td><td><pre><span class="token assign-left variable">PASS_STR</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> $CONFIG_STR <span class="token operator">|</span> <span class="token function">sed</span> <span class="token string">'s/.*requirepass \(.*\)/\1/g'</span> <span class="token operator">|</span> <span class="token function">sed</span> <span class="token string">'s/"//g'</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="31"></td><td><pre></pre></td></tr><tr><td data-num="32"></td><td><pre><span class="token comment">#echo "PORT_STR: $PORT_STR</span><span class="token string">"</pre></td></tr><tr><td data-num="33"></td><td><pre>#echo "</span>PASS_STR: <span class="token variable">$PASS_STR</span><span class="token string">"</pre></td></tr><tr><td data-num="34"></td><td><pre>if [ -n "</span><span class="token variable">$PORT_STR</span><span class="token string">" ]; then</pre></td></tr><tr><td data-num="35"></td><td><pre> APP_PORT=<span class="token variable">$PORT_STR</span>;</pre></td></tr><tr><td data-num="36"></td><td><pre>fi</pre></td></tr><tr><td data-num="37"></td><td><pre>if [ -n "</span><span class="token variable">$PASS_STR</span><span class="token string">" ]; then</pre></td></tr><tr><td data-num="38"></td><td><pre> APP_PASS=<span class="token variable">$PASS_STR</span>;</pre></td></tr><tr><td data-num="39"></td><td><pre>fi</pre></td></tr><tr><td data-num="40"></td><td><pre></pre></td></tr><tr><td data-num="41"></td><td><pre># 处理密码连接字符串</pre></td></tr><tr><td data-num="42"></td><td><pre>PASS_KEY="</span>"</pre></td></tr><tr><td data-num="43"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-n</span> <span class="token string">"<span class="token variable">$APP_PASS</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="44"></td><td><pre> <span class="token assign-left variable">PASS_KEY</span><span class="token operator">=</span><span class="token string">"-a <span class="token variable">$APP_PASS</span>"</span></pre></td></tr><tr><td data-num="45"></td><td><pre><span class="token keyword">fi</span></pre></td></tr><tr><td data-num="46"></td><td><pre><span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"<span class="token entity" title="\e">\e</span>[35m======================================================================<span class="token entity" title="\e">\e</span>[0m"</span></pre></td></tr><tr><td data-num="47"></td><td><pre></pre></td></tr><tr><td data-num="48"></td><td><pre><span class="token comment">#使用说明 用来提示参数</span></pre></td></tr><tr><td data-num="49"></td><td><pre><span class="token function-name function">usage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="50"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"<span class="token entity" title="\e">\e</span>[33mAPP_PATH:<span class="token entity" title="\e">\e</span>[0m <span class="token entity" title="\e">\e</span>[36m <span class="token variable">$APP_PATH</span> <span class="token entity" title="\e">\e</span>[0m"</span></pre></td></tr><tr><td data-num="51"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"<span class="token entity" title="\e">\e</span>[33mUsage:<span class="token entity" title="\e">\e</span>[0m <span class="token entity" title="\e">\e</span>[36m <span class="token variable">$0</span> [start|stop|restart] <span class="token entity" title="\e">\e</span>[0m"</span></pre></td></tr><tr><td data-num="52"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"<span class="token entity" title="\e">\e</span>[33mUsage:<span class="token entity" title="\e">\e</span>[0m <span class="token entity" title="\e">\e</span>[36m <span class="token variable">$0</span> [status|running|role|slaveup] <span class="token entity" title="\e">\e</span>[0m"</span></pre></td></tr><tr><td data-num="53"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"<span class="token entity" title="\e">\e</span>[33mUsage:<span class="token entity" title="\e">\e</span>[0m <span class="token entity" title="\e">\e</span>[36m <span class="token variable">$0</span> [tomaster|toslave|startmaster|startslave|startauto] <span class="token entity" title="\e">\e</span>[0m"</span></pre></td></tr><tr><td data-num="54"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"<span class="token entity" title="\e">\e</span>[35m----------------------------------------------------------------------<span class="token entity" title="\e">\e</span>[0m"</span></pre></td></tr><tr><td data-num="55"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m start <span class="token entity" title="\e">\e</span>[0m: 正常启动 Redis,<span class="token variable">$BIN_PATH</span>/redis-server <span class="token variable">$CONF_FILE_PATH</span>"</span></pre></td></tr><tr><td data-num="56"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m stop <span class="token entity" title="\e">\e</span>[0m: 停止 Redis, <span class="token variable">$BIN_PATH</span>/redis-cli shutdown"</span></pre></td></tr><tr><td data-num="57"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m restart <span class="token entity" title="\e">\e</span>[0m: 重启 Redis, stop && start"</span></pre></td></tr><tr><td data-num="58"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"<span class="token entity" title="\e">\e</span>[35m----------------------------------------------------------------------<span class="token entity" title="\e">\e</span>[0m"</span></pre></td></tr><tr><td data-num="59"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m status <span class="token entity" title="\e">\e</span>[0m: 当前运行状态、对应角色类型"</span></pre></td></tr><tr><td data-num="60"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m running <span class="token entity" title="\e">\e</span>[0m: 当前运行状态,运行中返回 0,否则返回 1"</span></pre></td></tr><tr><td data-num="61"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m role <span class="token entity" title="\e">\e</span>[0m: 当前运行对应角色类型,master 返回 0, slave 返回 1, 其它 返回2, redis 未运行 返回9"</span></pre></td></tr><tr><td data-num="62"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m slaveup <span class="token entity" title="\e">\e</span>[0m: 当前运行状态为slave时,master_link_status是否为up (是则返回0,否则为1)"</span></pre></td></tr><tr><td data-num="63"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"<span class="token entity" title="\e">\e</span>[35m----------------------------------------------------------------------<span class="token entity" title="\e">\e</span>[0m"</span></pre></td></tr><tr><td data-num="64"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m tomaster <span class="token entity" title="\e">\e</span>[0m: 运行状态转换角色类型为【master】"</span></pre></td></tr><tr><td data-num="65"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m toslave <span class="token entity" title="\e">\e</span>[0m: 运行状态转换角色类型为【slave】"</span></pre></td></tr><tr><td data-num="66"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m startmaster<span class="token entity" title="\e">\e</span>[0m: 未运行时,以【master】角色类型运行"</span></pre></td></tr><tr><td data-num="67"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m startslave <span class="token entity" title="\e">\e</span>[0m: 未运行时,以【slave】角色类型运行"</span></pre></td></tr><tr><td data-num="68"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">" -<span class="token entity" title="\e">\e</span>[32m startauto <span class="token entity" title="\e">\e</span>[0m: 未运行时,根据slave.conf的master节点状态,自动判断当前节点以【master/slave】角色类型运行"</span></pre></td></tr><tr><td data-num="69"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">""</span></pre></td></tr><tr><td data-num="70"></td><td><pre> <span class="token builtin class-name">exit</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="71"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="72"></td><td><pre></pre></td></tr><tr><td data-num="73"></td><td><pre><span class="token comment">#检查程序是否已运行</span></pre></td></tr><tr><td data-num="74"></td><td><pre><span class="token function-name function">is_running</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="75"></td><td><pre> <span class="token comment"># 根据应用名称,获取进程 pid (当存在多个时不适用)</span></pre></td></tr><tr><td data-num="76"></td><td><pre> <span class="token comment">#pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`</span></pre></td></tr><tr><td data-num="77"></td><td><pre></pre></td></tr><tr><td data-num="78"></td><td><pre> <span class="token comment"># 根据端口号获取对应 pid</span></pre></td></tr><tr><td data-num="79"></td><td><pre> <span class="token comment">#pid=$(lsof -t -i:$APP_PORT)</span></pre></td></tr><tr><td data-num="80"></td><td><pre> <span class="token assign-left variable">pid</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">lsof</span> -i:$APP_PORT <span class="token operator">|</span> <span class="token function">grep</span> *: <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{print $2}'</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="81"></td><td><pre> <span class="token comment">#如果不存在返回 1 存在返回 0</span></pre></td></tr><tr><td data-num="82"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-z</span> <span class="token string">"<span class="token variable">${pid}</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="83"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="84"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="85"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">0</span></pre></td></tr><tr><td data-num="86"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="87"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="88"></td><td><pre></pre></td></tr><tr><td data-num="89"></td><td><pre><span class="token comment"># 启动方法 </span></pre></td></tr><tr><td data-num="90"></td><td><pre><span class="token function-name function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="91"></td><td><pre> is_running</pre></td></tr><tr><td data-num="92"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="93"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] is already running . pid=<span class="token variable">${pid}</span>"</span></pre></td></tr><tr><td data-num="94"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="95"></td><td><pre> <span class="token variable">$BIN_PATH</span>/redis-server <span class="token variable">$CONF_FILE_PATH</span></pre></td></tr><tr><td data-num="96"></td><td><pre> <span class="token function">sleep</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="97"></td><td><pre> status</pre></td></tr><tr><td data-num="98"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="99"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] start success . pid=<span class="token variable">${pid}</span>"</span></pre></td></tr><tr><td data-num="100"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="101"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] start fail ."</span></pre></td></tr><tr><td data-num="102"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="103"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="104"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="105"></td><td><pre></pre></td></tr><tr><td data-num="106"></td><td><pre><span class="token comment"># 用 master.conf 的配置文件替换 redis.conf 后启动</span></pre></td></tr><tr><td data-num="107"></td><td><pre><span class="token function-name function">startmaster</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="108"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"准备以【 master 】模式启动,复制替换 redis.conf 文件..."</span></pre></td></tr><tr><td data-num="109"></td><td><pre> <span class="token function">cp</span> <span class="token parameter variable">-f</span> <span class="token variable">$MASTER_CONF_FILE_PATH</span> <span class="token variable">$CONF_FILE_PATH</span></pre></td></tr><tr><td data-num="110"></td><td><pre> <span class="token function">sleep</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="111"></td><td><pre> start </pre></td></tr><tr><td data-num="112"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="113"></td><td><pre></pre></td></tr><tr><td data-num="114"></td><td><pre><span class="token comment"># 用 slave.conf 的配置文件替换 redis.conf 后启动</span></pre></td></tr><tr><td data-num="115"></td><td><pre><span class="token function-name function">startslave</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="116"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"准备以【 slave 】模式启动,复制替换 redis.conf 文件..."</span></pre></td></tr><tr><td data-num="117"></td><td><pre> <span class="token function">cp</span> <span class="token parameter variable">-f</span> <span class="token variable">$SLAVE_CONF_FILE_PATH</span> <span class="token variable">$CONF_FILE_PATH</span></pre></td></tr><tr><td data-num="118"></td><td><pre> <span class="token function">sleep</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="119"></td><td><pre> start</pre></td></tr><tr><td data-num="120"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="121"></td><td><pre></pre></td></tr><tr><td data-num="122"></td><td><pre><span class="token comment"># 自动判断当前启用 master 还是 slave 模式</span></pre></td></tr><tr><td data-num="123"></td><td><pre><span class="token function-name function">startauto</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="124"></td><td><pre> is_running</pre></td></tr><tr><td data-num="125"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="126"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] is already running . pid=<span class="token variable">${pid}</span>"</span></pre></td></tr><tr><td data-num="127"></td><td><pre> <span class="token builtin class-name">exit</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="128"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="129"></td><td><pre></pre></td></tr><tr><td data-num="130"></td><td><pre> <span class="token comment"># 读取 slave.conf 配置,获取对应 master 配置</span></pre></td></tr><tr><td data-num="131"></td><td><pre> <span class="token assign-left variable">arr</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token variable"><span class="token variable">`</span><span class="token function">cat</span> $SLAVE_CONF_FILE_PATH <span class="token operator">|</span> <span class="token function">grep</span> ^replicaof<span class="token variable">`</span></span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="132"></td><td><pre> <span class="token assign-left variable">master_host</span><span class="token operator">=</span><span class="token variable">${arr<span class="token punctuation">[</span>1<span class="token punctuation">]</span>}</span></pre></td></tr><tr><td data-num="133"></td><td><pre> <span class="token assign-left variable">master_port</span><span class="token operator">=</span><span class="token variable">${arr<span class="token punctuation">[</span>2<span class="token punctuation">]</span>}</span></pre></td></tr><tr><td data-num="134"></td><td><pre> <span class="token assign-left variable">authcmd</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">cat</span> $SLAVE_CONF_FILE_PATH <span class="token operator">|</span> <span class="token function">grep</span> ^masterauth <span class="token operator">|</span> <span class="token function">sed</span> <span class="token string">'s/masterauth //g'</span> <span class="token operator">|</span> <span class="token function">sed</span> <span class="token string">'s/"//g'</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="135"></td><td><pre> <span class="token assign-left variable">auth_key</span><span class="token operator">=</span><span class="token string">""</span></pre></td></tr><tr><td data-num="136"></td><td><pre> </pre></td></tr><tr><td data-num="137"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-n</span> <span class="token string">"<span class="token variable">$authcmd</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="138"></td><td><pre> <span class="token assign-left variable">auth_key</span><span class="token operator">=</span><span class="token string">"-a <span class="token variable">$authcmd</span>"</span></pre></td></tr><tr><td data-num="139"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="140"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"设置 master -h <span class="token variable">$master_host</span> -p <span class="token variable">$master_port</span> <span class="token variable">$auth_key</span> "</span></pre></td></tr><tr><td data-num="141"></td><td><pre> <span class="token comment"># 判断 master 配置中的服务,对应角色类型</span></pre></td></tr><tr><td data-num="142"></td><td><pre> <span class="token assign-left variable">roleName</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span>$BIN_PATH/redis-cli <span class="token parameter variable">-h</span> $master_host <span class="token parameter variable">-p</span> $master_port $auth_key info <span class="token operator">|</span> <span class="token function">grep</span> role: <span class="token operator">|</span> <span class="token function">sed</span> <span class="token string">'s/.$//g'</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="143"></td><td><pre> </pre></td></tr><tr><td data-num="144"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"slave 配置的 master 当前类型: <span class="token variable">$roleName</span>"</span></pre></td></tr><tr><td data-num="145"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$roleName</span>"</span> <span class="token operator">=</span> <span class="token string">"role:master"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="146"></td><td><pre> startslave</pre></td></tr><tr><td data-num="147"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="148"></td><td><pre> startmaster</pre></td></tr><tr><td data-num="149"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="150"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="151"></td><td><pre></pre></td></tr><tr><td data-num="152"></td><td><pre><span class="token comment"># 停止方法</span></pre></td></tr><tr><td data-num="153"></td><td><pre><span class="token function-name function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="154"></td><td><pre> is_running</pre></td></tr><tr><td data-num="155"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="156"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] is running . pid=<span class="token variable">${pid}</span> ; stoping..."</span></pre></td></tr><tr><td data-num="157"></td><td><pre> <span class="token comment"># 执行 shutdown</span></pre></td></tr><tr><td data-num="158"></td><td><pre> <span class="token variable">$BIN_PATH</span>/redis-cli <span class="token variable">$PASS_KEY</span> <span class="token function">shutdown</span></pre></td></tr><tr><td data-num="159"></td><td><pre> </pre></td></tr><tr><td data-num="160"></td><td><pre> <span class="token function">sleep</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="161"></td><td><pre> is_running</pre></td></tr><tr><td data-num="162"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="163"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] stop fail . pid=<span class="token variable">${pid}</span>"</span></pre></td></tr><tr><td data-num="164"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="165"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] stop success ."</span></pre></td></tr><tr><td data-num="166"></td><td><pre> <span class="token keyword">fi</span> </pre></td></tr><tr><td data-num="167"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="168"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] is not running ."</span></pre></td></tr><tr><td data-num="169"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="170"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="171"></td><td><pre></pre></td></tr><tr><td data-num="172"></td><td><pre><span class="token comment">#重启</span></pre></td></tr><tr><td data-num="173"></td><td><pre><span class="token function-name function">restart</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="174"></td><td><pre> stop</pre></td></tr><tr><td data-num="175"></td><td><pre> start</pre></td></tr><tr><td data-num="176"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="177"></td><td><pre></pre></td></tr><tr><td data-num="178"></td><td><pre><span class="token comment"># 判断运行的角色 [master, slave]</span></pre></td></tr><tr><td data-num="179"></td><td><pre><span class="token comment"># master 返回 0, slave 返回 1, 其它 返回 2, redis 未运行 返回 9</span></pre></td></tr><tr><td data-num="180"></td><td><pre><span class="token function-name function">role</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="181"></td><td><pre> is_running</pre></td></tr><tr><td data-num="182"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="183"></td><td><pre> <span class="token assign-left variable">roleName</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span>$BIN_PATH/redis-cli $PASS_KEY info <span class="token operator">|</span> <span class="token function">grep</span> role: <span class="token operator">|</span> <span class="token function">sed</span> <span class="token string">'s/.$//g'</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="184"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$roleName</span>"</span> <span class="token operator">=</span> <span class="token string">"role:master"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="185"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">0</span></pre></td></tr><tr><td data-num="186"></td><td><pre> <span class="token keyword">elif</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$roleName</span>"</span> <span class="token operator">=</span> <span class="token string">"role:slave"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="187"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="188"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="189"></td><td><pre> <span class="token comment">#echo "ERROR: unknow role: [$roleName] !!!"</span></pre></td></tr><tr><td data-num="190"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">2</span></pre></td></tr><tr><td data-num="191"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="192"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="193"></td><td><pre> <span class="token comment">#echo "$APP_NAME - [PORT: $APP_PORT] is not running ."</span></pre></td></tr><tr><td data-num="194"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">9</span></pre></td></tr><tr><td data-num="195"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="196"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="197"></td><td><pre></pre></td></tr><tr><td data-num="198"></td><td><pre><span class="token comment"># 判断当前运行的 是否为 slave 且 正常连接上 master</span></pre></td></tr><tr><td data-num="199"></td><td><pre><span class="token comment"># 为简化逻辑,此处实现仅 在 info 信息中匹配 master_link_status:up (运行正常返回 0,否则为 1)</span></pre></td></tr><tr><td data-num="200"></td><td><pre><span class="token comment"># 即正常调用前,应该要知道此节点正常运行 且 为 slave</span></pre></td></tr><tr><td data-num="201"></td><td><pre><span class="token function-name function">slaveup</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="202"></td><td><pre> <span class="token assign-left variable">linkStatus</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span>$BIN_PATH/redis-cli $PASS_KEY info <span class="token operator">|</span> <span class="token function">grep</span> master_link_status:up<span class="token variable">)</span></span></pre></td></tr><tr><td data-num="203"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-z</span> <span class="token string">"<span class="token variable">$linkStatus</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="204"></td><td><pre> <span class="token comment">#echo "redis master link is down"</span></pre></td></tr><tr><td data-num="205"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="206"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="207"></td><td><pre> <span class="token comment">#echo "redis master link is up"</span></pre></td></tr><tr><td data-num="208"></td><td><pre> <span class="token builtin class-name">return</span> <span class="token number">0</span></pre></td></tr><tr><td data-num="209"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="210"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="211"></td><td><pre></pre></td></tr><tr><td data-num="212"></td><td><pre><span class="token comment"># Change Redis to master; Use Command: replicaof no one </span></pre></td></tr><tr><td data-num="213"></td><td><pre><span class="token function-name function">tomaster</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="214"></td><td><pre> role</pre></td></tr><tr><td data-num="215"></td><td><pre> <span class="token assign-left variable">mode</span><span class="token operator">=</span><span class="token variable">$?</span></pre></td></tr><tr><td data-num="216"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$mode</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="217"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] 已经是[ master ] 不必要切换 ."</span></pre></td></tr><tr><td data-num="218"></td><td><pre> <span class="token keyword">elif</span> <span class="token punctuation">[</span> <span class="token variable">$mode</span> <span class="token parameter variable">-eq</span> <span class="token string">"1"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="219"></td><td><pre> <span class="token comment"># 切换配置文件 - 避免下次重启后变化</span></pre></td></tr><tr><td data-num="220"></td><td><pre> <span class="token function">cp</span> <span class="token parameter variable">-f</span> <span class="token variable">$MASTER_CONF_FILE_PATH</span> <span class="token variable">$CONF_FILE_PATH</span></pre></td></tr><tr><td data-num="221"></td><td><pre> <span class="token comment"># 执行切换为 主服务</span></pre></td></tr><tr><td data-num="222"></td><td><pre> <span class="token variable">$BIN_PATH</span>/redis-cli <span class="token variable">$PASS_KEY</span> replicaof no one</pre></td></tr><tr><td data-num="223"></td><td><pre> <span class="token function">sleep</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="224"></td><td><pre> status</pre></td></tr><tr><td data-num="225"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="226"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] 不支持操作状态 [<span class="token variable">$mode</span>]."</span></pre></td></tr><tr><td data-num="227"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="228"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="229"></td><td><pre></pre></td></tr><tr><td data-num="230"></td><td><pre><span class="token comment"># Change Redis to slave; Use Command: replicaof masterip masterport</span></pre></td></tr><tr><td data-num="231"></td><td><pre><span class="token function-name function">toslave</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="232"></td><td><pre> role</pre></td></tr><tr><td data-num="233"></td><td><pre> <span class="token assign-left variable">mode</span><span class="token operator">=</span><span class="token variable">$?</span></pre></td></tr><tr><td data-num="234"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$mode</span> <span class="token parameter variable">-eq</span> <span class="token string">"1"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="235"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] 已经是[ slave ] 不必要切换 ."</span></pre></td></tr><tr><td data-num="236"></td><td><pre> <span class="token keyword">elif</span> <span class="token punctuation">[</span> <span class="token variable">$mode</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="237"></td><td><pre> <span class="token comment"># 切换配置文件 - 避免下次重启后变化</span></pre></td></tr><tr><td data-num="238"></td><td><pre> <span class="token function">cp</span> <span class="token parameter variable">-f</span> <span class="token variable">$SLAVE_CONF_FILE_PATH</span> <span class="token variable">$CONF_FILE_PATH</span></pre></td></tr><tr><td data-num="239"></td><td><pre> </pre></td></tr><tr><td data-num="240"></td><td><pre> <span class="token assign-left variable">authcmd</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">cat</span> $CONF_FILE_PATH <span class="token operator">|</span> <span class="token function">grep</span> ^masterauth <span class="token operator">|</span> <span class="token function">sed</span> <span class="token string">'s/"//g'</span><span class="token variable">)</span></span></pre></td></tr><tr><td data-num="241"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"设置 master 连接密码. <span class="token variable">$authcmd</span>"</span></pre></td></tr><tr><td data-num="242"></td><td><pre> <span class="token comment"># 执行更新密码</span></pre></td></tr><tr><td data-num="243"></td><td><pre> <span class="token variable">$BIN_PATH</span>/redis-cli <span class="token variable">$PASS_KEY</span> config <span class="token builtin class-name">set</span> <span class="token variable">$authcmd</span></pre></td></tr><tr><td data-num="244"></td><td><pre></pre></td></tr><tr><td data-num="245"></td><td><pre> <span class="token assign-left variable">repcmd</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">cat</span> $CONF_FILE_PATH <span class="token operator">|</span> <span class="token function">grep</span> ^replicaof<span class="token variable">)</span></span></pre></td></tr><tr><td data-num="246"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"准备切换为[ slave ], <span class="token variable">$repcmd</span>"</span></pre></td></tr><tr><td data-num="247"></td><td><pre> <span class="token comment"># 执行切换为 从服务</span></pre></td></tr><tr><td data-num="248"></td><td><pre> <span class="token variable">$BIN_PATH</span>/redis-cli <span class="token variable">$PASS_KEY</span> <span class="token variable">$repcmd</span></pre></td></tr><tr><td data-num="249"></td><td><pre> </pre></td></tr><tr><td data-num="250"></td><td><pre> <span class="token function">sleep</span> <span class="token number">1</span></pre></td></tr><tr><td data-num="251"></td><td><pre> status</pre></td></tr><tr><td data-num="252"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="253"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] 不支持操作状态 [<span class="token variable">$mode</span>]."</span></pre></td></tr><tr><td data-num="254"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="255"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="256"></td><td><pre></pre></td></tr><tr><td data-num="257"></td><td><pre><span class="token comment"># 判断状态</span></pre></td></tr><tr><td data-num="258"></td><td><pre><span class="token function-name function">status</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="259"></td><td><pre> is_running</pre></td></tr><tr><td data-num="260"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="261"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] is running . pid=<span class="token variable">${pid}</span>"</span></pre></td></tr><tr><td data-num="262"></td><td><pre> role</pre></td></tr><tr><td data-num="263"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="264"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"Redis is master role"</span></pre></td></tr><tr><td data-num="265"></td><td><pre> <span class="token keyword">elif</span> <span class="token punctuation">[</span> <span class="token variable">$?</span> <span class="token parameter variable">-eq</span> <span class="token string">"1"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></pre></td></tr><tr><td data-num="266"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"Redis is slave role"</span></pre></td></tr><tr><td data-num="267"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="268"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"Redis is unknow role"</span></pre></td></tr><tr><td data-num="269"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="270"></td><td><pre> <span class="token keyword">else</span> </pre></td></tr><tr><td data-num="271"></td><td><pre> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$APP_NAME</span> - [PORT: <span class="token variable">$APP_PORT</span>] is not running ."</span></pre></td></tr><tr><td data-num="272"></td><td><pre> <span class="token keyword">fi</span></pre></td></tr><tr><td data-num="273"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="274"></td><td><pre></pre></td></tr><tr><td data-num="275"></td><td><pre><span class="token comment"># 根据输入的参数执行对应的方法</span></pre></td></tr><tr><td data-num="276"></td><td><pre><span class="token keyword">case</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token keyword">in</span></pre></td></tr><tr><td data-num="277"></td><td><pre> <span class="token string">"start"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="278"></td><td><pre> start</pre></td></tr><tr><td data-num="279"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="280"></td><td><pre> <span class="token string">"stop"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="281"></td><td><pre> stop</pre></td></tr><tr><td data-num="282"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="283"></td><td><pre> <span class="token string">"running"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="284"></td><td><pre> is_running</pre></td></tr><tr><td data-num="285"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="286"></td><td><pre> <span class="token string">"status"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="287"></td><td><pre> status</pre></td></tr><tr><td data-num="288"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="289"></td><td><pre> <span class="token string">"role"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="290"></td><td><pre> role</pre></td></tr><tr><td data-num="291"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="292"></td><td><pre> <span class="token string">"restart"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="293"></td><td><pre> restart</pre></td></tr><tr><td data-num="294"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="295"></td><td><pre> <span class="token string">"tomaster"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="296"></td><td><pre> tomaster</pre></td></tr><tr><td data-num="297"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="298"></td><td><pre> <span class="token string">"toslave"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="299"></td><td><pre> toslave</pre></td></tr><tr><td data-num="300"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="301"></td><td><pre> <span class="token string">"startmaster"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="302"></td><td><pre> startmaster</pre></td></tr><tr><td data-num="303"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="304"></td><td><pre> <span class="token string">"startslave"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="305"></td><td><pre> startslave</pre></td></tr><tr><td data-num="306"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="307"></td><td><pre> <span class="token string">"startauto"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="308"></td><td><pre> startauto</pre></td></tr><tr><td data-num="309"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="310"></td><td><pre> <span class="token string">"slaveup"</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="311"></td><td><pre> slaveup</pre></td></tr><tr><td data-num="312"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="313"></td><td><pre> *<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="314"></td><td><pre> usage</pre></td></tr><tr><td data-num="315"></td><td><pre> <span class="token punctuation">;</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="316"></td><td><pre><span class="token keyword">esac</span></pre></td></tr></table></figure><h2 id="5-配置开机启动服务"><a class="markdownIt-Anchor" href="#5-配置开机启动服务">#</a> 5、配置开机启动服务</h2><p>在系统服务目录 <code> /usr/lib/systemd/system/</code> 下,创建 <code>redis.service</code> 文件</p><p>内容如下:</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>Unit<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 服务描述</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token assign-left variable">Description</span><span class="token operator">=</span>Redis-Server</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># 在 XX 服务后启动</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token assign-left variable">After</span><span class="token operator">=</span>network.target</pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># 服务运行参数; 注意本节点内命令要用绝对路径</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">[</span>Service<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># 后台运行方式</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token assign-left variable">Type</span><span class="token operator">=</span>forking</pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># 启动命令</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token assign-left variable">ExecStart</span><span class="token operator">=</span>/usr/local/redis/redis.sh start</pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># 是否给服务分配独立的临时空间</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token assign-left variable">PrivateTmp</span><span class="token operator">=</span>true</pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token comment"># 运行级别下服务安装的相关设置, 可设置为多用户,即系统运行级别为 3</span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token punctuation">[</span>Install<span class="token punctuation">]</span></pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token assign-left variable">WantedBy</span><span class="token operator">=</span>multi-user.target</pre></td></tr></table></figure><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>systemctl daemon-reload <span class="token comment"># 重载 systemd</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre>systemctl <span class="token builtin class-name">enable</span> redis.service <span class="token comment"># 设置开机启动</span></pre></td></tr><tr><td data-num="4"></td><td><pre>systemctl disable redis.service <span class="token comment"># 停止开机启动</span></pre></td></tr><tr><td data-num="5"></td><td><pre>systemctl start redis.service <span class="token comment"># 启动服务</span></pre></td></tr><tr><td data-num="6"></td><td><pre>systemctl stop redis.service <span class="token comment"># 停止服务</span></pre></td></tr><tr><td data-num="7"></td><td><pre>systemctl status redis.service <span class="token comment"># 查看服务状态</span></pre></td></tr><tr><td data-num="8"></td><td><pre>systemctl restart redis.service <span class="token comment"># 重启服务</span></pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre>systemctl list-units <span class="token parameter variable">--type</span><span class="token operator">=</span>service <span class="token comment"># 查看所有已启动的服务</span></pre></td></tr></table></figure>]]></content>
<summary type="html"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" cla</summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Redis" scheme="http://xsea.cc/tags/Redis/"/>
</entry>
<entry>
<title>Centos安装Maven私服Nexus3</title>
<link href="http://xsea.cc/2022/05/cd130dc5.html"/>
<id>http://xsea.cc/2022/05/cd130dc5.html</id>
<published>2022-05-06T05:25:30.000Z</published>
<updated>2023-05-25T12:58:48.583Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>记录 Centos 安装 Maven 私服 Nexus3 过程</p></blockquote><span id="more"></span><h1 id="centos-安装-maven私服-nexus3"><a class="markdownIt-Anchor" href="#centos-安装-maven私服-nexus3">#</a> Centos 安装 Maven 私服 Nexus3</h1><ol><li><p>创建 nexus 用户、设置密码</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@aly-nexus local<span class="token punctuation">]</span><span class="token comment"># adduser nexus</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@aly-nexus local<span class="token punctuation">]</span><span class="token comment"># passwd nexus</span></pre></td></tr></table></figure></li><li><p>以 nexus 用户登陆,上传 Nexus 包、解压至用户根目录</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>nexus@aly-nexus ~<span class="token punctuation">]</span>$ <span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> nexus-3.29.2-02-unix.tar.gz</pre></td></tr></table></figure></li><li><p>修改文件描述资源限制</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@aly-nexus local<span class="token punctuation">]</span><span class="token comment"># vim /etc/security/limits.conf</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment">#@student - maxlogins 4</span></pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre>* soft nofile <span class="token number">65536</span></pre></td></tr><tr><td data-num="6"></td><td><pre>* hard nofile <span class="token number">65536</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># End of file</span></pre></td></tr></table></figure></li><li><p>配置开机启动</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@aly-nexus local<span class="token punctuation">]</span><span class="token comment"># vim /etc/rc.local</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment">#!/bin/bash</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># It is highly advisable to create own systemd services or udev rules</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># to run scripts during boot instead of using this file.</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># In contrast to previous versions due to parallel execution during boot</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># this script will NOT be run after all other services.</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token comment"># that this script will be executed during boot.</span></pre></td></tr><tr><td data-num="14"></td><td><pre></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token function">touch</span> /var/lock/subsys/local</pre></td></tr><tr><td data-num="16"></td><td><pre></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token comment"># 以 nexus 用户运行启动 nexus 服务</span></pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token function">su</span> - nexus <span class="token parameter variable">-c</span> <span class="token string">"/home/nexus/nexus-3.29.2-02/bin/nexus start"</span></pre></td></tr></table></figure></li><li><p>以 nexus 用户登陆,手动启动服务</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>nexus@aly-nexus ~<span class="token punctuation">]</span>$ /home/nexus/nexus-3.29.2-02/bin/nexus start</pre></td></tr></table></figure></li></ol><p>启动成功后,访问地址: <span class="exturl" data-url="aHR0cDovL3huLS1pcC1mcjVjODZseDd6OjgwODE=">http:// 服务器 ip:8081</span></p>]]></content>
<summary type="html"><blockquote>
<p>记录 Centos 安装 Maven 私服 Nexus3 过程</p>
</blockquote></summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Centos" scheme="http://xsea.cc/tags/Centos/"/>
<category term="Nexus" scheme="http://xsea.cc/tags/Nexus/"/>
</entry>
<entry>
<title>Centos7.9使用yum安装Nginx</title>
<link href="http://xsea.cc/2022/04/eb7cc45c.html"/>
<id>http://xsea.cc/2022/04/eb7cc45c.html</id>
<published>2022-04-16T04:30:08.000Z</published>
<updated>2023-03-16T15:47:05.619Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="centos79使用yum安装nginx"><a class="markdownIt-Anchor" href="#centos79使用yum安装nginx">#</a> Centos7.9 使用 yum 安装 Nginx</h1><h1 id=""><a class="markdownIt-Anchor" href="#">#</a> </h1><p>在 CentOS 7.9 上使用 yum 安装 Nginx 非常简单。下面是几个简单步骤:</p><h2 id="步骤一更新系统"><a class="markdownIt-Anchor" href="#步骤一更新系统">#</a> 步骤一:更新系统</h2><p>首先,您需要更新系统以获取最新的软件包和安全修复程序。使用以下命令更新系统:</p><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">sudo</span> yum update</pre></td></tr></table></figure><h2 id="步骤二安装-nginx"><a class="markdownIt-Anchor" href="#步骤二安装-nginx">#</a> 步骤二:安装 nginx</h2><p>安装 Nginx 非常简单,只需使用以下命令:</p><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">sudo</span> yum <span class="token function">install</span> nginx</pre></td></tr></table></figure><p>然后开始安装过程,等待几分钟,Nginx 将安装在您的系统上。</p><p></p><h2 id="步骤三启动-nginx-的服务"><a class="markdownIt-Anchor" href="#步骤三启动-nginx-的服务">#</a> 步骤三:启动 nginx 的服务</h2><p>Nginx 安装完毕后,可以使用以下命令启动 Nginx 服务:</p><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">sudo</span> systemctl start nginx</pre></td></tr></table></figure><p>启动命令行后,可以使用以下命令检查 Nginx 服务是否正在运行:</p><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">sudo</span> systemctl status nginx</pre></td></tr></table></figure><h2 id="步骤四配置-nginx"><a class="markdownIt-Anchor" href="#步骤四配置-nginx">#</a> 步骤四:配置 Nginx</h2><p>Nginx 的默认配置文件位于 /etc/nginx/nginx.conf 中。您可以根据需要更改配置文件。在更改配置之后,您需要重新启动 Nginx 服务。使用以下命令重新启动 Nginx 服务:</p><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">sudo</span> systemctl restart nginx</pre></td></tr></table></figure><p>Nginx 安装完毕,您可以尝试使用 Web 服务器上的 IP 地址或域名访问网站。</p><p></p>]]></content>
<summary type="html"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" cla</summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Nginx" scheme="http://xsea.cc/tags/Nginx/"/>
</entry>
<entry>
<title>Maven插件[versions-maven-plugin]</title>
<link href="http://xsea.cc/2022/04/fbbabe1b.html"/>
<id>http://xsea.cc/2022/04/fbbabe1b.html</id>
<published>2022-04-02T14:42:03.000Z</published>
<updated>2023-05-25T12:58:48.584Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>记录下 Maven 插件 [versions-maven-plugin] 的主要作用及使用方法</p></blockquote><span id="more"></span><p><span class="exturl" data-url="aHR0cHM6Ly93d3cubW9qb2hhdXMub3JnL3ZlcnNpb25zL3ZlcnNpb25zLW1hdmVuLXBsdWdpbi9pbmRleC5odG1s">versions-maven-plugin 插件官网</span></p><h2 id="以下为本插件命令清单"><a class="markdownIt-Anchor" href="#以下为本插件命令清单">#</a> 以下为本插件命令清单</h2><p><img data-src="https://static.xhal.net/picgo/uTools_1679495937552.png" alt="goals"></p><h2 id="maven-pomxml配置"><a class="markdownIt-Anchor" href="#maven-pomxml配置">#</a> Maven pom.xml 配置</h2><figure class="highlight xml"><figcaption data-lang="XML"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>plugin</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.codehaus.mojo<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>versions-maven-plugin<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>2.10.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>reportSets</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>reportSet</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>reports</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>report</span><span class="token punctuation">></span></span>dependency-updates-report<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>report</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>report</span><span class="token punctuation">></span></span>plugin-updates-report<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>report</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>report</span><span class="token punctuation">></span></span>property-updates-report<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>report</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>reports</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>reportSet</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>reportSets</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>plugin</span><span class="token punctuation">></span></span></pre></td></tr></table></figure><h2 id="常用命令"><a class="markdownIt-Anchor" href="#常用命令">#</a> 常用命令</h2><h3 id="更新项目版本为指定版本号"><a class="markdownIt-Anchor" href="#更新项目版本为指定版本号">#</a> 更新项目版本,为指定版本号</h3><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre>mvn versions:set <span class="token parameter variable">-DnewVersion</span><span class="token operator">=</span><span class="token number">1.0</span>.1-SNAPSHOT</pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment"># 执行后正常会在 pom.xml 同级目录生成 pom.xml.versionsBackup 文件</span></pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment"># 再使用确认提交命令,会清除 生成的 pom.xml.versionsBackup 文件</span></pre></td></tr><tr><td data-num="6"></td><td><pre>mvn versions:commit</pre></td></tr><tr><td data-num="7"></td><td><pre></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment"># 如果想还原 pom.xml ,则执行以下命令 </span></pre></td></tr><tr><td data-num="9"></td><td><pre>mvn versions:revert</pre></td></tr></table></figure><h3 id="更新依赖jar-为-下一个-releases-版本"><a class="markdownIt-Anchor" href="#更新依赖jar-为-下一个-releases-版本">#</a> 更新依赖 Jar 为 下一个 releases 版本</h3><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre>mvn versions:use-next-releases <span class="token parameter variable">-T1C</span></pre></td></tr></table></figure><h3 id="更新依赖jar-为-最新的-releases-版本"><a class="markdownIt-Anchor" href="#更新依赖jar-为-最新的-releases-版本">#</a> 更新依赖 Jar 为 最新的 releases 版本</h3><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre>mvn versions:use-latest-releases <span class="token parameter variable">-T1C</span></pre></td></tr></table></figure><h3 id="更新下载依赖的-源码包javadoc包"><a class="markdownIt-Anchor" href="#更新下载依赖的-源码包javadoc包">#</a> 更新下载依赖的 源码包 / JavaDoc 包</h3><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre>mvn dependency:sources <span class="token parameter variable">-DdownloadSources</span><span class="token operator">=</span>true <span class="token parameter variable">-DdownloadJavadocs</span><span class="token operator">=</span>true <span class="token parameter variable">-T1C</span></pre></td></tr></table></figure><h3 id="显示可更新版本的-maven-插件"><a class="markdownIt-Anchor" href="#显示可更新版本的-maven-插件">#</a> 显示可更新版本的 maven 插件</h3><figure class="highlight sh"><figcaption data-lang="sh"></figcaption><table><tr><td data-num="1"></td><td><pre>mvn versions:display-plugin-updates <span class="token parameter variable">-T1C</span></pre></td></tr></table></figure><p>PS: 更多使用方法,请访问 <span class="exturl" data-url="aHR0cHM6Ly93d3cubW9qb2hhdXMub3JnL3ZlcnNpb25zL3ZlcnNpb25zLW1hdmVuLXBsdWdpbi91c2FnZS5odG1s">官网使用示例</span></p>]]></content>
<summary type="html"><blockquote>
<p>记录下 Maven 插件 [versions-maven-plugin] 的主要作用及使用方法</p>
</blockquote></summary>
<category term="Maven" scheme="http://xsea.cc/categories/Maven/"/>
<category term="Maven" scheme="http://xsea.cc/tags/Maven/"/>
<category term="插件" scheme="http://xsea.cc/tags/%E6%8F%92%E4%BB%B6/"/>
</entry>
<entry>
<title>Centos安装Tengine</title>
<link href="http://xsea.cc/2022/03/cca36461.html"/>
<id>http://xsea.cc/2022/03/cca36461.html</id>
<published>2022-03-22T15:14:56.000Z</published>
<updated>2023-05-25T12:58:48.583Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="centos-安装-tengine"><a class="markdownIt-Anchor" href="#centos-安装-tengine">#</a> Centos 安装 Tengine</h1><blockquote><p>记录下源码安装 Tengine 过程记录</p></blockquote><ol><li><p>下载及解压包</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment">## 进入 /usr/local/ 目录</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun home<span class="token punctuation">]</span><span class="token comment"># cd /usr/local/</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment">## 下载源码包</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun local<span class="token punctuation">]</span><span class="token comment"># wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment">## 解压</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun local<span class="token punctuation">]</span><span class="token comment"># tar -zxvf tengine-2.3.2.tar.gz</span></pre></td></tr></table></figure></li><li><p>cd 切换到 Tengine 解压目录</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun local<span class="token punctuation">]</span><span class="token comment"># cd tengine-2.3.2/</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun tengine-2.3.2<span class="token punctuation">]</span><span class="token comment">#</span></pre></td></tr></table></figure></li><li><p>配置安装,包含健康检查 check 模块 (默认安装目录 <code> /usr/local/nginx</code> )</p></li></ol><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun tengine-2.3.2<span class="token punctuation">]</span><span class="token comment"># ./configure --add-module=modules/ngx_http_upstream_check_module</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun tengine-2.3.2<span class="token punctuation">]</span><span class="token comment"># make</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun tengine-2.3.2<span class="token punctuation">]</span><span class="token comment"># make install</span></pre></td></tr></table></figure><ol start="4"><li><p>开机启动</p><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">[</span>root@ss-aliyun local<span class="token punctuation">]</span><span class="token comment"># vim /etc/rc.local</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment">#!/bin/bash</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment"># THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment"># It is highly advisable to create own systemd services or udev rules</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment"># to run scripts during boot instead of using this file.</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># In contrast to previous versions due to parallel execution during boot</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token comment"># this script will NOT be run after all other services.</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment">#</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token comment"># Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token comment"># that this script will be executed during boot.</span></pre></td></tr><tr><td data-num="14"></td><td><pre></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token function">touch</span> /var/lock/subsys/local</pre></td></tr><tr><td data-num="16"></td><td><pre></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token comment"># 启动 nginx 服务</span></pre></td></tr><tr><td data-num="18"></td><td><pre>/usr/local/nginx/sbin/nginx</pre></td></tr></table></figure></li><li><p>配置 nginx.conf</p></li></ol><p>PS: 此处删除了 默认 80 端口 静态 html 配置,若需要则在拓展 <code>vhost/</code> 目录下自己添加配置</p><pre><code class="language-config">#user nobody;worker_processes auto;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#error_log "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G";#pid logs/nginx.pid;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; charset utf-8; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; #access_log "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G" main; log_format xformat '$time_local - [$scheme $host] $remote_addr[$request] $status $body_bytes_sent ' '$upstream_addr - $upstream_response_time'; access_log logs/access.log xformat; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; gzip on; include ./vhost/*.conf; #upstream dubbo_backend { # multi 1; # server 127.0.0.1:20880; #} # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:2m; # ssl_session_timeout 4h; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #}}</code></pre>]]></content>
<summary type="html"><link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" cla</summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Nginx" scheme="http://xsea.cc/tags/Nginx/"/>
<category term="Centos" scheme="http://xsea.cc/tags/Centos/"/>
<category term="Tengine" scheme="http://xsea.cc/tags/Tengine/"/>
</entry>
<entry>
<title>Centos使用yum常用命令</title>
<link href="http://xsea.cc/2022/03/29184805.html"/>
<id>http://xsea.cc/2022/03/29184805.html</id>
<published>2022-03-12T14:21:38.000Z</published>
<updated>2023-05-25T12:58:48.583Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>在部署过程中,经常要使用 yum 命令安装些组件; 记录下常用的命令参数</p></blockquote><span id="more"></span><h3 id="清理缓存信息"><a class="markdownIt-Anchor" href="#清理缓存信息">#</a> 清理缓存信息</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum clean all</pre></td></tr></table></figure><h3 id="更新缓存"><a class="markdownIt-Anchor" href="#更新缓存">#</a> 更新缓存</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum makecache</pre></td></tr></table></figure><h3 id="安装包最新版本"><a class="markdownIt-Anchor" href="#安装包最新版本">#</a> 安装包 (最新版本)</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum <span class="token function">install</span> 包名(例如: redis)</pre></td></tr></table></figure><h3 id="安装包指定版本"><a class="markdownIt-Anchor" href="#安装包指定版本">#</a> 安装包 (指定版本)</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum <span class="token function">install</span> 带版本包名(例如: redis-5.1.2.x86_x64)</pre></td></tr></table></figure><h3 id="仅下载不安装"><a class="markdownIt-Anchor" href="#仅下载不安装">#</a> 仅下载(不安装)</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum <span class="token function">install</span> <span class="token parameter variable">--downloadonly</span> 包名(例如: redis)</pre></td></tr></table></figure><blockquote><p>默认情况下,下载的 RPM 包文件存放在以下目录<br> /var/cache/yum/x86_64/[system version]/[repository]/packages</p></blockquote><h3 id="查找指定包"><a class="markdownIt-Anchor" href="#查找指定包">#</a> 查找指定包</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum list<span class="token operator">|</span><span class="token function">grep</span> 包名或关键字(例如: redis)</pre></td></tr></table></figure><h3 id="卸载指定包"><a class="markdownIt-Anchor" href="#卸载指定包">#</a> 卸载指定包</h3><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>yum remove 包名(例如: redis)</pre></td></tr></table></figure><figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">rpm</span> <span class="token parameter variable">-e</span> 包名(例如: redis)</pre></td></tr></table></figure>]]></content>
<summary type="html"><blockquote>
<p>在部署过程中,经常要使用 yum 命令安装些组件; 记录下常用的命令参数</p>
</blockquote></summary>
<category term="运维部署" scheme="http://xsea.cc/categories/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/"/>
<category term="Linux" scheme="http://xsea.cc/tags/Linux/"/>
<category term="Centos" scheme="http://xsea.cc/tags/Centos/"/>
<category term="Yum" scheme="http://xsea.cc/tags/Yum/"/>
</entry>
<entry>
<title>何谓立德、立功、立言(三不朽)</title>
<link href="http://xsea.cc/2022/03/7c550628.html"/>
<id>http://xsea.cc/2022/03/7c550628.html</id>
<published>2022-03-11T14:59:50.000Z</published>
<updated>2023-05-25T12:58:48.585Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>何谓立德、立功、立言(三不朽)</p></blockquote><span id="more"></span><h1 id="立德-立功-立言中国古代文人墨客的三大志向"><a class="markdownIt-Anchor" href="#立德-立功-立言中国古代文人墨客的三大志向">#</a> “立德、立功、立言”:中国古代文人墨客的三大志向</h1><p>中国文化源远流长,代表着中华民族的文化传统和精神内涵。在众多的传统文化中,文人墨客的文化是一种非常独特和重要的精神文化。在这种文化的背景下,“立德、立功、立言” 被称为文人墨客的 “三大志向”,也被称作 “三不朽” 或 “三绝”。</p><p>首先,“立德” 是指一个人要有高尚的道德品质和品行。中国先贤们认为:修身养性,有德者兴,无德者败。在古代,做人首先是要有道德修养,这样才能得到社会的认可和尊重。同时,德行高尚的人往往有良好的人际关系和内在的快乐体验,因此我们也可以从道德修养中找到一种内心的满足和平静。</p><p>其次,“立功” 指的是一个人要有卓越的成就和功绩。中国古代文人墨客认为,做人不能只停留在思想和理论层面,而应该付诸实践行动,创造出实际的成就。只有具有卓越成就和功绩的人才能够被后人所记取和传颂,成就卓越的人才能真正摆脱历史的洪流,立于不败之地。</p><p>最后,“立言” 是指一个人要有深刻的思想和理论成就,能够留下具有普遍意义、经久不衰的言论或著作。这一点显然是文字创作方面的应用,因为文字可以记录一个时代的思想、文化和价值观。留下的文字能够传承和延续文化精神,经过岁月的沉淀,其价值更能得到世人的确认和认同。</p><p>在 “立德、立功、立言” 的旗帜下,中国古代的文人墨客们做出了巨大的贡献。这三个方面被合称为 “三不朽”,意味着一个人只要在其中一个方面成就卓越,就能够成为历史人物,留名后世,永存不朽。这种理念在中国文化传统中一直被强调,也在全球文明史上留下了难以磨灭的印记。在这种精神文化的影响下,中国的文化才得以弥足珍贵,在世界的大舞台上崭露头角。</p><h3 id="引用百度百科释义-三不朽"><a class="markdownIt-Anchor" href="#引用百度百科释义-三不朽">#</a> 引用百度百科释义 <span class="exturl" data-url="aHR0cHM6Ly9iYWlrZS5iYWlkdS5jb20vaXRlbS8lRTQlQjglODklRTQlQjglOEQlRTYlOUMlQkQ=">三不朽</span></h3><blockquote><p><strong>作品出处:</strong>《左传・襄公二十四年》</p><p><strong>创作年代:</strong> 春秋时代</p><p><strong>原文出处:</strong></p><p>二十四年春,穆叔如晋。范宣子逆之,问焉,曰:“古人有言曰:‘死而不朽’,何谓也?” 穆叔未对。</p><p>宣子曰:“昔匄之祖,自虞以上为陶唐氏,在夏为御龙氏,在商为豕韦氏,在周为唐杜氏,晋主夏盟为范氏,其是之谓乎?”</p><p>穆叔曰:“以豹所闻,此之谓世禄,非不朽也。鲁有先大夫曰臧文仲,既没,其言立,其是之谓乎!</p><p>豹闻之,‘太上有立德,其次有立功,其次有立言’,虽久不废,此之谓不朽。若夫保姓受氏,以守宗祊,世不绝祀,无国无之,禄之大者,不可谓不朽。”</p></blockquote>]]></content>
<summary type="html"><blockquote>
<p>何谓立德、立功、立言(三不朽)</p>
</blockquote></summary>
<category term="文学" scheme="http://xsea.cc/categories/%E6%96%87%E5%AD%A6/"/>
<category term="古代" scheme="http://xsea.cc/tags/%E5%8F%A4%E4%BB%A3/"/>
<category term="名言" scheme="http://xsea.cc/tags/%E5%90%8D%E8%A8%80/"/>
</entry>
</feed>