https://blog.jingxiyuan.cn
Hito的公告栏
天下事有难易乎?为之,则难者亦易矣
https://blog.jingxiyuan.cn/images/favicon.ico
Hito li
2022-10-17T06:07:35.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-conf">sysctl net.core.somaxconn=1024(立即生效)
修改/etc/sysctl.conf添加net.core.somaxconn=1024
客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。
可以三种不同客户端的方式进行设置:
normal -> 正常客户端
slave -> slave 和 MONITOR 客户端
pubsub -> 至少订阅了一个 pubsub channel 或 pattern 的客户端
每个 client-output-buffer-limit 语法 :
client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds>
一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。
例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开。如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,
只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。
</code></pre>
<ol start="4">
<li>把硬限制和软限制都设置为 0 来禁用该特性</li>
</ol>
<pre><code class="language-conf">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="redis命令"><a class="anchor" href="#redis命令">#</a> redis 命令</h4>
<pre><code class="language-bash">批量删除key
redis-cli -n 6 scan 0 match *2020-06-12 count 10000 | xargs redis-cli -n 6 del
</code></pre>
2022-10-17T06:07:35.000Z
https://blog.jingxiyuan.cn/2022/10/14/%E5%85%81%E8%AE%B8%E8%B7%A8%E5%9F%9F%E8%8E%B7%E5%8F%96cookies%E6%96%B9%E6%B3%95/
允许跨域获取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 样式账号命令如下:</p>
<pre><code class="language-bash">svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt
</code></pre>
<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 代码到本地新建文件夹中。</p>
<pre><code class="language-bash">git svn clone https://svn_project_url/ --no-metadata --no-minimize-url --authors-file=users.txt
</code></pre>
<p> 期间可能会弹出 svn 的账户密码验证窗口,正确输入即可。</p>
<h4 id="推送项目到git库"><a class="anchor" href="#推送项目到git库">#</a> 推送项目到 git 库</h4>
<p>1、在 gitbash 窗口 cd 到 git 项目文件夹中执行以下命令把 git 仓库地址加入到 remote 中(https://git_project_url/ 为 git 库的 url)。</p>
<pre><code class="language-bash">git remote add origin https://git_project_url/
</code></pre>
<p>2、push 项目到 git 库中。</p>
<pre><code class="language-bash">git push origin master
</code></pre>
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>
<pre><code class="language-shell"> Header always append X-Frame-Options SAMEORIGIN
</code></pre>
<h4 id="nginx配置"><a class="anchor" href="#nginx配置">#</a> Nginx 配置</h4>
<p> 需要添加到 ‘http’, ‘server’ 或者 ‘location’ 的配置项中,个人来讲喜欢配置在‘server’ 中</p>
<p> 正常情况下都是使用 SAMEORIGIN 参数,允许同域嵌套</p>
<pre><code class="language-shell"> add_header X-Frame-Options SAMEORIGIN;
</code></pre>
<p> 允许单个域名 iframe 嵌套</p>
<pre><code class="language-shell"> add_header X-Frame-Options ALLOW-FROM http://xxx.com/;
</code></pre>
<p> 允许多个域名 iframe 嵌套,注意这里是用逗号分隔</p>
<pre><code class="language-shell"> add_header X-Frame-Options "ALLOW-FROM http://xxx.com/,https://xxx.com/";
</code></pre>
<p> 允许任何域名 iframe 嵌套</p>
<pre><code class="language-shell"> add_header X-Frame-Options ALLOWALL;
</code></pre>
<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
https://blog.jingxiyuan.cn/2022/09/21/%E8%AE%B0%E4%B8%80%E6%AC%A1netty-socket-io%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BF%9E%E6%8E%A5%E4%B8%8D%E4%B8%8A%E7%9A%84%E9%97%AE%E9%A2%98/
记一次netty-socketio服务端连接不上的问题
<p> <em>今天前端开发跟我反馈用 vue 的 socketio 连接不上后台服务,连接无反应无任何报错。所以不清楚是前端代码问题还是后台服务的问题。由于框架为另一同事搭建,我只负责处理后端业务逻辑部分,所以第一时间我也不清楚具体的原因。于是我找了个第三方的 socket 工具尝试连接,果然有问题。但是只是提示连接不上,无明显错误原因。到后台查看发现有提示 Unknown transport for request 错误,最后通过调试发现 netty-socketio 的库中 AuthorizeHandler 类有段处理 transport 的代码只能接受大写的 WEBSOCKET 或者 POLLING,于是我在工具中按要求填上结果还是不行。然后我在网上搜索也未发现有相关问题,只发现有网友提示需要用 socketio 的库,不要自己写 socket 连接。于是我找了 socket.io.js 来连接,结果还是一样。经过大量调试改代码,最后突发奇想,有没有可能跟 netty-socketio 的版本有关系,于是我把版本从 1.7.20 升级到 1.7.21,结果就奇迹般的好了。</em></p>
<h6 id="总结就好像大力出奇迹实在找不到原因的时候不妨升级一下版本说不定问题就解决了呢o_o"><a class="anchor" href="#总结就好像大力出奇迹实在找不到原因的时候不妨升级一下版本说不定问题就解决了呢o_o">#</a> 总结:就好像大力出奇迹,实在找不到原因的时候不妨升级一下版本,说不定问题就解决了呢!O (∩_∩) O</h6>
2022-09-21T01:46:00.000Z
https://blog.jingxiyuan.cn/2022/09/17/Hexo-Theme-Shoka-algolia%E6%90%9C%E7%B4%A2%E8%B8%A9%E5%9D%91-1/
Hexo + Theme.Shoka + algolia搜索踩坑
<h1 id="hexo-themeshoka安装"><a class="anchor" href="#hexo-themeshoka安装">#</a> Hexo + Theme.Shoka 安装</h1>
<p> <a href="https://blog.jingxiyuan.cn/2022/09/14/Hexo%E5%AE%89%E8%A3%85%E6%91%B8%E7%B4%A2/">安装介绍</a></p>
<h1 id="algolia注册"><a class="anchor" href="#algolia注册">#</a> algolia 注册</h1>
<ol>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cuYWxnb2xpYS5jb20vdXNlcnMvc2lnbl9pbg==">algolia</span> 不支持国内邮箱注册,而 google 和 github 由于国内被墙也没法使用。所以只能先注册<span class="exturl" data-url="aHR0cHM6Ly9hcHAubmV0bGlmeS5jb20v"> netlify</span> 然后通过 netlify 注册 algolia。</p>
</li>
<li>
<p>登录 algolia 后创建一个 index,名字随意记住既可。</p>
<p><img data-src="https://file.jingxiyuan.cn/images/2022/09/17/2022-09-17-23-32-20.png" alt="2022-09-17-23-32-20.png" /></p>
</li>
<li>
<p>点击右上角红点,弹出窗口点 settings 按钮。</p>
<p><img data-src="https://file.jingxiyuan.cn/images/2022/09/17/2022-09-17-23-35-04.png" alt="2022-09-17-23-35-04.png" /></p>
</li>
<li>
<p>点击 API KEYS,获取 appId 和 adminApiKey 填入 hexo 的_config.yml 中 apiKey 暂时不填。</p>
</li>
</ol>
<pre><code class="language-yml">algolia:
appId: #Your appId
apiKey: #Your apiKey
adminApiKey: #Your adminApiKey
chunkSize: 5000
indexName: blog #"shoka"
fields:
- title #必须配置
- path #必须配置
- categories #推荐配置
- content:strip:truncate,0,2000
- gallery
- photos
- tags
</code></pre>
<ol start="5">
<li>
<p>点击 All Api Keys - New Api key 创建一个 api key,Indices 选先前让记住的 index,ACL 选下面图片中的选项。</p>
<p><img data-src="https://file.jingxiyuan.cn/images/2022/09/17/2022-09-17-23-47-50.png" alt="2022-09-17-23-47-50.png" /></p>
</li>
<li>
<p>把第 5 步中新建的 api key 填入到第 4 步中的配置中,到此已经完成了百分之九十,只需要重新编译发布即可。不过编译步骤多了一步,在 hexo g 后需要再执行 hexo algolia,至此搜索功能就大功告成了。</p>
</li>
</ol>
2022-09-17T15:12:00.000Z
https://blog.jingxiyuan.cn/2022/09/16/chevereto%E5%9B%BE%E5%BA%8A%E5%AE%89%E8%A3%85/
极空间chevereto图床docker版安装
<h1 id="安装准备"><a class="anchor" href="#安装准备">#</a> 安装准备</h1>
<ol>
<li>
<p>需要先安装好 mysql 数据库</p>
</li>
<li>
<p>选择版本,1.5 版以前支持中文,之后被维护的团队删除只支持英文</p>
</li>
<li>
<p>本文介绍使用的是<span class="exturl" data-url="aHR0cHM6Ly9odWIuZG9ja2VyLmNvbS9yL2xpbnV4c2VydmVyL2NoZXZlcmV0bw=="> linuxserver_chevereto</span> 的镜像</p>
</li>
<li>
<p>需要预先创建好给 chevereto 使用的库、账户、密码</p>
</li>
</ol>
<p> * 经过测试,使用<span class="exturl" data-url="aHR0cHM6Ly9odWIuZG9ja2VyLmNvbS9yL3N1cmVua2lkL2NoZXZlcmV0bw=="> surenkid_chevereto</span> 的镜像可以完美支持多国语言,配置同 linuxserver_chevereto 一样<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/12/2022-10-12-13-16-02.png" alt="" /><br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/12/2022-10-12-13-11-10.png" alt="" /><br />
<img data-src="https://file.jingxiyuan.cn/images/2022/10/12/2022-10-12-13-12-49.jpg" alt="" /></p>
<h1 id="容器配置"><a class="anchor" href="#容器配置">#</a> 容器配置</h1>
<ol>
<li>
<p>映射路径(不要放在高速盘,否则会有权限问题)<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/09/16/6150d69d9a170d96e66ca69420f8c4e8.png" alt="6150d69d9a170d96e66ca69420f8c4e8.png" /></p>
</li>
<li>
<p>端口<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/09/16/08eafb3b30a7eb9b0c0be26ea7a1502a.png" alt="08eafb3b30a7eb9b0c0be26ea7a1502a.png" /></p>
</li>
<li>
<p>环境(puid 和 pgid 使用 1000,不要使用 0,否则会报错)<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/09/16/01567ca9f31f87f832276be35cc4554b.png" alt="01567ca9f31f87f832276be35cc4554b.png" /></p>
</li>
</ol>
<h1 id="初始化配置"><a class="anchor" href="#初始化配置">#</a> 初始化配置</h1>
<ol>
<li>
<p>使用 http:// 极空间 ip:81 (端口号使用上面配置的,我配置的是 81) 进行 web 访问(数据库配置)<br />
<img data-src="http://file.jingxiyuan.cn/images/2022/09/15/0.png" alt="0.png" /></p>
</li>
<li>
<p>管理员配置(注意 website 配置选择个人,除非需要提供给其它人注册)<br />
<img data-src="http://file.jingxiyuan.cn/images/2022/09/15/1.png" alt="1.png" /><br />
<img data-src="http://file.jingxiyuan.cn/images/2022/09/15/2.png" alt="2.png" /></p>
</li>
<li>
<p>默认上传大小是 2M,可通过修改 php.ini 配置提升(路径 /etc/php7/php.ini 查找 upload_max_filesize 和 post_max_size 进行修改)。之后用管理员登录通过页面 http://xxx/dashboard/settings/image-upload 修改。</p>
</li>
</ol>
<h1 id="安装完成"><a class="anchor" href="#安装完成">#</a> 安装完成</h1>
<ol>
<li>作为图片管理和链接分享服务完全够用。图片链接 url 支持的也很全面。<br />
<img data-src="https://file.jingxiyuan.cn/images/2022/09/16/2022-09-16-14-52-29.png" alt="2022-09-16-14-52-29.png" /><br />
<img data-src="https://file.jingxiyuan.cn/images/2022/09/16/2022-09-16-14-54-58.png" alt="2022-09-16-14-54-58.png" /><br />
<img data-src="https://file.jingxiyuan.cn/images/2022/09/16/2022-09-16-14-56-13.png" alt="2022-09-16-14-56-13.png" /></li>
</ol>
2022-09-16T00:04:00.000Z
https://blog.jingxiyuan.cn/2022/09/14/Hexo%E5%AE%89%E8%A3%85%E6%91%B8%E7%B4%A2/
Hexo安装摸索
<h1 id="hexo博客安装"><a class="anchor" href="#hexo博客安装">#</a> hexo 博客安装</h1>
<ol>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly9ub2RlanMub3JnL2VuLw==">安装 nodejs</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly9naXQtc2NtLmNvbS8=">安装 git</span></p>
</li>
<li>
<p>安装 hexo(windows 需进入 git bash)</p>
<p><code>npm install -g hexo-cli</code></p>
</li>
<li>
<p>初始化博客目录</p>
<p><code>hexo init blog</code></p>
</li>
<li>
<p>进入博客目录</p>
<p><code>cd blog</code></p>
</li>
<li>
<p>初始化 hexo 到博客目录</p>
<p><code>npm install</code></p>
</li>
</ol>
<h1 id="shoka主题安装"><a class="anchor" href="#shoka主题安装">#</a> shoka 主题安装</h1>
<ol>
<li>
<p>下载主题 </p>
<p><code>git clone </code> <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2FtZWhpbWUvaGV4by10aGVtZS1zaG9rYS5naXQ=">https://github.com/amehime/hexo-theme-shoka.git</span> <code> ./themes/shoka</code></p>
</li>
<li>
<p>卸载 hexo-renderer-marked 以及别的 markdown 文件渲染器 </p>
<p><code>npm un hexo-renderer-marked --save</code></p>
</li>
<li>
<p>安装(md 文件渲染器,压缩 css/js/html)</p>
<p><code>npm i hexo-renderer-multi-markdown-it --save</code></p>
</li>
<li>
<p>安装(给生成的 css 文件们添加浏览器前缀)</p>
<p><code>npm i hexo-autoprefixer --save</code></p>
</li>
<li>
<p>安装(站内搜索功能) </p>
<p><code>npm i hexo-algoliasearch --save</code></p>
</li>
<li>
<p>安装(文章或站点字数及阅读时间统计)</p>
<p><code>npm i hexo-symbols-count-time --save</code></p>
</li>
<li>
<p>安装(生成 Feed 文件)</p>
<p><code>npm i hexo-feed --save</code></p>
</li>
</ol>
<h1 id="hexo部分常用命令"><a class="anchor" href="#hexo部分常用命令">#</a> Hexo 部分常用命令</h1>
<ul>
<li>
<p>清除静态文件</p>
<p><code>hexo clean</code></p>
</li>
<li>
<p>生成静态文件</p>
<p><code>hexo g</code></p>
</li>
<li>
<p>安装 git 推送插件 </p>
<p><code>npm install hexo-deployer-git --save</code></p>
</li>
<li>
<p>推送静态文件到 git </p>
<p><code>hexo d</code></p>
</li>
</ul>
<h1 id="安装hexo-admin编写博客插件"><a class="anchor" href="#安装hexo-admin编写博客插件">#</a> 安装 hexo-admin(编写博客插件)</h1>
<ul>
<li>
<p><code>npm install hexo-admin --save</code></p>
</li>
<li>
<p>hexo-admin 编辑 url</p>
<p><a href="http://localhost:4000/admin"> <code>http://localhost:4000/admin</code> </a></p>
</li>
<li>
<p>settings 设置用户名、密码、Secret</p>
<p><a href="http://localhost:4000/admin/#/settings"> <code>http://localhost:4000/admin/#/settings</code> </a></p>
</li>
<li>
<p>把底部生成的配置拷入 hexo 配合文件中 (_config.yml)</p>
</li>
</ul>
<pre><code class="language-yml">admin:
username: username
password_hash: xxxxxx
secret: 'my super secret phrase' #用单引号包裹
deployCommand: 'hexo_publish.sh' #windows用hexo_publish.bat,linux用hexo_publish.sh
</code></pre>
<h4 id="hexo_publishsh"><a class="anchor" href="#hexo_publishsh">#</a> hexo_publish.sh</h4>
<pre><code class="language-bash">#!/bin/bash
hexo clean
hexo g
hexo d
</code></pre>
<h4 id="hexo_publishbat"><a class="anchor" href="#hexo_publishbat">#</a> hexo_publish.bat</h4>
<pre><code class="language-bash">@echo off
cd D:\blog
d:
@cmd /c "hexo clean&& hexo g&&hexo d&&echo success"
</code></pre>
2022-09-14T04:23:55.000Z
https://blog.jingxiyuan.cn/1970/01/01/hello-world/
Hello World
<p>Welcome to <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvLw==">Hexo</span>! This is your very first post. Check <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3Mv">documentation</span> for more info. If you get any problems when using Hexo, you can find the answer in <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3MvdHJvdWJsZXNob290aW5nLmh0bWw=">troubleshooting</span> or you can ask me on <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2hleG9qcy9oZXhvL2lzc3Vlcw==">GitHub</span>.</p>
<h2 id="quick-start"><a class="anchor" href="#quick-start">#</a> Quick Start</h2>
<h3 id="create-a-new-post"><a class="anchor" href="#create-a-new-post">#</a> Create a new post</h3>
<pre><code class="language-bash">$ hexo new "My New Post"
</code></pre>
<p>More info: <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3Mvd3JpdGluZy5odG1s">Writing</span></p>
<h3 id="run-server"><a class="anchor" href="#run-server">#</a> Run server</h3>
<pre><code class="language-bash">$ hexo server
</code></pre>
<p>More info: <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3Mvc2VydmVyLmh0bWw=">Server</span></p>
<h3 id="generate-static-files"><a class="anchor" href="#generate-static-files">#</a> Generate static files</h3>
<pre><code class="language-bash">$ hexo generate
</code></pre>
<p>More info: <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3MvZ2VuZXJhdGluZy5odG1s">Generating</span></p>
<h3 id="deploy-to-remote-sites"><a class="anchor" href="#deploy-to-remote-sites">#</a> Deploy to remote sites</h3>
<pre><code class="language-bash">$ hexo deploy
</code></pre>
<p>More info: <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3Mvb25lLWNvbW1hbmQtZGVwbG95bWVudC5odG1s">Deployment</span></p>
1970-01-01T00:00:00.000Z