分类 服务器 下的文章

Proxmox VE(PVE)的Web管理界面默认使用HTTPS 8006端口,有点强迫症的我就想将它改成标准的 443 端口。传统方案需修改PVE配置,但每次PVE升级后都会失效。本文通过Linux内核级工具IPVS实现流量转发,无需改动PVE系统本身,系统升级后也对其没有影响。

IPVS技术简介

IPVS(IP Virtual Server)是Linux内核内置的传输层负载均衡器,常用于构建高性能服务器集群。

操作步骤

1. 安装 ipvs 管理工具

sudo apt update 
sudo apt install -y ipvsadm

2. 配置端口转发规则

10.0.0.9 替换成你 pve 的 IP
ipvsadm -A -t 10.0.0.9:443 -s rr
ipvsadm -a -t 10.0.0.9:443 -r 10.0.0.9:8006 -m
ipvsadm -A -t 10.0.0.9:80 -s rr
ipvsadm -a -t 10.0.0.9:80 -r 10.0.0.9:8006 -m

3. 查看规则

ipvsadm -Ln
# 预期输出
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.9:80 rr
  -> 10.0.0.9:8006                Masq    1      0          0         
TCP  10.0.0.9:443 rr
  -> 10.0.0.9:8006                Masq    1      0          0  

RocketMQ

  1. 关于事务,RocketMQ会定时(1分钟)回查生产者发送的事务消息,如果是 prepared 状态则会向 Producer 发起 CheckTransaction 请求,根据返回结果来决定是回滚还是继续执行
  2. 消费超时会一直重试

RabbitMQ

  1. 消息发送到交换机,然后根据消息的 routing_key 和交换机类型,自动发送到相应的 队列
  2. 若交换机没有相关联的队列,或关联的队列不存在,则消息会 被抛弃
  3. 所谓的几种类型的交换机,其实只是交换机查找对应队列的方式:

    • Direct: 直连,将消息发送到 路由键 同名的队列上(不能指定交换机名称) -- 只全等判断路由键,不关心 绑定 关系(一对一)
    • Fanout: 扇形,将消息发送到 与当前交换机有绑定关系 的队列上 -- 只判断 绑定 关系,不关心 路由键(一对多)
    • Topic: 主题,将消息发送到 消息的 路由键 与 队列绑定的 路由键 相匹配的队列上 -- 在 绑定 关系基础上再匹配 路由键 (多对多)

最近打算使用Git来管理源码,因此安装了Gogs作为管理系统,装好后发现无法使用SSH方式。经排查发现是SSH无法免密码登陆,按免密码登陆流程设置好以后,发现 ssh git@git.domain.com 无法免密码,而 ssh root@git.domain.com却是可以的

按照网上说的,把 /home/git/home/git/.ssh/home/git/.ssh/authorized_keys都重新设置了一遍权限,但问题依然存在

/etc/ssh/sshd_config里的日志级别改为debug后,查看日志文件:/var/log/secure 发现还是提示/home/git/.ssh/authorized_keys的权限不足:

Mar 17 10:32:02 web12 sshd[18767]: debug1: trying public key file /home/git/.ssh/authorized_keys
Mar 17 10:32:02 web12 sshd[18767]: debug1: Could not open authorized keys '/home/git/.ssh/authorized_keys': Permission denied

后来,网上看到一篇类似问题的文章里有提到日志/var/log/audit/audit.log
于是在里面看到:

type=AVC msg=audit(1489721077.234:763): avc:  denied  { search } for  pid=20284 comm="sshd" name="/" dev=sdb1 ino=2 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=dir
type=SYSCALL msg=audit(1489721077.234:763): arch=c000003e syscall=2 success=no exit=-13 a0=7fd8fb6d75e0 a1=800 a2=1 a3=4000 items=0 ppid=20059 pid=20284 auid=0 uid=0 gid=0 euid=501 suid=0 fsuid=501 egid=501 sgid=0 fsgid=501 tty=(none) ses=11 comm="sshd" exe="/usr/sbin/sshd" subj=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(1489721077.234:764): avc:  denied  { search } for  pid=20284 comm="sshd" name="/" dev=sdb1 ino=2 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=dir

结合文章的问题,突然想到,我的服务器的/home目录也是外挂的另一个硬盘,那问题也就是出在 /home目录的context上了

然后运行:

restorecon -r -vv /home/

完成后,SSH免密登陆成功

  1. 使用 ssh-keygen 生成密钥,默认参数就行,执行后会在 ~/.ssh/ 目录下生成两个文件:id_rsaid_rsa.pub
  2. 手工将 id_rsa.pub 的内容添加到要登陆到的 目标 服务器的 ~/.ssh/authorized_keys 文件。或使用以下方法自动复制(192.168.1.2为目标机器):

    ssh-copy-id root@192.168.1.2
  3. 使用 ssh root@192.168.1.2 登陆目录服务器
  4. 登陆后会在本机的 ~/.ssh/ 目录下生成 known_hosts 文件,删除此文件的对应行后,再次登陆会重新确认是否免密

多私钥管理

  1. 启动 ssh-agent:

    #注意反引号
    eval `ssh-agent`
  2. 添加私钥:

    ssh-add ~/.ssh/aliyun #私钥文件

github SSH 登陆

将上面 id_rsa.pub 的内容复制到 Settings/SSH and GPG keys 就行

提示

如果希望ssh公钥生效, 目标服务器 需满足至少下面两个条件:

  1. ~/.ssh 目录的权限必须是700
  2. ~/.ssh/authorized_keys 文件权限必须是600

网上流传的配置方法包含以下几点:

1、http.conf文件,去掉下面两行的注释

    #AddType text/html .shtml
    #AddOutputFilter INCLUDES .shtml

2、虚拟服务器配置里Options选项添加Includes

Options +Includes -Indexs

重启Apache就OK了。


但今天我在本地按照该方法配置成功后,在服务器上却一直配置不成功,后来想到是不是相关模块没有开启呢?经测试果然如此:

还有最重要的一步,开启include_module

LoadModule include_module modules/mod_include.so

开启该模块后再重启apache才真正的OK了