CentOS7 yum安装软件报错,yum源更换教程

前言

CentOS7执行 yum install 经常报错:Could not resolve host、No package available、Download failed、Metadata cache expired。原因大多是默认国外源慢或已失效、DNS不通、缓存过期。换成国内阿里云/清华镜像源,再清缓存重建,基本都能解决。本篇给出完整换源步骤。

一、先判断报错类型

# 看当前yum源列表
yum repolist
# 测试网络与DNS
ping -c 3 mirrors.aliyun.com
nslookup mirrors.aliyun.com
  • 解析不了域名:先修DNS(/etc/resolv.conf 加 nameserver 114.114.114.114);
  • 能ping通但装不上:源本身失效,换国内源。

二、备份原有源

cd /etc/yum.repos.d/
mkdir backup
mv CentOS-Base.repo backup/

保留备份,换源失败可还原。

三、更换阿里云Base源(CentOS7)

# 下载阿里云7镜像源配置
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 若curl不可用用wget
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

清华源备选:

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tuna.tsinghua.edu.cn/repo/Centos-7.repo

四、更换EPEL源(装扩展软件常用)

# 先删旧epel
rm -f /etc/yum.repos.d/epel.repo
# 阿里云epel7
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

五、清缓存并重建

# 清除旧缓存
yum clean all
# 重建缓存
yum makecache
# 验证源是否生效
yum repolist
# 再试安装
yum install -y vim wget net-tools

六、常见坑

  1. CentOS8/9换了7的源:版本号要对应,Centos-7.repo 只用于7;
  2. 下载源文件404:镜像站路径改版,换清华或官方备用地址;
  3. 多个repo残留冲突:/etc/yum.repos.d/ 下旧的失效repo没删干净,会重复报错;
  4. makecache卡在Metadata:DNS或网络不通,先 ping 镜像站确认;
  5. yum install -y 卡住超时:可临时调大超时,或换网络更好的镜像;
  6. 时间不准导致HTTPS证书校验失败:先 date 检查系统时间,用 ntpdate 校时。

总结

yum报错先分DNS不通还是源失效:DNS不通修resolv.conf;源失效就备份 /etc/yum.repos.d/,下载阿里云Centos-7.repo和epel-7.repo,yum clean all && yum makecache 重建缓存后再安装。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-22 07:20 

Linux日志过大占满磁盘,logrotate日志切割配置

前言

网站跑久了,Nginx、MySQL、PHP-FPM的日志几个G地涨,df -h一看磁盘被日志占满,服务直接报错。手动删不是长久之计,logrotate 是Linux自带的日志切割工具,按天/按大小自动切分并保留指定份数,配一次永久省心。

一、logrotate工作原理

logrotate本身靠系统定时任务(/etc/cron.daily/logrotate)每天跑一次,读取配置:

  • 全局配置:/etc/logrotate.conf
  • 自定义配置目录:/etc/logrotate.d/
    我们一般在 /etc/logrotate.d/ 下为某个服务单独写配置。

二、以Nginx日志为例配置

新建 /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily                 # 按天切割
    missingok             # 日志不存在不报错
    rotate 14             # 保留14份历史
    compress              # 切割后gzip压缩
    delaycompress         # 延迟一次再压缩,避免影响正在写的文件
    notifempty            # 空日志不切割
    create 0644 nginx nginx  # 新建日志文件属主权限
    sharedscripts         # 多个日志只执行一次postrotate
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

关键点:切割后要给Nginx发USR1信号,让它重新打开日志文件,否则还会往旧文件写。

三、按大小切割(不限时间)

如果日志涨得快,按大小更合理:

/var/log/nginx/error.log {
    size 100M            # 超过100M切
    rotate 10
    compress
    missingok
    notifempty
    create 0644 nginx nginx
    postrotate
        kill -USR1 `cat /run/nginx.pid`
    endscript
}

四、测试与立即执行

不等到定时,手动试运行(调试用 -d 打印过程不真正执行):

# 调试,看会做什么
logrotate -d /etc/logrotate.d/nginx
# 强制立即切割一次
logrotate -f /etc/logrotate.d/nginx

切割后原日志变成 xxx.log-20261021,隔天再压成 .gz。

五、常见坑

  1. 切割后服务还往旧文件写:缺postrotate里的 kill -USR1,或pid路径写错,导致旧文件越来越大;
  2. 直接rm删正在写的日志:空间没释放,要 > 文件 清空或重启服务;
  3. compress和delaycompress一起用仍报错:第一次切出的文件先不压,第二次才压,别误以为没生效;
  4. 日志目录属主不对:create指定的用户组要真实存在,否则新建文件失败;
  5. cron没跑:确认 crond 服务开机自启,否则logrotate永远不触发。

总结

在 /etc/logrotate.d/ 为每个大日志写一份切割规则,配好daily/size、rotate份数和postrotate信号重开日志,logrotate -f 验证一次,磁盘就不会再被单个日志吃满。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-21 07:22 

服务器ssh连接慢,DNS反向解析问题解决办法

前言

有没有遇到过这种情况:SSH 登录服务器的时候,输入密码之前要等好几秒甚至十几秒才出密码提示框?服务器性能明明没问题,网络也不差,但 SSH 就是连得慢。这十有八九是 SSH 在做 DNS 反向解析拖慢了速度。本文就讲一下这个问题的原因和解决办法。

问题现象

正常情况下,SSH 连接服务器应该秒连。但如果你遇到的是这样的情况:

$ ssh root@192.168.1.100
# 这里卡住了 5-10 秒
root@192.168.1.100's password:

输入完 ssh 命令后,要等好几秒才出密码提示,那就大概率是 DNS 反向解析的问题。

为什么会这样

SSH 默认会做一件事:当客户端连接过来时,服务器会根据客户端的 IP 地址反查它的域名(PTR 记录)。这个过程叫反向 DNS 解析。

如果你的服务器 DNS 配置有问题,或者客户端的 IP 没有反向解析记录,这个反查过程就会卡住,直到超时才继续。这就是 SSH 连接慢的根本原因。

解决办法:关闭反向解析

修改 SSH 配置文件,禁用反向 DNS 解析。

1. 编辑 sshd_config

vi /etc/ssh/sshd_config

2. 找到或添加这两行

UseDNS no
GSSAPIAuthentication no
  • UseDNS no:关闭反向 DNS 解析
  • GSSAPIAuthentication no:关闭 GSSAPI 认证(这也会拖慢连接)

3. 重启 SSH 服务

systemctl restart sshd

CentOS7 上是 sshd,Debian/Ubuntu 上是 ssh,别搞混了。

4. 验证

再用 SSH 连一下,应该秒连了。

其他可能导致 SSH 慢的原因

除了 DNS 反向解析,还有几个常见原因也会导致 SSH 连接慢:

1. 反向解析超时时间太长

默认的反向解析超时时间比较长。除了直接关闭 UseDNS,也可以改短超时时间:

UseDNS no

直接关掉是最简单的。

2. GSSAPI 认证

有些系统默认开启了 GSSAPI 认证,这个认证过程也很慢。关掉它:

GSSAPIAuthentication no

3. DNS 服务器配置不对

如果你的服务器 /etc/resolv.conf 里配的 DNS 服务器不通或者很慢,反向解析就会超时。可以改成公共 DNS:

vi /etc/resolv.conf

改成:

nameserver 8.8.8.8
nameserver 114.114.114.114

4. 主机名解析问题

如果服务器的主机名在 /etc/hosts 里没有配置,SSH 启动时可能会卡住。把主机名加到 hosts 文件里:

vi /etc/hosts

加上一行:

127.0.0.1   localhost localhost.localdomain
192.168.1.100   your-hostname

怎么确认是不是 DNS 反向解析的问题

改完配置之前,可以先验证一下是不是这个原因。

方法1:查看 SSH 调试日志

在客户端用 -v 参数连接,看详细日志:

ssh -v root@192.168.1.100

如果日志里有类似这样的输出,就是在做反向解析:

debug1: Remote: /root/.ssh/rc: line 1: message: command not found
debug1: channel 0: free: client-session, nchannels 1

中间如果有停顿,就是在反查 DNS。

方法2:在服务器端看日志

在服务器上看 SSH 日志:

tail -f /var/log/secure

连接的时候如果有 reverse mapping 或 dns 相关的字样,就是 DNS 问题。

常见坑

坑1:改完配置忘了重启 sshd

改完 /etc/ssh/sshd_config 后必须重启 SSH 服务才生效:

systemctl restart sshd

很多人改完就直接测试,发现没效果,以为没改对,其实就是忘了重启。

坑2:把 UseDNS 写成了 UseDns

大小写敏感!必须是 UseDNS no,D 和 N 都要大写。写成 UseDns 或者 usedns 都不生效。

坑3:改完配置连不上了

如果改完 SSH 配置后连不上了,可能是配置写错了。千万不要关掉当前 SSH 窗口!新开一个窗口测试,确认没问题了再关旧窗口。

总结

SSH 连接慢的排查步骤:

  1. 先确认是不是 DNS 反向解析的问题
  2. 修改 /etc/ssh/sshd_config,加 UseDNS no 和 GSSAPIAuthentication no
  3. 重启 sshd 服务
  4. 再连接测试,应该秒连

这是 Linux 服务器最常见的优化之一,改完立竿见影。如果你的服务器 SSH 连接慢,先试试这个方法,90% 的情况都能解决。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:29 

CentOS7 关闭SELinux详细步骤,临时+永久关闭

前言

刚装完 CentOS7,部署网站的时候老是遇到各种权限问题:文件明明权限对了还是访问不了,端口也开了就是连不上。排查半天发现是 SELinux 在捣乱。SELinux 是 CentOS 自带的强制访问控制安全机制,安全性很高,但对新手来说确实不太友好。本文详细讲一下怎么临时和永久关闭 SELinux,以及关闭前需要知道的注意事项。

什么是 SELinux

SELinux(Security-Enhanced Linux)是 Linux 内核的一个安全模块,提供强制访问控制(MAC)机制。它比传统的自主访问控制(DAC)更严格,不仅看文件权限,还看进程和文件的安全上下文(SELinux 标签)。

CentOS7 默认开启 SELinux,这也是为什么很多新手部署完网站各种报错的原因——Nginx、PHP、MySQL 的进程和文件上下文不匹配,SELinux 直接拦截。

查看 SELinux 状态

在关闭之前,先看看 SELinux 当前是什么状态:

getenforce

输出可能是:

  • Enforcing:强制模式,SELinux 正在拦截违规操作
  • Permissive:宽容模式,只记录警告不拦截
  • Disabled:已关闭

也可以用这个命令看更详细的信息:

sestatus

输出示例:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed

临时关闭 SELinux(重启后失效)

如果你只是临时测试一下,不想改配置文件,可以用这个方法:

setenforce 0

setenforce 0 表示切换到 Permissive 宽容模式,SELinux 不会再拦截操作,但会在日志里记录。这个命令立即生效,不需要重启。

验证一下:

getenforce

应该输出 Permissive。

注意: 这种方式重启服务器后 SELinux 会重新开启,所以只是临时生效。

永久关闭 SELinux(重启后依然关闭)

要永久关闭,需要修改配置文件:

1. 编辑 SELinux 配置文件

vi /etc/selinux/config

2. 修改 SELINUX 的值

找到这一行:

SELINUX=enforcing

改成:

SELINUX=disabled

3. 保存退出,重启服务器

reboot

重启后再验证一下:

getenforce

应该输出 Disabled。

三种模式说明

SELinux 有三种模式,大家可以根据需求选择:

模式 说明
enforcing 强制模式,SELinux 强制执行策略,违规操作直接拦截
permissive 宽容模式,只记录警告日志,不拦截操作
disabled 完全关闭 SELinux

建议: 如果只是临时调试,可以用 permissive 模式,既能放行所有操作,又能通过日志看到哪些操作被 SELinux 拦截了。生产环境如果实在搞不懂 SELinux,再考虑完全关闭。

常见坑

坑1:改了配置文件没重启就以为关了

很多朋友改完 /etc/selinux/config 文件,马上用 getenforce 查看,发现还是 Enforcing,就以为没改成功。其实配置文件改了之后必须重启服务器才会生效。临时生效用 setenforce 0,永久生效必须重启。

坑2:改了 SELINUX=disabled 但还有问题

有时候即使把 SELinux 关了,之前设置的安全上下文标签还在,可能会导致一些奇怪的问题。如果遇到这种情况,可以重启服务器彻底解决。

坑3:生产环境直接关闭有安全风险

SELinux 是一道安全防线,生产环境直接完全关闭会降低系统安全性。建议先尝试把模式改成 permissive,看看日志里哪些操作被拦截了,再针对性地调整上下文标签,而不是直接全部关掉。

总结

CentOS7 关闭 SELinux 的两种方式:

临时关闭(立即生效,重启失效):

setenforce 0

永久关闭(重启后生效):

  1. 编辑 /etc/selinux/config
  2. 把 SELINUX=enforcing 改成 SELINUX=disabled
  3. 重启服务器

新手刚部署完服务器,先临时关了跑通业务,后面再慢慢研究 SELinux 的配置,别一上来就跟它死磕。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:25 
'); })();