安装php

1. 安装所需环境

yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel libzip-devel pcre-devel

2. 下载并安装PHP

#下载
wget http://cn2.php.net/distributions/php-7.3.3.tar.gz
#解压
tar -xzf php-7.3.3.tar.gz
#进入目录
cd php7.3.3
#编译php
./configure --prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--with-config-file-scan-dir=/usr/local/php7/etc/php.d \--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-gd \
--with-iconv \
--with-zlib \
--enable-xml \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache

如果报错system libzip must be upgraded to version >= 0.11

yum  -y remove libzip-devel
wget https://libzip.org/download/libzip-1.3.2.tar.gz
tar xvf libzip-1.3.2.tar.gz
cd libzip-1.3.2
./configure
make && make install

编译,安装

# -j: 启用两个任务
make && make install -j2

3. 配置PHP

# 复制ini文件
cp php.ini-production /usr/local/php7/etc/php.ini
# 配置fpm
cd /usr/src/php-7.0.0/sapi/fpm
cp init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
# 启动服务
/etc/init.d/php-fpm start
# 添加环境变量
vim /etc/profile
# 在最后添加
export PATH=$PATH:/usr/local/php7/bin
# 立即生效
source /etc/profile
# 验证是否可以全局使用php命令
php -v
PHP 7.2.0 (cli) (built: Jan 16 2020 12:17:55) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

删除文件后,不释放空间

因为文件是被打开的(有一个进程正在使用),被直接删除了文件。虽然文件被删除了,但是进程将仍然能够读取该文件,磁盘空间也一直被占用。所以若想清除被占用的文件,可以选择清空日志文件的方式:

echo > /data/server/xxx/log/log.log

通过以下命令查找哪些被删除的文件未释放空间

lsof |grep deleted

file
将这个服务重启一下即可。

修改jar包内配置文件

# 解压jar包到目录
jar xvf audit-creditscore-jl-1.4.2_20211028.jar
# 用 vi 命令 修改需要改的配置文件
# 把解压修改后的文件重新打成jar包即可
jar -cfM0 audit-creditscore-jl-1.4.2_1028.jar *

监控端口是否运行

监控端口是否允许,如果未运行则执行启动命令
使用方法:

创建定时任务

* * * * * sh /data/shell/monitor_port.sh 4875 "cd  /data/www/sinopia  && nohup sh start.sh &"

脚本后面后面跟了两个参数,分别是要监控的端口号、启动的命令

脚本内容

#!/bin/bash
# 检查参数数量是否正确
if [ $# -ne 2 ]; then
  echo "Usage: $0 <port> <start-command or service-name>"
  exit 1
fi
# 获取端口号和启动命令
PORT=$1
START_COMMAND=$2
# 定义日志目录和文件名
LOGDIR="/data/shell/log"
LOGFILE="${LOGDIR}/monitor_port-`date '+%Y%m%d'`.log"
# 检查日志目录是否存在,如果不存在则创建该目录
if [ ! -d "$LOGDIR" ]; then
  mkdir -p "$LOGDIR"
fi
# 定义日志函数,加上时间戳并输出到日志文件
log() {
  echo "[`date '+%Y-%m-%d %H:%M:%S'`] $1" >> $LOGFILE
}
# 检查端口是否在运行
if netstat -ntlp | grep -q ":$PORT "; then
  log "Port $PORT is running"
else
  # 端口未运行,启动服务
  log "Port $PORT is not running, starting $START_COMMAND"
  eval "$START_COMMAND"
fi
# 清理7天前的日志
find "$LOGDIR" -type f -name "monitor_port-*" -mtime +7 -exec rm -f {} \;

磁盘挂载

1. 查看磁盘情况:lsblk

可以看到sdb这个是个未挂载的新磁盘。且没有分区
file

2. 给磁盘分区

fdisk /dev/sdb

输入m可以获取帮助。通常输入n新建分区,输入p建立分区,其余默认。输入w保存
再次输入 lsblk 查看,可以看到sdb下面已经新建了sdb1分区。
file

3. 格式化分区:

mkfs.ext4 /dev/sdb1

4. 挂载分区

选择要挂载的目录(我这里用的data)

mount /dev/sdb1 /data (卸载分区umount /data)

5. 设置开机自启动

要设置挂载开机自启动,否则重启后需要手动挂载

vim /etc/fstab

file

注意:如果 /etc/fstab 配置的磁盘或目录有误,可能会导致系统启动失败

为了避免因磁盘或目录错误导致系统无法启动,可以通过以下方式优化 /etc/fstab 配置:
设备路径(如 /dev/vdb1)可能因硬件顺序变化而改变,推荐使用 UUID(唯一标识符)来指定磁盘。UUID 不受设备名称变化影响。

# 查看 /dev/vdb1 的 UUID:
blkid /dev/vdb1
# 输出如:/dev/vdb1: UUID="123e4567-e89b-12d3-a456-426614174000" TYPE="ext4"

修改 /etc/fstab,将 /dev/vdb1 替换为 UUID:

UUID=123e4567-e89b-12d3-a456-426614174000 /data ext4 defaults 0 0

nofail 选项允许系统在磁盘不可用时继续启动,而不会因挂载失败而中断。
在挂载选项中添加 nofail:

UUID=123e4567-e89b-12d3-a456-426614174000 /data ext4 defaults,nofail 0 0

效果:如果 /dev/vdb1 不存在或无法挂载,系统会忽略此条目,继续启动。

ssh互信

前言

在日常的一些使用中,偶尔有不输入密码,直接通过ssh访问目标机器的需求。比如linux之间的rsync同步。本篇文章中具体阐述了linux服务器之间的ssh信任的配置。

实验目标

A服务器通过ssh访问B服务器,可无需输入密码,直接登陆。

配置步骤

在A服务器生成公钥

# 生成公私钥
ssh-keygen -t rsa

所有需要输入的地方直接按回车。所以公私钥文件都是在默认位置保存,且没有密码。存储公私钥的文件夹位置默认为~/.ssh/,文件名默认是id_rsa和id_rsa.pub

将公钥复制到B服务器

把id_rsa.pub里的内容复制到B机器的~/.ssh/authorized_keys(如果没有这个文件,新建一个)
注意:上面是一行字符,不能为多行。(可以用cat查看复制)

这样就建立了服务器B对服务器A的信任关系,即在服务器A用任何ssh相关的工具不需要输入登录密码就可以访问服务器B了。

案例演示

实现免密从A服务器访问B服务器的rsync用户

# 以下为在B服务器的执行操作
# root用户执行:
useradd -m rsync
# 切换到rsync用户
su - rsync
# 修改权限
mkdir ~/.ssh
chown rsync:rsync ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chown rsync:rsync ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 将A服务器的id_rsa.pub内容写入B服务器rsync用户下的authorized_keys
cat id_rsa.pub >> ~/.ssh/authorized_keys

这样就可以在A服务器ssh或者scp到B服务器了

# 免密ssh连接
ssh rsync@192.168.1.100
# 免密scp
scp /data/file.txt rsync@192.168.1.100:/data/

添加SWAP空间

添加Swap空间可以在内存不足时提供额外的虚拟内存,防止内存不足导致的系统崩溃

# 创建一个4GB的swap文件
sudo fallocate -l 4G /swapfile
# 如果系统不支持,用以下命令
sudo dd if=/dev/zero of=/swapfile bs=1G count=4

# 设置权限
sudo chmod 600 /swapfile

# 格式化为swap

sudo mkswap /swapfile
# 启用
sudo swapon /swapfile

# 要使其在重启后继续生效,编辑 /etc/fstab 并添加以下行
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

firewalld防火墙规则

防火墙基本命令

# 查看规则
sudo iptables -L -n --line-numbers
# 清空规则
sudo iptables -F

# 保存规则 - Debian 的系统
sudo iptables-save > /etc/iptables/rules.v4
# 保存规则 - Red Hat 的系统
sudo service iptables save
# 恢复保存的规则 - Debian 的系统
sudo iptables-restore < /etc/iptables/rules.v4

# 重启服务
systemctl restart firewalld
# 开机自启
sudo systemctl enable iptables

防火墙规则设置

# 允许特定 IP 访问 22 端口
sudo iptables -A INPUT -s 106.75.⬛.⬛ -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -s 42.240.⬛.⬛ -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -s 183.17.⬛.⬛ -p tcp --dport 22 -j ACCEPT

# 允许所有 IP 访问 UDP 的 1194 端口
sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT

# 允许 10.8.0.0/24 本机所有端口
sudo iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT

# 允许 0.0.0.0/0 访问 80、443、2222 端口
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,2222 -j ACCEPT

# 拒绝所有其他请求
sudo iptables -A INPUT -j DROP

检测证书到期

先从域名解析里导出二级域名列表,将二级域名写入check-cert.txt文件
修改脚本内com=’xxxx.com’改为自己的顶级域名
执行脚本。

#!/bin/bash
##########################
# 读取check-cert.txt文件中的域名列表
#domains=$(cat check-cert.txt)
com='xxxx.com'
domains=$(for i in `cat check-cert.txt| grep ^[^#]` ;do echo $i.$com;done)
##########################
cat /dev/null > check-cert.log
echo -e "域名名称\t证书状态" >>check-cert.log
# 遍历每个域名
for domain in $domains; do
    # 判断域名是否可达,超时则输出红色信息并跳过进行下一个域名
    if ! timeout 1 bash -c "echo > /dev/tcp/$domain/443" > /dev/null 2>&1 ; then
        echo -e "\033[33m${domain}\t未知\033[0m" >>check-cert.log
        continue
    fi

    # 获取证书有效期截止时间
    expiration_date=$(echo | openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f 2)

    # 将证书过期日期转换为时间戳
    expiration_timestamp=$(date -d "$expiration_date" +%s)

    # 获取当前时间的时间戳
    current_timestamp=$(date +%s)

    # 获取证书颁发者和主题信息
    issuer=$(echo | openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates)
    subject=$(echo | openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -subject -dates)

    # 如果返回结果为空,则说明该站点没有SSL证书
    if [[ -z "$issuer" || -z "$subject" ]]; then
        echo -e "\033[31m${domain}\t站点没有SSL证书\033[0m" >>check-cert.log
    elif [[ $current_timestamp -lt $expiration_timestamp ]]; then
        days_left=$((($expiration_timestamp - $current_timestamp)/(3600*24)))

        if [[ $days_left -le 30 ]]; then
            echo -e "\033[36m${domain}\t即将过期\t(剩余${days_left}天)\033[0m" >>check-cert.log
        else
            echo -e "\033[32m${domain}\t已更新\033[0m" >>check-cert.log
        fi
    else
        # 证书已过期,输出红色
        echo -e "\033[31m${domain}\t已过期\t$expiration_date\033[0m" >>check-cert.log
    fi
done

别名

创建alias便于常见操作

vim ~/.bash_profile
# 添加常见操作。例如添加
alias redis='redis-cli -h 10.1.74.47'
alias config='/usr/bin/mysql -h10.1.181.45    -uprod -pYasdf1344GT db_config  --default_character_set=utf8 -A'

输入redis 就相当于输入了后面的redis-cli -h 10.1.74.47
输入config 就相当于输入了后面的/usr/bin/mysql -h10.1.181.45 -uprod -pYasdf1344GT db_config --default_character_set=utf8 -A

版权所有,转载注明来源