https://blog.jingxiyuan.cn
涛声依旧
天下事有难易乎?为之,则难者亦易矣
https://blog.jingxiyuan.cn/images/favicon.ico
Hito Li
2022-11-02T08:29:00.000Z
https://blog.jingxiyuan.cn/2022/11/02/2-dev-null%E5%92%8C-dev-null-2-1%E5%92%8C2-1-dev-null%E7%9A%84%E5%8C%BA%E5%88%AB/
2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的区别
<h4 id="区别"><a class="anchor" href="#区别">#</a> 区别:</h4>
<pre><code class="language-bash">2>/dev/null
</code></pre>
<p>意思就是把错误输出到 “黑洞”</p>
<pre><code class="language-bash">>/dev/null 2>&1
</code></pre>
<p>默认情况是 1,也就是等同于 1>/dev/null 2>&1。意思就是把标准输出重定向到 “黑洞”,还把错误输出 2 重定向到标准输出 1,也就是标准输出和错误输出都进了 “黑洞”</p>
<pre><code class="language-bash">2>&1 >/dev/null
</code></pre>
<p>意思就是把错误输出 2 重定向到标准出书 1,也就是屏幕,标准输出进了 “黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕</p>
<h4 id="解释"><a class="anchor" href="#解释">#</a> 解释:</h4>
<ol>
<li>
<p>文件描述符<br />
Linux 系统预留三个文件描述符:0、1 和 2,他们的意义如下所示:<br />
0—— 标准输入(stdin)<br />
略...<br />
1—— 标准输出(stdout)<br />
在当前目录下,有且只有一个文件名称为 a.txt 的文件,这时我们运行这个命令【ls a.txt】, 就会获得一个标准输出 stdout 的输出结果:a.txt<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen629761046.jpg" alt="" /><br />
2—— 标准错误(stderr)<br />
在当前目录下,有且只有一个文件名称为 a.txt 的文件,我们运行命令【ls b.txt】,我们就会获得一个标准错误 stderr 的输出结果 “ls:无法访问 b.txt:没有这样的文件或目录”。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen629793578.jpg" alt="" /></p>
</li>
<li>
<p>重定向<br />
重定向的符号有两个:> 或 >>,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。举例如下:</p>
</li>
</ol>
<ul>
<li>
<p>重定向标准输出 stdout<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen630033531.jpg" alt="" /><br />
如上图所示,对比没有添加重定向的操作,这条命令在使用之后并没有将 a.txt 打印到屏幕。在紧接的 cat 操作后,可以发现本来应该被输出的内容被记录到 stdout.txt 中。</p>
</li>
<li>
<p>重定向标准错误 stderr<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen630256640.jpg" alt="" /><br />
如上图所示,文件描述符 2,标准错误的重定向也是同样的原理被记录在了文件 stderr.txt 这个文件里面了。</p>
</li>
<li>
<p>可以将 stderr 单独定向到一个文件,stdout 重定向到另一个文件</p>
</li>
</ul>
<pre><code class="language-bash">ls b.txt 2> stderr.txt 1>stdout.txt
</code></pre>
<ul>
<li>也可以将 stderr 和 stdout 重定向到同一个文件</li>
</ul>
<pre><code class="language-bash">ls b.txt > output.txt 2>&1
</code></pre>
<ul>
<li>或采用下面的方法,可以少写几个字,能达到同样的效果</li>
</ul>
<pre><code class="language-bash">ls b.txt &> output.txt
ls b.txt >& output.txt #两个表达式效果一样的
</code></pre>
<ol start="3">
<li>Linux 特殊文件<br />
/dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null 这个设备通常也被称为位桶(bit bucket)或黑洞。<br />
所以,2>/dev/null 的意思就是将标准错误 stderr 删掉。</li>
</ol>
2022-11-02T08:29:00.000Z
https://blog.jingxiyuan.cn/2022/11/01/360%E7%8B%AC%E7%AB%8B%E7%89%88%E5%B0%8F%E5%B7%A5%E5%85%B7/
360独立版小工具
<h4 id="360独立版小工具"><a class="anchor" href="#360独立版小工具">#</a> 360 独立版小工具</h4>
<p><img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen623936500.jpg" alt="" /><br />
360 全家桶众说纷纭但工具箱还是挺实用的,这波小工具可以单独下载使用,有需要的朋友赶紧下载吧!</p>
<p><span class="exturl" data-url="aHR0cHM6Ly9wYW4uamluZ3hpeXVhbi5jbi8lRTglQkQlQUYlRTQlQkIlQjYvJUU3JUIzJUJCJUU3JUJCJTlGLzM2MCVFNSVCMCU4RiVFNSVCNyVBNSVFNSU4NSVCNw==">下载地址</span></p>
<h4 id="部分工具截图"><a class="anchor" href="#部分工具截图">#</a> 部分工具截图</h4>
<p><img data-src="https://file.jingxiyuan.cn/images/2022/11/01/1a2e50f738d4a8c1.png" alt="" /><br />
<img data-src="https://file.jingxiyuan.cn/images/2022/11/01/21d1ee247aa7c69f.png" alt="" /><br />
<img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen624392843.jpg" alt="" /></p>
2022-11-01T07:20:00.000Z
https://blog.jingxiyuan.cn/2022/10/31/%E4%B8%80%E9%94%AE%E5%85%B3%E9%97%ADWindows10-11%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/
一键关闭Windows10/11系统自动更新
<h4 id="介绍"><a class="anchor" href="#介绍">#</a> 介绍</h4>
<ul>
<li>当你经常需要在家远程到公司进行办公,或者开启了很多临时文件、文档、软件需要等到第二天继续之前的工作时,结果系统自行更新并重启了。是不是会让你非常郁闷。关闭系统自行更新就可以轻松解决此类问题。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/31/afc55608b4c1b512.png" alt="" /></li>
</ul>
<h4 id="下载"><a class="anchor" href="#下载">#</a> 下载</h4>
<p><span class="exturl" data-url="aHR0cHM6Ly9tZXRhLmJveC5sZW5vdm8uY29tL2xpbmsvdmlldy8yNjdjOGU3Mzc5MTY0OWJmYmNlMmVkODQ0NGMxNjBjNg==">win10</span> / <span class="exturl" data-url="aHR0cHM6Ly9tZXRhLmJveC5sZW5vdm8uY29tL3YvbGluay92aWV3LzQwZGIwNTQ1ZThmNDQ4ZDc5OTBkZDE2YjU5NDgzNjhh">win11</span> / <span class="exturl" data-url="aHR0cHM6Ly9wYW4uamluZ3hpeXVhbi5jbi8lRTglQkQlQUYlRTQlQkIlQjYvJUU3JUIzJUJCJUU3JUJCJTlGL1dpbmRvd3MlRTglODclQUElRTUlOEElQTglRTYlOUIlQjQlRTYlOTYlQjA=">本地</span></p>
2022-10-31T07:30:00.000Z
https://blog.jingxiyuan.cn/2022/10/27/%E6%9E%81%E7%A9%BA%E9%97%B4web%E7%AB%AFhttps%E7%9B%B4%E8%BF%9Enginx%E9%85%8D%E7%BD%AE/
极空间web端https直连nginx配置
<h4 id="介绍"><a class="anchor" href="#介绍">#</a> 介绍</h4>
<ul>
<li>ip 直连一般都映射了 5055, 但是直接访问 5055 极空间只提供了 http 协议,如果希望使用 https 协议则必须使用其它端口进行访问。以下方案采用 nginx 反向代理实现,端口使用 10000 举例。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/27/2022-10-27-14-39-25.jpg" alt="" /></li>
</ul>
<h4 id="配置"><a class="anchor" href="#配置">#</a> 配置</h4>
<ol>
<li>需要先把 10000 端口在路由器上做好映射。</li>
<li>证书生成好并放置到 nginx 上。(证书生成方法不做介绍请自行百度)</li>
<li>http 跳转 https 配置</li>
</ol>
<pre><code class="language-conf">server {
if ($scheme = http) {
rewrite ^(.*)$ https://$host$1 permanent;
}
}
</code></pre>
<ol start="4">
<li>web 端口监听配置</li>
</ol>
<pre><code class="language-conf">#极空间-web
server {
listen 10000 ssl http2; #ipv4
listen [::]:10000 ssl http2; #ipv6
server_name xxx.xxx.com; #填写自己的域名,主域名或者子域名
#include /etc/nginx/conf.d/ssl/ssl_common.conf;
ssl_certificate_key /etc/nginx/conf.d/ssl/xxx.key; #加密证书
ssl_certificate /etc/nginx/conf.d/ssl/xxx.pem; #加密证书
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
#开启OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
client_max_body_size 128M;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
proxy_send_timeout 180s; #设置发送超时时间
proxy_read_timeout 180s; #设置读取超时时间
# Prevent Information leaks
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
proxy_hide_header X-AspNetMvc-Version;
proxy_hide_header X-AspNet-Version;
# http security headers
add_header X-Content-Type-Options nosniff;
add_header Pragma no-cache;
add_header Cache-Control no-store;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy origin-when-cross-origin;
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Frame-Options SAMEORIGIN; #允许同域嵌套
# Add Security cookie flags
proxy_cookie_path ~(.*) "$1; SameSite=strict; secure; httponly";
# Path to the root of your installation
location / {
proxy_intercept_errors on;
proxy_max_temp_file_size 0;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://极空间内网ip:5055; #这里设置你自己要跳转的局域网应用;
proxy_redirect http://域名:5055/home https://域名:10000/home; #极空间在登陆后会跳转到http协议的5055端口,所以要在此替换为https协议的10000端口
}
error_page 500 502 503 504 /500.html;
error_page 400 404 /500.html;
location = /500.html {
root /usr/share/nginx/html/; #错误html
}
}
</code></pre>
<h4 id="问题"><a class="anchor" href="#问题">#</a> 问题</h4>
<ul>
<li>需要开启允许嵌套否则登陆后所有应用都是拒绝访问</li>
<li>需要配置 proxy_redirect 替换响应 url,否则会跳转到默认 http 协议的 5055 端口</li>
<li>如果配置 proxy_redirect 后无效可能需要清除浏览器缓存(F12 - 网络 - 右键点击 url 区域 - 清除浏览器缓存)</li>
</ul>
2022-10-27T05:34:00.000Z
https://blog.jingxiyuan.cn/2022/10/22/%E6%9E%81%E7%A9%BA%E9%97%B4Docker%E7%89%88%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/
极空间Docker版青龙面板安装与配置
<h4 id="介绍"><a class="anchor" href="#介绍">#</a> 介绍</h4>
<ul>
<li>青龙面板是一个支持 python3、javascript、shell、typescript 的定时任务管理面板。它支持在线管理脚本、环境变量、配置文件,支持在线查看日志及支持多种方式的消息通知。</li>
</ul>
<h4 id="安装"><a class="anchor" href="#安装">#</a> 安装</h4>
<ul>
<li>本文使用的是<span class="exturl" data-url="aHR0cHM6Ly9odWIuZG9ja2VyLmNvbS9yL3doeW91ci9xaW5nbG9uZw=="> whyour/qinglong</span> 的镜像。</li>
<li>路径映射(由于青龙面板有 nodejs 环境,所以我把 hexo 博客的编译也放置在上面,再把 nginx 的 html 映射过来,这样就可以直接编译发布了。)<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/24/2022-10-24-19-29-06.jpg" alt="" /></li>
</ul>
<pre><code class="language-conf">#青龙面板装载路径
/ql/data
#博客装载路径(如果你不部署hexo博客可以不用配置)
/root/.ssh #ssh证书文件(如果你不用把hexo推送到git上可以不用配置)
/blog #hexo博客编译目录
/blog/nginx_blog #nginx上放置博客的目录(例如:/Docker/nginx/html/blog)
</code></pre>
<ul>
<li>端口<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/22/2022-10-22-11-02-195ea093b249c53244.jpg" alt="" /><br />
<code>4000端口是hexo-admin使用的,如果你不用可以不配置</code></li>
<li>环境<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/22/2022-10-22-11-02-19a0822966d88a012e.jpg" alt="" /></li>
<li>登录<br />
地址:<span class="exturl" data-url="aHR0cDovL3huLS1JUC1odThkeTcwZTRtNWE6NTcwMA==">http:// 极空间 IP:5700</span><br />
默认账号:admin<br />
默认密码:admin</li>
</ul>
<h4 id="配置"><a class="anchor" href="#配置">#</a> 配置</h4>
<ul>
<li>我主要用青龙面板跑京东的脚本,所以也只介绍相关的配置方法</li>
<li>定时任务 (我使用的是 KingRan/KR 的集合库,以下是拉取命令)<br />
<code>ql repo https://github.com/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp|wskey" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"</code></li>
<li>定时规则(我是每 3 小时拉取一次,不要拉取太频繁否则可能被封)<br />
<code>0 */3 * * *</code></li>
<li>环境变量</li>
</ul>
<pre><code class="language-conf">名称:JD_COOKIE
值:web京东登陆后按F12在网络tab页中的请求内查找cookie,然后复制pt_key=到pt_pin=等
</code></pre>
<ul>
<li>配置文件 (主要修改和添加以下配置)</li>
</ul>
<pre><code class="language-conf">repo命令拉取脚本时需要拉取的文件后缀,直接写文件后缀名即可
RepoFileExtensions="js py ts"
钉钉(消息推送)
export DD_BOT_TOKEN=
export DD_BOT_SECRET=
##开卡
export guaopencard_All="true"
export guaopencard_addSku_All="true"
export guaopencardRun_All="true"
export guaopencard_draw="true"
export JD_TRY="true"
export exjxbeans="true"
export DY_OPENALL="true"
#抽奖
export opencard_draw=3
#开启脚本依赖文件缺失修复
export ec_fix_dep="true"
#开启脚本依赖文件更新
export ec_re_dep="true"
#清空购物车
export JD_CART_REMOVE="true"
export JD_CART="true"
#去掉多余的双十一红包脚本
export FLCODE=''
#加购物车抽奖
export RUN_CAR=true
#停用小额免密支付
export JD_PAY_CONTRACT=true
</code></pre>
<ul>
<li>依赖管理</li>
</ul>
<pre><code class="language-conf">#nodejs依赖
crypto-js
prettytable
dotenv
jsdom
date-fns
tough-cookie
tslib
ws@7.4.3
ts-md5
jsdom -g
jieba
fs
form-data
json5
global-agent
png-js
@types/node
require
typescript
js-base64
axios
#pythone依赖
requests
canvas
ping3
jieba
aiohttp
PyExecJS
#Linux依赖
bizCode
bizMsg
lxml
</code></pre>
<h4 id="其它"><a class="anchor" href="#其它">#</a> 其它</h4>
<pre><code class="language-bash">#配置国内源
pip config --global set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip config --global set install.trusted-host https://mirrors.aliyun.com
#升级pip
pip install --upgrade pip
#更新青龙
ql update
#已知要安装的依赖(不安装部分脚本任务会失败)
pnpm install ds
#一键安装所有依赖(基于Faker一键脚本安装的青龙
可通过执行/ql/data/scripts下的QLDependency.sh脚本安装,如脚本已经更新则通过下面命令执行
curl -fsSL https://git.metauniverse-cn.com/https://raw.githubusercontent.com/shufflewzc/QLDependency/main/Shell/QLOneKeyDependency.sh | sh
#一般出现这种错误:(缺依赖)
Error: Cannot find module 'xx'
执行pnpm install xxx
#一般出现这种错误:(缺文件)
Error: Cannot find module './xx'
那就是拉库命令不完整,请检查或复制完整的拉库命
#Python3依赖安装失败修复(基于Faker一键脚本安装的青龙)
curl -sS https://bootstrap.pypa.io/get-pip.py | python3
</code></pre>
2022-10-22T02:44:00.000Z
https://blog.jingxiyuan.cn/2022/10/21/Hexo-Theme-Shoka-Valine%E8%AF%84%E8%AE%BA%E9%85%8D%E7%BD%AE/
Hexo + Theme.Shoka + Valine评论配置
<ul>
<li>valine 评论需要 LeanCloud 支持</li>
</ul>
<h4 id="leancloud注册"><a class="anchor" href="#leancloud注册">#</a> LeanCloud 注册</h4>
<ol>
<li>到<span class="exturl" data-url="aHR0cHM6Ly93d3cubGVhbmNsb3VkLmNu"> LeanCloud</span> 网站完成注册。</li>
<li>创建应用。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-32.jpg" alt="" /></li>
<li>名称随便取,方案看自己选择。开发版免费但是有限制,商业版收费无限制。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-32516c410640de936a.jpg" alt="" /></li>
<li>点击配置按钮进行配置。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-32267554cf6f62d3eb.jpg" alt="" /></li>
<li>点击设置 - 应用凭证可获取 App ID 和 App Key<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-328c330a6fdd48d2c3.jpg" alt="" /></li>
<li>点击设置 - 安全中心根据自己的需求配置<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-32204f14d87e95b59e.jpg" alt="" /></li>
</ol>
<h4 id="修改themeshoka配置"><a class="anchor" href="#修改themeshoka配置">#</a> 修改 Theme.Shoka 配置</h4>
<pre><code class="language-yml">valine:
appId: 粘贴5中获取的App ID #Your_appId
appKey: 粘贴5中获取的App Key #Your_appkey
placeholder: ヽ(○´∀`)ノ♪欢迎畅所欲言 # Comment box placeholder
avatar: mp #默认头像设置 Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro
pageSize: 10 # Pagination size
lang: zh-CN
visitor: true # Article reading statistic 这个要设置为false,以免与 leancloud_visitors 突冲
NoRecordIP: false # Whether to record the commenter IP
serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)
powerMode: true
tagMeta:
visitor: 新朋友
master: 博主
friend: 小伙伴
investor: 金主粑粑
tagColor:
master: "var(--color-orange)"
friend: "var(--color-aqua)"
investor: "var(--color-pink)"
tagMember:
master:
# - hash of master@email.com
# - hash of master2@email.com
friend:
# - hash of friend@email.com
# - hash of friend2@email.com
investor:
# - hash of investor1@email.com
</code></pre>
2022-10-21T03:48:00.000Z
https://blog.jingxiyuan.cn/2022/10/21/%E6%9E%81%E7%A9%BA%E9%97%B4Docker%E7%89%88mariadb%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/
极空间Docker版mariadb安装与配置
<h4 id="介绍"><a class="anchor" href="#介绍">#</a> 介绍</h4>
<ul>
<li>mariadb 属于 mysql 的一个分支,完全兼容 mysql,使用方式和 mysql 无区别。</li>
</ul>
<h4 id="安装"><a class="anchor" href="#安装">#</a> 安装</h4>
<ul>
<li>本文介绍安装的镜像为 linuxserver_mariadb 的 10.5.13-r0-ls45,原则上使用最新版即可</li>
<li>配置文件映射<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-09-20-56.jpg" alt="" /></li>
<li>端口<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-09-21-49.jpg" alt="" /></li>
<li>环境(MYSQL_ROOT_PASSWORD 为数据库 root 用户密码)<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-09-22-43.jpg" alt="" /></li>
<li>到此已经可以在内网使用了,连接方法同 mysql 一致</li>
</ul>
<h4 id="配置"><a class="anchor" href="#配置">#</a> 配置</h4>
<ul>
<li>此处配置为 nginx 反向代理,配置完成后可在外网连接访问</li>
</ul>
<pre><code class="language-conf">stream {
#极空间-docker-mariadb
upstream mariadb {
hash $remote_addr consistent;
server mariadb的ip:端口;
}
server {
listen 监听端口;
proxy_connect_timeout 30s;
proxy_timeout 300s;
proxy_pass mariadb;
}
}
</code></pre>
2022-10-21T01:06:00.000Z
https://blog.jingxiyuan.cn/2022/10/20/%E6%9E%81%E7%A9%BA%E9%97%B4Docker%E7%89%88Wordpress%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/
极空间Docker版Wordpress安装与配置
<h4 id="安装"><a class="anchor" href="#安装">#</a> 安装</h4>
<ul>
<li>下载最新版 wordpress 镜像,如极空间无法下载,可到<span class="exturl" data-url="aHR0cHM6Ly9wdWxsaW1hZ2UucGFzc2VybWEuY29tLw=="> passerma 网站</span>下载。</li>
<li>需要先在 mysql 中创建给 wordpress 使用的库。</li>
<li>文件路径映射(目前极空间不能映射到高速盘,否则无法启动)。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/20/2022-10-20-08-58-31.png" alt="" /></li>
<li>端口映射。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/20/2022-10-20-08-58-56.png" alt="" /></li>
<li>通过映射的端口访问安装界面(一定要通过最终访问的页面进行安装,否则修改配置比较麻烦。如最终是域名访问,就先把域名解析代理等先配置好,再通过域名访问安装)。</li>
</ul>
<h4 id="配置"><a class="anchor" href="#配置">#</a> 配置</h4>
<ul>
<li>如需使用 https 访问,需要在 wp-config.php 中加入以下代码,否则资源文件无法访问。</li>
</ul>
<pre><code class="language-php">if((!empty( $_SERVER['HTTP_X_FORWARDED_HOST'])) || (!empty( $_SERVER['HTTP_X_FORWARDED_FOR'])) ) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
$_SERVER['HTTPS'] = 'on';
}
</code></pre>
<ul>
<li>后台安装插件时如果跳转到 ftp 配置,则需要在 wp-config.php 中加入以下代码,并到 wp-content 目录下创建 tmp 目录,最后还需要给 tmp 目录赋予读写权限。</li>
</ul>
<pre><code class="language-php">define('WP_TEMP_DIR', ABSPATH.'wp-content/tmp');
define('FS_METHOD', 'direct');
define('FS_CHMOD_DIR', 0777);
define('FS_CHMOD_FILE', 0777);
</code></pre>
<ul>
<li>目录和文件所有者、组会自动变为 root,目前我是通过访问页面时通过命令修正。暂时未发现问题,如果不行则只能通过定时任务来定时修正了。需要在 wp-config.php 中加入以下代码。</li>
</ul>
<pre><code class="language-php">chown('/var/www/html', 'www-data');
chgrp('/var/www/html', 'www-data');
chmod('/var/www/html/wp-content/plugins', 0777);
chmod('/var/www/html/wp-content/themes', 0777);
chmod('/var/www/html/wp-content/tmp', 0777);
</code></pre>
<ul>
<li>隐藏后台访问需要在 wp-login.php 中加入以下代码,key、value 和 https://www.xxx.com/ 需要修改为自己的。修改后只能通过 https://www.xxx.com/wp-login.php?key=value 访问,其它访问需要登录的页面都会跳转到配置的 https://www.xxx.com/ 地址。</li>
</ul>
<pre><code class="language-php">if($_GET['key'] != 'value') {
header('Location: https://www.xxx.com/');
}
</code></pre>
2022-10-20T00:56:00.000Z
https://blog.jingxiyuan.cn/2022/10/19/%E9%95%BF%E4%BA%86%E4%B8%80%E5%B2%81/
又长了一岁
<p>一年一次的总结时间又到了,这一年前半年平平无奇,后半年惊涛骇浪。中年危机如期而遇,人身的低谷终究还是来了。很沮丧也很无助,但还是要坚强面对。人生起起伏伏,时好时坏,终归还是会好起来的。加油!加油!加油<br />
!</p>
2022-10-19T00:51:00.000Z
https://blog.jingxiyuan.cn/2022/10/18/%E6%90%AD%E5%BB%BAnagios%E7%9B%91%E6%8E%A7/
搭建nagios监控
<h4 id="监控端服务安装与配置"><a class="anchor" href="#监控端服务安装与配置">#</a> 监控端服务安装与配置</h4>
<ol>
<li>nagios 需要安装主程序 core 和 nrpe(nagios 和各被监控主机都必须安装)。如需使用自研前端可通过安装 ndoutils (用于把 nagios 监控信息写入数据库) 和 mysql 实现。具体安装见<span class="exturl" data-url="aHR0cHM6Ly9zdXBwb3J0Lm5hZ2lvcy5jb20va2Iv">官网</span></li>
<li>nagios 默认监控命令脚本放置在 libexec 中,自定义脚本也放到此处</li>
<li>etc/objects/commands.cfg 用于保存 nagios 默认监控命令</li>
<li>etc/nrpe.cfg 文件中需要添加用于被监控执行命令项(各被监控主机中都需要添加)<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/18/image.png" alt="" /></li>
<li>etc/objects/hosts 目录下配置需要被监控的主机信息<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/18/image2.png" alt="" /></li>
<li>etc/objects/servers 目录下配置需要在被监控主机上执行的监控命令(第 4 项中的命令)<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/18/image3.png" alt="" /></li>
</ol>
<h4 id="被监控端服务安装与配置"><a class="anchor" href="#被监控端服务安装与配置">#</a> 被监控端服务安装与配置</h4>
<ol>
<li>被监控端需要安装 nrpe</li>
<li>被监控端需要把监控端的命令写入到 nrpe 的配置文件中</li>
<li>被监控端需要把命令执行脚本放入 libexec 目录中</li>
<li>被监控端自动安装脚本(可借鉴)</li>
</ol>
<pre><code class="language-bash">1、请先修改脚本中的服务端IP。
2、如被监控端不支持let计算命令请执行sudo dpkg-reconfigure dash命令,弹出选择窗口后选择no。
3、需要在脚本同目录下创建CentOS、Ubuntu、sh和conf目录,目录下分别放置nrpe的tar安装包、监控脚本和nrpe配置文件。
#!/bin/bash
#服务端ip
SERVER_IP=10.10.10.121
#安装目录
INSTALL_HOME=`pwd`
#安装ubuntu版本
INSTALL_UBUNTU()
{
sudo apt-get update
sudo apt-get install -y autoconf automake gcc libc6 libmcrypt-dev make libssl-dev wget openssl
cd /tmp
#wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-4.0.3.tar.gz
cp $INSTALL_HOME/Ubuntu/nrpe.tar.gz ./
tar xzf nrpe.tar.gz
cd /tmp/nrpe-nrpe-4.0.3/
sudo ./configure --enable-command-args --with-ssl-lib=/usr/lib/x86_64-linux-gnu/
sudo make all
sudo make install-groups-users
sudo make install
sudo make install-config
sudo sh -c "echo >> /etc/services"
sudo sh -c "sudo echo '# Nagios services' >> /etc/services"
sudo sh -c "sudo echo 'nrpe 5666/tcp' >> /etc/services"
#判断系统是高版本还是低版本
VERSION=`lsb_release -r --short`
IS_LOW_VERSION=`echo "$VERSION < 15" | bc`
if [ $IS_LOW_VERSION = 1 ]; then
#低版本
sudo make install-init
else
#高版本
sudo make install-init
sudo systemctl enable nrpe.service
fi
sudo mkdir -p /etc/ufw/applications.d
sudo sh -c "echo '[NRPE]' > /etc/ufw/applications.d/nagios"
sudo sh -c "echo 'title=Nagios Remote Plugin Executor' >> /etc/ufw/applications.d/nagios"
sudo sh -c "echo 'description=Allows remote execution of Nagios plugins' >> /etc/ufw/applications.d/nagios"
sudo sh -c "echo 'ports=5666/tcp' >> /etc/ufw/applications.d/nagios"
sudo ufw allow NRPE
sudo ufw reload
sudo sh -c "sed -i '/^allowed_hosts=/s/$/,$SERVER_IP/' /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "sed -i 's/^dont_blame_nrpe=.*/dont_blame_nrpe=1/g' /usr/local/nagios/etc/nrpe.cfg"
cd $INSTALL_HOME
sudo cp ./sh/* /usr/local/nagios/libexec/
sudo chmod +xr /usr/local/nagios/libexec/*
sudo sh -c "echo 'command[check_ping]=/usr/local/nagios/libexec/check_ping -H 127.0.0.1 -w 3000.0,80% -c 5000.0,100% -p 5' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_cpu]=/usr/local/nagios/libexec/check_cpu.sh' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_mem]=/usr/local/nagios/libexec/check_mem.sh' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_disk]=/usr/local/nagios/libexec/check_disk.sh' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_my_service]=/usr/local/nagios/libexec/check_my_service.sh \$ARG1\$' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_system_info]=/usr/local/nagios/libexec/check_system_info.sh' >> /usr/local/nagios/etc/nrpe.cfg"
NETWORK_INDEX=1
for NETWORK_NAME in `cat /proc/net/dev | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'`;do
if [ $NETWORK_NAME != 'lo' ]; then
sudo sh -c "echo 'command[check_network$NETWORK_INDEX]=/usr/local/nagios/libexec/check_network.sh $NETWORK_NAME' >> /usr/local/nagios/etc/nrpe.cfg"
NETWORK_INDEX=`expr $NETWORK_INDEX + 1 `
fi
done
if [ $IS_LOW_VERSION = 1 ]; then
#低版本
sudo start nrpe
else
#高版本
sudo systemctl start nrpe.service
fi
}
#安装centos版本
INSTALL_CENTOS()
{
yum install -y gcc glibc glibc-common openssl openssl-devel perl wget
cd /tmp
#wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-4.0.3.tar.gz
cp $INSTALL_HOME/CentOS/nrpe.tar.gz ./
tar xzf nrpe.tar.gz
cd /tmp/nrpe-nrpe-4.0.3/
./configure --enable-command-args
make all
make install-groups-users
make install
make install-config
echo >> /etc/services
echo '# Nagios services' >> /etc/services
echo 'nrpe 5666/tcp' >> /etc/services
#判断系统是高版本还是低版本
VERSION=`rpm -q centos-release|cut -d- -f3`
#安装bc命令
yum -y install bc
IS_LOW_VERSION=`echo "$VERSION < 7" | bc`
if [ $IS_LOW_VERSION = 1 ]; then
#低版本
make install-init
iptables -I INPUT -p tcp --destination-port 5666 -j ACCEPT
service iptables save
ip6tables -I INPUT -p tcp --destination-port 5666 -j ACCEPT
service ip6tables save
else
#高版本
make install-init
systemctl enable nrpe.service
firewall-cmd --zone=public --add-port=5666/tcp
firewall-cmd --zone=public --add-port=5666/tcp --permanent
fi
sudo sh -c "sed -i '/^allowed_hosts=/s/$/,$SERVER_IP/' /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "sed -i 's/^dont_blame_nrpe=.*/dont_blame_nrpe=1/g' /usr/local/nagios/etc/nrpe.cfg"
cd $INSTALL_HOME
sudo cp ./sh/* /usr/local/nagios/libexec/
sudo chmod +xr /usr/local/nagios/libexec/*
sudo sh -c "echo 'command[check_ping]=/usr/local/nagios/libexec/check_ping -H 127.0.0.1 -w 3000.0,80% -c 5000.0,100% -p 5' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_cpu]=/usr/local/nagios/libexec/check_cpu.sh' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_mem]=/usr/local/nagios/libexec/check_mem.sh' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_disk]=/usr/local/nagios/libexec/check_disk.sh' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_my_service]=/usr/local/nagios/libexec/check_my_service.sh \$ARG1\$' >> /usr/local/nagios/etc/nrpe.cfg"
sudo sh -c "echo 'command[check_system_info]=/usr/local/nagios/libexec/check_system_info.sh' >> /usr/local/nagios/etc/nrpe.cfg"
NETWORK_INDEX=1
for NETWORK_NAME in `cat /proc/net/dev | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'`;do
if [ $NETWORK_NAME != 'lo' ]; then
sudo sh -c "echo 'command[check_network$NETWORK_INDEX]=/usr/local/nagios/libexec/check_network.sh $NETWORK_NAME' >> /usr/local/nagios/etc/nrpe.cfg"
NETWORK_INDEX=`expr $NETWORK_INDEX + 1 `
fi
done
if [ $IS_LOW_VERSION = 1 ]; then
#低版本
if [ $(echo "$VERSION < 6" | bc) -eq 1 ]; then
service nrpe start
else
start nrpe
fi
else
#高版本
systemctl start nrpe.service
fi
}
#安装其它版本
INSTALL_OTHER()
{
echo "Not supported at the moment."
}
#根据不同系统安装不同版本
INSTALL()
{
if grep -Eqii "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
DISTRO='CentOS'
PM='yum'
INSTALL_CENTOS
elif grep -Eqi "Red Hat Enterprise Linux Server" /etc/issue || grep -Eq "Red Hat Enterprise Linux Server" /etc/*-release; then
DISTRO='RHEL'
PM='yum'
INSTALL_OTHER
elif grep -Eqi "Aliyun" /etc/issue || grep -Eq "Aliyun" /etc/*-release; then
DISTRO='Aliyun'
PM='yum'
INSTALL_OTHER
elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
DISTRO='Fedora'
PM='yum'
INSTALL_OTHER
elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
DISTRO='Debian'
PM='apt'
INSTALL_OTHER
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
DISTRO='Ubuntu'
PM='apt'
INSTALL_UBUNTU
elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then
DISTRO='Raspbian'
PM='apt'
INSTALL_OTHER
else
echo "unknow linux."
exit 1
fi
echo $DISTRO
}
INSTALL
exit 0
</code></pre>
<h4 id="登录"><a class="anchor" href="#登录">#</a> 登录</h4>
<p>地址:<span class="exturl" data-url="aHR0cDovL3huLS1JUC1mcjVjODZseDd6L25hZ2lvcw==">http:// 服务器 IP/nagios</span><br />
用户名:nagiosadmin<br />
密码:nagiosadmin</p>
<h4 id="常见问题"><a class="anchor" href="#常见问题">#</a> 常见问题</h4>
<ol>
<li>监控日志未写入 mysql(可能是 ndoutils 服务不正常导致)。采用以下脚本命令解决</li>
</ol>
<pre><code class="language-bash">#!/bin/bash
sudo rm -f /usr/local/nagios/var/ndo2db.pid
sudo rm -f /usr/local/nagios/var/ndo.sock
sudo systemctl restart ndo2db.service
sudo systemctl status ndo2db.service
</code></pre>
2022-10-18T01:39:00.000Z
https://blog.jingxiyuan.cn/2022/10/17/redis%E4%B8%BB%E4%BB%8E%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95/
redis主从基础配置
<h4 id="主服务"><a class="anchor" href="#主服务">#</a> 主服务</h4>
<ol>
<li>基础配置</li>
</ol>
<pre><code class="language-conf">port 6379
requirepass 123456(密码,建议不设置)
vm-enabled no (虚拟内存,内存够的情况下可以不使用)
maxmemory 1GB(告诉Redis当使用了多少物理内存后就开始拒绝后续的写入)
bind 127.0.0.1 (注释掉,否则不能外部连接)
rdbchecksum no(持久化数据检查)
list-max-ziplist-size 1024(ziplist的最大容量,正数为自己指定的大小。负数-1到-5为对应的值4到64Kb)
list-compress-depth 20(quicklist的两端多少个node不压缩,0为全部不压缩)
</code></pre>
<pre><code class="language-bash">sysctl vm.overcommit_memory=1 (立即生效)
修改/etc/sysctl.conf添加vm.overcommit_memory=1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何。Redis的RDB持久化实现是folk一个子进程,然后让子进程将内存镜像dump到RDB文件中。理论上来说是需要跟父进程一样的内存空间,但是由于linux很早就支持的copy-on-write技术,所以实际上并不需要这么多的物理内存的。)
</code></pre>
<ol start="2">
<li>禁用透明大页(影响性能)</li>
</ol>
<pre><code class="language-bash">需要sudo su 切换到root身份(sudo 没用)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
修改/etc/init.d/redis-server,加入/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled
</code></pre>
<ol start="3">
<li>修复 TCP 警告</li>
</ol>
<pre><code class="language-bash">sysctl net.core.somaxconn=1024(立即生效)
修改/etc/sysctl.conf添加net.core.somaxconn=1024
</code></pre>
<ol start="4">
<li>客户端缓冲区限制</li>
</ol>
<pre><code class="language-conf">客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。
可以三种不同客户端的方式进行设置:
normal -> 正常客户端
slave -> slave 和 MONITOR 客户端
pubsub -> 至少订阅了一个 pubsub channel 或 pattern 的客户端
语法 :
client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds>
一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。
例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开。如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,
只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。
把硬限制和软限制都设置为 0 来禁用该特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 5gb 512mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
</code></pre>
<ol start="5">
<li>持久化配置</li>
</ol>
<pre><code class="language-conf">---关闭RDB持久化---
save ""
默认配置如下:
save 900 1 #900秒内有1次更新就持久化
save 300 10 #300秒内有10次更新就持久化
save 60 10000 #60秒内有10000次更新就持久化
---关闭RDB持久化---
主从同步支持两种策略,即disk和socket方式。
新的slave端和重连的salve端不允许去继续同步进程,这被称之为“完全同步”。
一个RDB文件从master端传到slave端,分为两种情况:
1、支持disk:master端将RDB file写到disk,稍后再传送到slave端;
2、无磁盘diskless:master端直接将RDB file传到slave socket,不需要与disk进行交互。无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境。
repl-diskless-sync no 默认不使用diskless同步方式
repl-diskless-sync-delay 30 无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒
repl-ping-slave-period 60 slave端向server端发送pings的时间区间设置,默认为10秒
repl-timeout 3600 设置超时时间
repl-disable-tcp-nodelay no 是否启用TCP_NODELAY,如果启用则会使用少量的TCP包和带宽去进行数据传输到slave端,当然速度会比较慢;如果不启用则传输速度比较快,但是会占用比较多的带宽。
repl-backlog-size 1mb 设置backlog的大小,backlog是一个缓冲区,在slave端失连时存放要同步到slave的数据,因此当一个slave要重连时,经常是不需要完全同步的,执行局部同步就足够了。
backlog设置的越大,slave可以失连的时间就越长。
repl-backlog-ttl 3600 如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。
slave-priority 100 slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。
min-slaves-to-write 3
min-slaves-max-lag 10 设置当一个master端的可用slave少于N个,延迟时间大于M秒时,不接收写操作。
</code></pre>
<h4 id="从服务"><a class="anchor" href="#从服务">#</a> 从服务</h4>
<pre><code class="language-conf">基本配置同主服务一致
slaveof 127.0.0.1 6379(主redis的ip和端口)
masterauth 123456 (主redis的密码)
可以通过slaveof no one命令将Slaver升级为Maste
bgsave (持久化命令,在redis-cli中执行,默认创建dump.rdb文件,路径为 /var/lib/redis/dump.rdb。可通过find / -name dump.rd查找)
</code></pre>
<h4 id="相关命令"><a class="anchor" href="#相关命令">#</a> 相关命令</h4>
<pre><code class="language-bash">看状态
sudo /etc/init.d/redis-server status
看端口
netstat -nlt|grep 6379
外部连接
sudo vim /etc/redis/redis.conf把protected-mode改为no,把bind ip注释掉
重启
sudo server redis-server restart
查看内存
free -m
批量删除指定key
redis-cli -n 6 scan 0 match *2020-06-12 count 10000| xargs redis-cli -n 6 del
大量删除key后快速释放被占用的内存
memory purge
</code></pre>
<h4 id="问题解决"><a class="anchor" href="#问题解决">#</a> 问题解决</h4>
<pre><code class="language-bash">写入问题
redis-cli config set stop-writes-on-bgsave-error no
sudo vim /etc/redis/redis.conf把stop-writes-on-bgsave-error改为no
修改系统 sudo vim /etc/sysctl.conf加入vm.overcommit_memory=1
sudo sysctl vm.overcommit_memory=1
</code></pre>
2022-10-17T06:07:00.000Z
https://blog.jingxiyuan.cn/2022/10/14/nginx%E5%85%81%E8%AE%B8%E8%B7%A8%E5%9F%9F%E8%8E%B7%E5%8F%96cookies%E6%96%B9%E6%B3%95/
nginx允许跨域获取cookie的方法
<h4 id="使用场景"><a class="anchor" href="#使用场景">#</a> 使用场景</h4>
<p> 在 A 域名的页面向 B 域名提交数据时需要代入 B 域名的 cookie,否则 B 域名会跳转到登陆页面。解决方式需要使用到 nginx 反向代理,配置如下:</p>
<pre><code class="language-conf">server {
listen port ssl http2;
server_name xxx.com;
ssl_certificate_key /xxx.key;
ssl_certificate /xxx.pem;
proxy_cookie_path ~(.*) "$1; SameSite=None; secure; httponly";
location / {
#允许镶套的方式(可以同域镶套、指定域名镶套或者所有域名镶套)
add_header X-Frame-Options ALLOWALL; #允许被所有域名镶套
proxy_pass http://xxx;
}
}
</code></pre>
2022-10-14T09:13:00.000Z
https://blog.jingxiyuan.cn/2022/10/12/%E4%BD%BF%E7%94%A8picgo%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E5%88%B0chevereto/
使用PicGo上传图片到chevereto
<h1 id="简介"><a class="anchor" href="#简介">#</a> 简介</h1>
<p>PicGo 是一款开源的图床管理工具,十分流行。</p>
<p>PicGo 官方指南:<span class="exturl" data-url="aHR0cHM6Ly9waWNnby5naXRodWIuaW8vUGljR28tRG9jL3poL2d1aWRlLw==">PicGo | PicGo</span></p>
<h1 id="配置"><a class="anchor" href="#配置">#</a> 配置</h1>
<ol>
<li>
<p>安装插件(需要先安装 NodeJS)<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/12/2022-10-12-13-24-09.png" alt="" /></p>
</li>
<li>
<p>图床配置 <br />
url 后缀必须用红线圈中的部分,key 在 chevereto 登陆后 api 配置中查找<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/12/2022-10-12-13-24-51.png" alt="" /></p>
</li>
</ol>
2022-10-12T06:40:00.000Z
https://blog.jingxiyuan.cn/2022/10/11/svn%E5%BA%93%E8%BD%ACgit%E5%BA%93/
svn库转git库
<h4 id="前期准备"><a class="anchor" href="#前期准备">#</a> 前期准备</h4>
<p> 首先安装好 svn 和 git 工具。</p>
<h4 id="svn转git"><a class="anchor" href="#svn转git">#</a> svn 转 git</h4>
<p>1、 到 svn 项目目录右键选中 gitbash 打开窗口,执行获取用户并映射成 git 样式账号命令如下:<br />
<code>svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt</code></p>
<p> 然后会在目录下生成文件 users.txt 样式如:zhansan = 张三 <span class="exturl" data-url="bWFpbHRvOnpoYW5zYW5AeHh4LmNvbQ==">zhansan@xxx.com</span>。</p>
<p>2、新建个文件夹,将生成的 users.txt 放入新建的文件夹,然后在新建的文件夹中右键选中 gitbash 弹出窗口后执行下面命令(https://svn_project_url/ 为 svn 库的 url),拉取 svn 代码到本地新建文件夹中。<br />
<code>git svn clone https://svn_project_url/ --no-metadata --no-minimize-url --authors-file=users.txt</code></p>
<ul>
<li>期间可能会弹出 svn 的账户密码验证窗口,正确输入即可。</li>
</ul>
<h4 id="推送项目到git库"><a class="anchor" href="#推送项目到git库">#</a> 推送项目到 git 库</h4>
<p>1、在 gitbash 窗口 cd 到 git 项目文件夹中执行以下命令把 git 仓库地址加入到 remote 中(https://git_project_url/ 为 git 库的 url)。<br />
<code>git remote add origin https://git_project_url/</code></p>
<p>2、push 项目到 git 库中。<br />
<code>git push origin master</code></p>
2022-10-11T02:40:00.000Z
https://blog.jingxiyuan.cn/2022/10/06/Nginx%E9%85%8D%E7%BD%AEiframe%E8%AE%BF%E9%97%AE/
Nginx配置iframe访问
<h4 id="x-frame-options响应头配置详解"><a class="anchor" href="#x-frame-options响应头配置详解">#</a> X-Frame-Options 响应头配置详解</h4>
<p> X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在,或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。<br />
X-Frame-Options 三个参数:</p>
<p>1、 DENY</p>
<p> 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。</p>
<p>2、SAMEORIGIN</p>
<p> 表示该页面可以在相同域名页面的 frame 中展示。</p>
<p>3、ALLOW-FROM uri</p>
<p> 表示该页面可以在指定来源的 frame 中展示。</p>
<p>4、ALLOWALL</p>
<p> 表示该页面可以在任何来源的 frame 中展示。</p>
<p> 换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。正常情况下我们通常使用 SAMEORIGIN 参数。</p>
<h4 id="apache配置"><a class="anchor" href="#apache配置">#</a> Apache 配置</h4>
<p> 需要把下面这行添加到'site' 的配置中</p>
<p> <code>Header always append X-Frame-Options SAMEORIGIN</code></p>
<h4 id="nginx配置"><a class="anchor" href="#nginx配置">#</a> Nginx 配置</h4>
<p> 需要添加到 ‘http’, ‘server’ 或者 ‘location’ 的配置项中,个人来讲喜欢配置在‘server’ 中</p>
<p> 正常情况下都是使用 SAMEORIGIN 参数,允许同域嵌套<br />
<code>add_header X-Frame-Options SAMEORIGIN;</code></p>
<p> 允许单个域名 iframe 嵌套<br />
<code>add_header X-Frame-Options ALLOW-FROM http://xxx.com/;</code></p>
<p> 允许多个域名 iframe 嵌套,注意这里是用逗号分隔<br />
<code>add_header X-Frame-Options "ALLOW-FROM http://xxx.com/,https://xxx.com/";</code></p>
<p> 允许任何域名 iframe 嵌套<br />
<code>add_header X-Frame-Options ALLOWALL;</code></p>
<h4 id="tomcat配置"><a class="anchor" href="#tomcat配置">#</a> Tomcat 配置</h4>
<p> 在‘conf/web.xml’填加以下配置</p>
<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>filter</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>filter-name</span><span class="token punctuation">></span></span>httpHeaderSecurity<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>filter-name</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>filter-class</span><span class="token punctuation">></span></span>org.apache.catalina.filters.HttpHeaderSecurityFilter<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>filter-class</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>init-param</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>param-name</span><span class="token punctuation">></span></span>antiClickJackingOption<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>param-name</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>param-value</span><span class="token punctuation">></span></span>SAMEORIGIN<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>param-value</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>init-param</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>async-supported</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>async-supported</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>filter</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>filter-mapping</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>filter-name</span><span class="token punctuation">></span></span>httpHeaderSecurity<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>filter-name</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>url-pattern</span><span class="token punctuation">></span></span>/*<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url-pattern</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>dispatcher</span><span class="token punctuation">></span></span>REQUEST<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dispatcher</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>dispatcher</span><span class="token punctuation">></span></span>FORWARD<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dispatcher</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>filter-mapping</span><span class="token punctuation">></span></span></pre></td></tr></table></figure><h4 id="iis配置"><a class="anchor" href="#iis配置">#</a> IIS 配置</h4>
<p> 添加下面的配置到 ‘Web.config’文件中</p>
<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>system.webServer</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>httpProtocol</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>customHeaders</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>add</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>X-Frame-Options<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>SAMEORIGIN<span class="token punctuation">"</span></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>customHeaders</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>httpProtocol</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>system.webServer</span><span class="token punctuation">></span></span></pre></td></tr></table></figure>
2022-10-06T15:46:00.000Z
https://blog.jingxiyuan.cn/2022/09/28/%E6%B7%B1%E6%B7%B1%E7%9A%84%E6%8C%AB%E8%B4%A5%E5%92%8C%E6%97%A0%E5%8A%A9%E6%84%9F/
深深的挫败和无助感
<p> 一个月都过去了,工作还没有着落!</p>
2022-09-28T08:02:00.000Z
https://blog.jingxiyuan.cn/2022/09/27/nginx%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E9%85%8D%E7%BD%AE/
nginx负载均衡配置
<h2 id="nginx负载均衡配置"><a class="anchor" href="#nginx负载均衡配置">#</a> nginx 负载均衡配置</h2>
<ol>
<li>轮询(默认)</li>
</ol>
<p> <em>每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。</em></p>
<pre><code class="language-yum">upstream my_server {
server 192.168.0.2:8080;
server 192.168.0.3:8080;
}
server {
listen 80;
server_name 192.168.0.1;
# Path to the root of your installation
location / {
proxy_pass http://my_server;
}
}
</code></pre>
<ol start="2">
<li>weight 权重策略</li>
</ol>
<p> <em>weight 代表权重,默认为 1,权重越高被分配的客户端越多,指定轮询几率。weight 和访问比率成正比,用于后端服务器性能不均的情况。</em></p>
<pre><code class="language-yum">upstream my_server {
server 192.168.0.2:8080 weight=1;
server 192.168.0.3:8080 weight=2;
}
server {
listen 80;
server_name 192.168.0.1;
# Path to the root of your installation
location / {
proxy_pass http://my_server;
}
}
</code></pre>
<ol start="3">
<li>ip_hash</li>
</ol>
<p> <em>每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。</em></p>
<pre><code class="language-yum">upstream my_server {
ip_hash;
server 192.168.0.2:8080;
server 192.168.0.3:8080;
}
server {
listen 80;
server_name 192.168.0.1;
# Path to the root of your installation
location / {
proxy_pass http://my_server;
}
}
</code></pre>
<ol start="4">
<li>fair (第三方)</li>
</ol>
<p> <em>按后端服务器的响应时间来分配请求,响应时间短的优先分配。</em></p>
<pre><code class="language-yum">upstream my_server {
server 192.168.0.2:8080;
server 192.168.0.3:8080;
fair;
}
server {
listen 80;
server_name 192.168.0.1;
# Path to the root of your installation
location / {
proxy_pass http://my_server;
}
}
</code></pre>
<ol start="5">
<li>动静分离</li>
</ol>
<p> <em>把静态的资源,比如图片,css,js 等先加载到 Nginx 的服务器里。</em></p>
2022-09-27T06:45:00.000Z
https://blog.jingxiyuan.cn/2022/09/26/%E8%A7%A3%E5%86%B3Hexo-Shoka%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90%E6%97%A0%E6%B3%95%E6%92%AD%E6%94%BE%E7%9A%84%E9%97%AE%E9%A2%98/
解决Hexo+Shoka背景音乐无法播放的问题
<p><em> 今天突然发现博客的音乐无法播放了。经过一顿查找,发现是因为 https://api.i-meto.com/meting/api 调用出错了。shoka 主题应该是通过这个网站提取音乐地址、图片等信息。通过断点发现网易播放列表还是能正常获取的,只是列表中的具体音乐、图片无法获取了。于是自己用获取的列表信息组装出正确的 url 问题基本解决。只针对网易播放列表,图片只能使用一张固定的。</em></p>
<p><em> 解决方法如下:</em></p>
<p><em> 到 themes\shoka\source\js_app 目录下打开 player.js 文件,在最底部 init (config) 下加入 vendorJs ('fancybox');,然后找到 56 行用下面的代码替换即可。</em></p>
<figure class="highlight js"><figcaption data-lang="JavaScript"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function-variable function">fetch</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">source</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">var</span> list <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</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 keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="5"></td><td><pre> source<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">raw</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 keyword">var</span> meta <span class="token operator">=</span> utils<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>raw<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">if</span><span class="token punctuation">(</span>meta<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></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">var</span> skey <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>meta<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token keyword">var</span> playlist <span class="token operator">=</span> store<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>skey<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">if</span><span class="token punctuation">(</span>playlist<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token comment">// 自己修改 - start</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token keyword">var</span> audioInfos <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>playlist<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token keyword">var</span> neteaseStartUrl <span class="token operator">=</span> <span class="token string">"https://music.163.com/song/media/outer/url?id="</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>meta<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"netease"</span> <span class="token operator">&&</span> audioInfos <span class="token operator">&&</span> audioInfos<span class="token punctuation">.</span>length<span class="token operator">></span><span class="token number">0</span> <span class="token operator">&&</span> <span class="token operator">!</span>audioInfos<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>url<span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span>neteaseStartUrl<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">// 如果是网易音乐就自己构建 url</span></pre></td></tr><tr><td data-num="15"></td><td><pre> jQuery<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token literal-property property">url</span><span class="token operator">:</span> audioInfos<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>url<span class="token punctuation">,</span></pre></td></tr><tr><td data-num="17"></td><td><pre> <span class="token literal-property property">type</span><span class="token operator">:</span> <span class="token string">'get'</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="18"></td><td><pre> <span class="token literal-property property">async</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="19"></td><td><pre> <span class="token literal-property property">timeout</span><span class="token operator">:</span> <span class="token number">5000</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="20"></td><td><pre> <span class="token function-variable function">complete</span> <span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">XMLHttpRequest<span class="token punctuation">,</span> status</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="21"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>XMLHttpRequest<span class="token punctuation">.</span>status <span class="token operator">!=</span> <span class="token number">200</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="22"></td><td><pre> audioInfos<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">audioInfo</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="23"></td><td><pre> <span class="token keyword">var</span> id <span class="token operator">=</span> audioInfo<span class="token punctuation">.</span>url<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span>audioInfo<span class="token punctuation">.</span>url<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">"id="</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">3</span><span class="token punctuation">,</span> audioInfo<span class="token punctuation">.</span>url<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">"&auth="</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="24"></td><td><pre> audioInfo<span class="token punctuation">.</span>url <span class="token operator">=</span> neteaseStartUrl <span class="token operator">+</span> id<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="25"></td><td><pre> audioInfo<span class="token punctuation">.</span>pic <span class="token operator">=</span> <span class="token string">"https://p3.music.126.net/Vji3PQJAZ2C7gS_6X51NFQ==/109951164723650033.jpg?param=200y200"</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="26"></td><td><pre> <span class="token punctuation">}</span><span class="token punctuation">)</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> list<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span>list<span class="token punctuation">,</span> audioInfos<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="29"></td><td><pre> <span class="token function">resolve</span><span class="token punctuation">(</span>list<span class="token punctuation">)</span><span class="token punctuation">;</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> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="32"></td><td><pre> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="33"></td><td><pre> list<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span>list<span class="token punctuation">,</span> audioInfos<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="34"></td><td><pre> <span class="token function">resolve</span><span class="token punctuation">(</span>list<span class="token punctuation">)</span><span class="token punctuation">;</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 comment">// 自己修改 - end</span></pre></td></tr><tr><td data-num="37"></td><td><pre> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="38"></td><td><pre> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token string">'https://api.i-meto.com/meting/api?server='</span><span class="token operator">+</span>meta<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">+</span><span class="token string">'&type='</span><span class="token operator">+</span>meta<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">+</span><span class="token string">'&id='</span><span class="token operator">+</span>meta<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token operator">+</span><span class="token string">'&r='</span><span class="token operator">+</span> Math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="39"></td><td><pre> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">response</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="40"></td><td><pre> <span class="token keyword">return</span> response<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="41"></td><td><pre> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">json</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="42"></td><td><pre> store<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>skey<span class="token punctuation">,</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>json<span class="token punctuation">)</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="43"></td><td><pre> list<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span>list<span class="token punctuation">,</span> json<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="44"></td><td><pre> <span class="token function">resolve</span><span class="token punctuation">(</span>list<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="45"></td><td><pre> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">catch</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">ex</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="46"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="47"></td><td><pre> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="48"></td><td><pre> list<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>raw<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="49"></td><td><pre> <span class="token function">resolve</span><span class="token punctuation">(</span>list<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="50"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="51"></td><td><pre> <span class="token punctuation">}</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="52"></td><td><pre> <span class="token punctuation">}</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="53"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr></table></figure>
2022-09-26T11:30:00.000Z
https://blog.jingxiyuan.cn/2022/09/23/%E8%A7%A3%E5%86%B3%E5%9F%9F%E5%90%8Dip%E5%8F%98%E5%8A%A8%E5%90%8E%E9%9C%80%E8%A6%81%E9%87%8D%E5%90%AFnginx%E7%9A%84%E9%97%AE%E9%A2%98/
解决域名ip变动后需要重启nginx的问题
<p> <em>今天突然发现自己的网站不能访问了。经过一顿排查,发现是家里的外网 ip 变动后 nginx 解析的域名 ip 还是旧 ip 导致的。手动重启 nginx 后恢复正常。但这不是长久之计,如果每次 ip 变动都需要重启一次 nginx,想想都头大。于是查询资料后获得了解决办法,方法如下:</em></p>
<pre><code class="language-yum">location / {
resolver 114.114.114.114 valid=60s; #自定义缓存有效时间间隔对变量中的域名进行解析
set $my_server "https://ip:port";
proxy_pass $my_server;
}
</code></pre>
2022-09-23T08:17:00.000Z
https://blog.jingxiyuan.cn/2022/09/22/protobuf%E7%94%9F%E6%88%90js%E6%96%87%E4%BB%B6/
protobuf生成js文件
<h1 id="下载工具"><a class="anchor" href="#下载工具">#</a> 下载工具</h1>
<p><span class="exturl" data-url="aHR0cHM6Ly92ZXJzYXdlYi5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9wcm90b2NvbC1idWZmZXJzLm1pcnJvci92My4xOS41L3Byb3RvYy0zLjE5LjUtd2luNjQuemlw">protoc-3.19.5-win64.zip</span></p>
<h1 id="生成js文件"><a class="anchor" href="#生成js文件">#</a> 生成 js 文件</h1>
<ol>
<li>
<p>把 xxx.proto 文件拷贝到解压的 protoc-3.19.5-win64\bin 目录下</p>
</li>
<li>
<p>cmd 到相同的 bin 目录下</p>
</li>
<li>
<p>执行 protoc.exe --js_out=import_style=commonjs,binary:. ./xxx.proto 命令,就会在 bin 目录下生成 xxx_pb.js 文件</p>
</li>
</ol>
2022-09-22T02:30:00.000Z