https://blog.jingxiyuan.cn
Hito的公告栏
天下事有难易乎?为之,则难者亦易矣
https://blog.jingxiyuan.cn/images/favicon.ico
Hito li
2022-10-22T02:44: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/22/2022-10-22-11-02-19.jpg" alt="" /></li>
</ul>
<pre><code class="language-conf">#青龙面板装载路径
/ql/data/ninja
/ql/data/db
/ql/data/deps
/ql/data/config
/ql/data/repo
/ql/data/raw
/ql/data/jbot
/ql/data/scripts
/ql/data/log
#博客装载路径(如果你不部署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>
</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 需要安装主程序和 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>
<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
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/
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/%E6%9E%81%E7%A9%BA%E9%97%B4chevereto%E5%9B%BE%E5%BA%8Adocker%E7%89%88%E5%AE%89%E8%A3%85/
极空间chevereto图床docker版安装
<h1 id="安装准备"><a class="anchor" href="#安装准备">#</a> 安装准备</h1>
<ol>
<li>
<p>需要先安装好 mysql 数据库</p>
</li>
<li>
<p><s>选择版本,1.5 版以前支持中文,之后被维护的团队删除只支持英文</s></p>
</li>
<li>
<p><s>本文介绍使用的是<span class="exturl" data-url="aHR0cHM6Ly9odWIuZG9ja2VyLmNvbS9yL2xpbnV4c2VydmVyL2NoZXZlcmV0bw=="> linuxserver_chevereto</span> 的镜像</s></p>
</li>
<li>
<p>需要预先创建好给 chevereto 使用的库、账户、密码</p>
</li>
</ol>
<ul>
<li>经过测试,使用<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="" /></li>
</ul>
<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 修改。<br />
<code>upload_max_filesize = 256M</code> <br />
<code>post_max_size = 256M</code> <br />
<code>max_execution_time = 300</code> <br />
<code>max_input_time = 300</code> <br />
<code>memory_limit = 1024M</code></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:00.000Z