CentOS7 编译MariaDB的问题

浪费了一下午时间得到的经验:

Centos7 直接编译Mariadb 10.4 及其以下的版本没有任何问题,但是当你在centos 7 上编译mariadb 10.5及其以上的版本时,

会告诉你cmake 版本太低(centos 7 的cmake 应该时2.8.18), 需要cmake 3.0.0 以上

两个解决办法,一是用安装epel,然后升级到cmake 3;另外一种办法就是切换到debian 11

确实,还是切换到debian 11吧, centos 7 的实在太老了

Zabbix Agent的安装和使用

最近需要在服务器集群上监控服务器们的CPU和RAM的使用情况,zabbix 主服务器在US, agent 安装在监控的服务器上.

总的来说其实很简单,主要就是两个步骤:

  1. 安装zabbix agent 组件并且设置好conf文件
  2. 防火墙打开10050端口或者直接whitelist zabbix主服务器的IP

 

下面是详细的步骤:

1 安装组件

4.4 for centos and debian

Centos 7: 

rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm

yum install zabbix-agent

Centos 8:

rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/8/x86_64/zabbix-release-4.4-1.el8.noarch.rpm

yum install zabbix-agent

Debian 9:

# wget https://repo.zabbix.com/zabbix/4.4/debian/pool/main/z/zabbix-release/zabbix-release_4.4-1+stretch_all.deb
# dpkg -i zabbix-release_4.4-1+stretch_all.deb
# apt update

#apt install zabbix-agent

Debian 10:

# wget https://repo.zabbix.com/zabbix/4.4/debian/pool/main/z/zabbix-release/zabbix-release_4.4-1+buster_all.deb
# dpkg -i zabbix-release_4.4-1+buster_all.deb
# apt update

#apt install zabbix-agent

zabbix 5.0 LTS for debian 9

# wget https://repo.zabbix.com/zabbix/5.0/debian/pool/main/z/zabbix-release/zabbix-release_5.0-1+stretch_all.deb
# dpkg -i zabbix-release_5.0-1+stretch_all.deb
# apt update

# apt install zabbix-agent

zabbix 5.0 LTS for centos 7

# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm

# yum install zabbix-agent

2 修改配置文件

无论centos 还是debian,都是在/etc/zabbix/zabbix-agentd.conf

agent 可以以两种模式运行: passive 和 active,我们一般使用passive 模式就可以,也最简单,只需要修改

Passive checks related下面的Server IP就可以

默认的是Server=127.0.0.1, 把127.0.0.1改成你的zabbix 主服务器的IP就可以了

3 防火墙打开10050 端口或者直接whitelist 你的zabbix主服务器的IP就可以了

/bin/bash^M: bad interpreter: No such file or directory

好久没有写bash脚本了,这两天在写一个网站受到攻击自动开始CF五秒盾的bash脚本,利用CF的API可以很轻松的写完这个脚本,可是测试的时候出问题了,提示

/bin/bash^M: bad interpreter: No such file or directory

以前我遇到过好多次这个问题,依稀记得是windows 和unix的编码不一样,换行符的标志也不一样. windows 是CR LF表示一行结尾,而unix用LF表示一行的结尾。

知道了问题的原因,解决起来就好说多了.

  1. 直接将windows下的编辑器的脚本编码转换,转换为unix格式,然后再去unix下执行. 对于ultraedit来说,路径是 File–>Conversions–>DOS->UNIX;对于notepad++来说,路径是setting-> Preferences-> New Document -> Unix, 或者在正在编辑的文件上,点击Edit -> EOL Conversion -> Unix

2) 在unix服务器上,直接运行dos2unix命令,将bash文件转化为unix下的文件

3) vi 命令解决. 首先可以用”vi -b cloudflare.sh”命令,来查看这个bash文件里面隐藏的字符,然后用”vi cloudflare.sh”打开,按下ESC键进入命令行模式,输入下面的命令:

:set ff=unix

:wq

将文本格式设置为unix格式

PacificRack 的Centos模板问题

今天趁着有时间,把闲置的一台512M的PacificRack年付小鸡改成TCP中转服务,连接到我的backend 小鸡webnx上

在控制面板上选择reinstall为centos7以后,发现经过很长一段时间以后,小鸡也无法ping通,也无法连接.

通过VNC登录以后,发现系统早就安装完毕,但是通过ip add命令发现ens3网卡没有公网IP. 

等等,为什么是ens3网卡而不是eth0网卡?cd到/etc/sysconfig/network-scripts中,发现配置的网卡名字就是eth0, 但是系统确使用的是ens3找个名字,看来问题在这里.

看了一下SolusVM 控制面板里面的network card,发现network  card被改成了intel pro, 如下图所示

 

Intel Pro常用于windows vm当中,linux 系统中应该用virtio才对

于是把network card改回virtio,并且重新安装了centos 7,然后发现centos 7 也能够正确的配置网卡了,SSH也能正常连接了

阿里云ECS的坑 – 系统硬件时间

用了这么久 的阿里云ecs,也是今天无意间才发现的,更准确的说应该是centos 7的坑,在centos 6上那样直接修改时区的办法不行了

1)拿到了阿里云的ecs,第一件事就是应该修改系统的hwclock,这是因为阿里云的ecs默认使用的是hwclock 是cst,也就是中国时区。这个可以是可以,但是国际上通用的办法是使用UTC时间,这更能避免很多问题:

timedatectl set-local-rtc 0

2) 第二个坑就是因为有了第一个问题以后,在centos 6上我经常使用下面的办法修改时区(个人习惯,所有的服务器都是UTC或者EST时区):

cp /usr/share/zoneinfo/America/New_York /etc/localtime

在centos 7上我也继续这么使用,在国外的服务器上没有一点问题,但是在阿里云ecs上就会出现下面的情况:

[root@sz ~]# timedatectl
Local time: Wed 2020-01-29 07:57:08 EST
Universal time: Wed 2020-01-29 12:57:08 UTC
RTC time: Wed 2020-01-29 20:57:07
Time zone: Asia/Shanghai (EST, -0500)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: yes
DST active: no
Last DST change: DST ended at
Sun 2019-11-03 01:59:59 EDT
Sun 2019-11-03 01:00:00 EST
Next DST change: DST begins (the clock jumps one hour forward) at
Sun 2020-03-08 01:59:59 EST
Sun 2020-03-08 03:00:00 EDT

Warning: The system is configured to read the RTC time in the local time zone.
This mode can not be fully supported. It will create various problems
with time zone changes and daylight saving time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
If at all possible, use RTC in UTC by calling
'timedatectl set-local-rtc 0'.

重点是timezone 那一行, Asia/Shanghai 变成了EST了,明显不对, 我们需要用下面的命令修改一下:

timedatectl set-timezone "America/New_York"

重启以后,系统的各种时间才会恢复正常.

为什么要这么做?因为如果你不这么做,系统的时间和mysql 的时间会发生冲突,当你需要重启mysql服务的时候,就会出现:

InnoDB: Waiting for page_cleaner to finish flushing of buffer pool

让你需要最起码5分钟以上才能完全重启mysql服务或者重启服务器。。。

下午遇到了问题,一台新装的ecs服务器需要最少5分钟才能重启。。。刚开始以为是smokeping 重启过慢,仔细debug了开机启动,发现是关机速度太慢。。。然后看log 发现是mysql shutdown 时间太长,InnoDB需要清空buffer。。。再继续debug才发现这是系统时间的问题。。。

浪费了整整一下午。。。

Centos 7 Postfix使用第三方的smtp

参见前一篇文章,阿里云的ecs全部关闭了25端口,因此我们只能使用postfix来通过第三方的smtp服务发送一些系统邮件,比如说报警邮件.

这些第三方服务商一般提供25,587端口的smtp的服务,这里我们选择使用587端口

假设你的服务器的hostname是beta.iamhippo.com, 在/etc/aliases 中设定

root    [email protected]

表示所有发向root的邮件都转发到[email protected], 下面是详细的步骤:

1) 安装必须的library

centos/redhat/fedora:

yum install cyrus-sasl-plain

debian/ubuntu:

apt-get install libsasl2-modules

如果你不安装cyrus或者libsasl库,你会得到“no mechanism found error”

2) 设置smtp的用户名,密码

postfix的smtp的用户名和密码位于/etc/postfix/sasl_password

vi /etc/postfix/sasl_password

按照下面的格式添加验证信息:

[mail.isp.example]:587 username:password

我们需要hash一些这个文件来给postfix使用

postmap /etc/postfix/sasl_passwd

一切都正常的情况下,你会在这个目录/etc/postfix目录下看到sasl_passwd.db文件

必要的安全设置:

chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

3) 设置generic map

如果我们是通过配置csf,让系统自动发送报警邮件,那么一般是来自于[email protected], 我们想在邮件中替换这个邮件的话,可以使用generic的功能,比如说我们想把[email protected] 改成[email protected], 那么可以这么写:

[email protected] [email protected]

然后和sasl_password 一样,我们需要hash 一下

postmap /etc/postfix/generic
chown root:root /etc/postfix/generic /etc/postfix/generic.db
chmod 0600 /etc/postfix/generic /etc/postfix/generic.db

4) 配置reply server

这个配置起来就比较简单了,直接打开/etc/postfix/main.cf文件,在最末尾添加:

# specify SMTP relay host
relayhost = [mail.isp.example]:587


# enable SASL authentication
smtp_sasl_auth_enable = yes
# disallow methods that allow anonymous authentication.
smtp_sasl_security_options = noanonymous
# where to find sasl_passwd
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# Enable STARTTLS encryption
smtp_use_tls = yes
# where to find CA certificates
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# where to find generic
smtp_generic_maps = hash:/etc/postfix/generic

保存配置,然后重启postfix

systemctl restart postfix

当然了,建议在重启之前先把postfix 中的queue mails 都删掉。。要不然积累了大量的邮件会一次性发出的

postsuper -d ALL

或者

postfix -f

或者

postfix flush

查看mail queue:

mailq

 

阿里云邮件推送的坑

国内的服务器一直在使用阿里云的,没有办法目前的情况下阿里云确实是国内的No.1

阿里云的ecs默认是关掉25端口的,就算是你申请解封25端口成功了,你也无法用25端口发信,他只允许你用25端口连接到其他的smtp服务器来发信.

使用阿里云的服务,自然而然的想到阿里云的邮件推送服务,而且他还赠送一部分免费的额度,对于我们这种只需要发送触发邮件的人来说,这是非常合适的.

但是这里的一个坑就是smtp协议下只支持25,80,465端口,而465端口一般用来支持STARTTLS, 这个协议比较老,国际标准化组织已经不再推荐,很多的程序例如iredmail默认已经不支持这个端口了。如果你使用的是debian,ubuntu的话,那么这是没有任何问题的,因为自带的postfix 的版本相对来说要新很多, 是3.0 的版本,支持465端口. 如果你使用的是centos7 并且使用的是自带的postfix的话,那么恭喜你,你获奖了。。。

centos7自带的postfix的版本相对来说要低很多,是2.10的版本。。。

而且postfix 的2.10的版本,对于465端口,也就是smtps并不是很支持,你需要使用的stunnel的转发smtps的请求. 详细请看这里:

http://www.postfix.org/TLS_README.html#client_smtps

网上铺天盖地的教程都是apt-get, 我想他们可以也没有想到在centos7 里面会出现问题,不值得花时间去演就演stunnel,那么多的提供标准服务的smtp服务商,舍弃阿里云推送就好了.

如果你的网站位于国外,那么你可以使用sendgrid或者mailgun,都是非常的方便

Centos 7 安装并配置monit

Monit 是一个开源的linux 程序,用来监控程序,并且在必要的时候重启.

在centos上安装的非常的简单.

首先需要安装epel repo:

yum install epel-release

然后就可以安装monit了

yum install monit

将monit加入开机自启动并且start monit进程:

systemctl enable monit
systemctl start monit

查看monit 状态:

systemctl status monit

更多