Nginx配置HTTPS证书,http自动跳转https

前言

现在网站都要上 HTTPS,搜索引擎也更喜欢 HTTPS 的网站。本文讲一下 Nginx 怎么配置 HTTPS 证书,以及怎么把 HTTP 请求自动跳转到 HTTPS。

第一步:申请 SSL 证书

免费证书(Let's Encrypt)

用 certbot 自动申请:

# 安装 certbot
yum install certbot python3-certbot-nginx -y

# 自动申请并配置
certbot --nginx -d www.example.com -d example.com

certbot 会自动修改 Nginx 配置,不用手动改。

自己上传证书

如果是从阿里云、腾讯云申请的证书,下载 Nginx 版本的,一般有两个文件:

  • xxx.crt(证书文件)
  • xxx.key(私钥文件)

上传到服务器:

mkdir -p /etc/nginx/ssl

把两个文件传到 /etc/nginx/ssl/ 目录下。

第二步:Nginx 配置 HTTPS

编辑 Nginx 配置文件:

vi /etc/nginx/conf.d/example.conf

配置内容:

server {
    listen       443 ssl http2;
    server_name  www.example.com example.com;

    # 证书路径
    ssl_certificate      /etc/nginx/ssl/xxx.crt;
    ssl_certificate_key  /etc/nginx/ssl/xxx.key;

    # SSL 优化配置
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    # 网站根目录
    root  /var/www/html;
    index index.html index.php;

    location / {
        try_files $uri $uri/ =404;
    }
}

第三步:HTTP 自动跳转 HTTPS

在同一个配置文件里,加一个 80 端口的 server:

# HTTP 跳转 HTTPS
server {
    listen       80;
    server_name  www.example.com example.com;
    return 301 https://$host$request_uri;
}

这样访问 http://www.example.com 就会自动跳转到 https://www.example.com。

第四步:检查配置并重载

检查 Nginx 配置有没有语法错误:

nginx -t

没问题就重载:

nginx -s reload

完整配置示例

# HTTP 跳转 HTTPS
server {
    listen       80;
    server_name  www.example.com example.com;
    return 301 https://$host$request_uri;
}

# HTTPS 配置
server {
    listen       443 ssl http2;
    server_name  www.example.com example.com;

    ssl_certificate      /etc/nginx/ssl/xxx.crt;
    ssl_certificate_key  /etc/nginx/ssl/xxx.key;

    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    root  /var/www/html;
    index index.html index.php;

    location / {
        try_files $uri $uri/ =404;
    }
}

常见坑

坑1:证书文件路径不对

配置里写的证书路径和实际路径不一致,Nginx 启动报错。

解决: 确认证书文件确实在配置写的那个位置。

坑2:443 端口没开放

配置了 HTTPS 但访问不了。

原因: 防火墙没开 443 端口。

解决:

firewall-cmd --permanent --add-service=https
firewall-cmd --reload

坑3:跳转死循环

HTTP 跳 HTTPS 后又跳回 HTTP,无限循环。

原因: 用了 CDN 或者负载均衡,后端以为还是 HTTP。

解决: Nginx 配置里加:

set $flag 0;
if ($http_x_forwarded_proto = 'http') {
    set $flag 1;
}
if ($flag = 1) {
    return 301 https://$host$request_uri;
}

坑4:证书过期了

HTTPS 证书一般一年有效期,忘了续签就会过期。

解决: 用 certbot 的话自动续签:

certbot renew

加个定时任务自动续签:

0 3 1 * * certbot renew --quiet

总结

步骤 命令/操作
申请证书 certbot --nginx -d 域名
配置 HTTPS 写 443 端口的 server 块
HTTP 跳转 return 301 https://$host$request_uri
检查配置 nginx -t
重载 nginx -s reload
开防火墙 firewall-cmd --permanent --add-service=https

提醒: HTTPS 证书要定期续签,别等过期了才想起。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 08:07 

Nginx报502 Bad Gateway完整排查思路(PHP-FPM场景)

前言

502 Bad Gateway 是 Nginx 最常见的报错之一,尤其是 LNMP 架构下,Nginx 把 PHP 请求转发给 PHP-FPM,PHP-FPM 出问题了 Nginx 就报 502。本文讲一下完整的排查思路。

502 是什么意思

502 表示 Nginx 作为反向代理,去请求后端服务(PHP-FPM)的时候,后端没响应或者报错了。

注意: 502 不是 Nginx 的问题,是后端 PHP-FPM 的问题。

排查步骤

第一步:检查 PHP-FPM 服务是否在运行

systemctl status php-fpm

如果显示 inactive (dead),说明 PHP-FPM 挂了,启动它:

systemctl start php-fpm
systemctl enable php-fpm

第二步:检查 Nginx 和 PHP-FPM 的通信配置

看 Nginx 配置里的 fastcgi_pass 对不对:

grep fastcgi_pass /etc/nginx/nginx.conf

常见的配置:

# 用 socket 文件
fastcgi_pass unix:/run/php-fpm/www.sock;

# 用 TCP 端口
fastcgi_pass 127.0.0.1:9000;

问题1:socket 文件路径不对

Nginx 配置里写的 socket 路径和 PHP-FPM 实际的不一致。

PHP-FPM 的 socket 路径在 /etc/php-fpm.d/www.conf 里:

grep listen /etc/php-fpm.d/www.conf

确保两边路径一致。

问题2:端口被占

如果用 9000 端口,检查一下是不是被别的进程占了:

lsof -i:9000

第三步:看错误日志

Nginx 错误日志:

tail -f /var/log/nginx/error.log

PHP-FPM 错误日志:

tail -f /var/log/php-fpm/error.log

PHP 慢日志:

tail -f /var/log/php-fpm/www-slow.log

根据日志里的报错信息找原因。

第四步:常见原因

原因1:PHP-FPM 进程数不够

访问量大的时候,PHP-FPM 进程都被占满了,新请求排队超时。

解决: 增加 PHP-FPM 进程数。

编辑 /etc/php-fpm.d/www.conf:

pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30

改完重启:

systemctl restart php-fpm

原因2:PHP 脚本执行超时

PHP 脚本执行时间太长,超过了 Nginx 的超时时间。

解决: 调大超时时间。

Nginx 配置里:

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

PHP 配置里:

max_execution_time = 300

原因3:PHP 内存不足

PHP-FPM 进程内存溢出,导致进程崩溃。

解决: 调大 PHP 内存限制:

memory_limit = 256M

或者减少 PHP-FPM 进程数,避免内存不够。

原因4:文件权限不对

Nginx 运行的用户和 PHP-FPM 运行的用户不一致,导致 PHP-FPM 读不到文件。

解决: 确保 Nginx 和 PHP-FPM 用同一个用户(一般是 www)。

PHP-FPM 配置 /etc/php-fpm.d/www.conf:

user = www
group = www

然后把网站文件的属主改成 www:

chown -R www:www /var/www/html

第五步:重启所有服务

改完配置后重启:

systemctl restart php-fpm
systemctl restart nginx

常见坑

坑1:只重启了 Nginx

改了 PHP 配置但只重启了 Nginx,PHP-FPM 还是老配置。

解决: PHP 配置改了要重启 PHP-FPM,Nginx 配置改了要重启 Nginx。

坑2:socket 文件权限不对

PHP-FPM 的 socket 文件权限是 600,Nginx 用户读不到。

解决: 改 socket 文件权限:

listen.mode = 0666

或者改 socket 文件的属主:

listen.owner = www
listen.group = www

坑3:PHP-FPM 挂了但没自动重启

PHP-FPM 进程崩溃了,没人自动拉起来。

解决: 配置 systemd 自动重启:

systemctl edit php-fpm

加:

[Service]
Restart=always
RestartSec=2

总结

502 排查步骤:

  1. 先看 PHP-FPM 是不是挂了 → systemctl status php-fpm
  2. 再看 Nginx 配置对不对 → fastcgi_pass 路径/端口
  3. 看错误日志 → Nginx error.log + PHP-FPM error.log
  4. 常见原因 → 进程数不够、超时太短、权限不对、内存不足

记住:502 问题出在后端,不是 Nginx 的锅。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 08:06 

Linux查看系统运行级别,multi-user.target详解

前言

经常听到别人说"运行级别 3"、"运行级别 5",这是什么意思?CentOS7 之后用 systemd 代替了老的 SysVinit,运行级别也变成了 target。本文讲一下怎么查看和切换系统运行级别。

老的运行级别(SysVinit)

老系统(CentOS6 之前)用数字表示运行级别:

级别 含义
0 关机
1 单用户模式(救援模式)
2 多用户模式(无 NFS)
3 完全多用户模式(命令行,服务器常用)
4 未使用
5 图形界面模式
6 重启

新的 target(systemd)

CentOS7 之后用 target 代替了数字运行级别:

target 对应老级别 含义
poweroff.target 0 关机
rescue.target 1 救援模式
multi-user.target 3 命令行模式(服务器常用)
graphical.target 5 图形界面模式
reboot.target 6 重启

查看当前运行级别

systemctl 命令

systemctl get-default

输出:

multi-user.target

就是当前默认的运行级别是命令行模式。

老命令(还能用)

runlevel

输出类似:

N 3

第一个是上次运行级别(N 表示没有),第二个是当前运行级别。

切换运行级别

临时切换(重启后恢复)

systemctl isolate 目标target

比如从图形界面切到命令行:

systemctl isolate multi-user.target

或者从命令行切到图形界面:

systemctl isolate graphical.target

永久切换(重启后生效)

systemctl set-default 目标target

比如默认启动到命令行模式:

systemctl set-default multi-user.target

默认启动到图形界面:

systemctl set-default graphical.target

常用操作

进入救援模式

系统出问题了进不去?进救援模式:

systemctl rescue

进入紧急模式

更底层的救援模式:

systemctl emergency

关机

systemctl poweroff

或者:

systemctl halt

重启

systemctl reboot

常见坑

坑1:图形界面切命令行后黑屏

执行了 isolate multi-user.target,屏幕黑了。

原因: 这是正常的,切到命令行模式就是黑屏,只有终端提示符。

解决: 输入用户名密码登录就行。

坑2:设置了 multi-user.target 但还是进图形界面

执行了 set-default multi-user.target,但重启后还是进图形界面。

原因: 可能有多个桌面管理器在抢着启动。

解决: 确认一下:

systemctl get-default

应该显示 multi-user.target。如果不对,再执行一次。

坑3:把运行级别设成 0 或 6 了

不小心设成了 poweroff.target 或 reboot.target。

后果: 一开就关机或者一开就重启,无限循环。

解决: 进救援模式改回来。

总结

命令 作用
systemctl get-default 查看当前默认运行级别
systemctl set-default multi-user.target 设置为命令行模式
systemctl set-default graphical.target 设置为图形界面模式
systemctl isolate multi-user.target 临时切到命令行
systemctl isolate graphical.target 临时切到图形界面
runlevel 老命令查看运行级别

服务器一般用 multi-user.target(命令行模式),更省资源、更稳定。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 08:05 

CentOS7 安装图形界面,最小化安装升级

前言

很多人装 CentOS7 的时候选了最小化安装,后来发现想用图形界面怎么办?不用重装,直接在线装就行。本文讲一下怎么从命令行升级到带图形界面的版本。

先更新系统

装图形界面前先把系统更新一下:

yum update -y

安装 GNOME 桌面

方法一:安装 GNOME 桌面(推荐)

yum groupinstall -y "GNOME Desktop"

这个安装包比较大,大概几个 G,需要等一会儿。

方法二:安装带图形界面的服务器版

yum groupinstall -y "Server with GUI"

这个比 GNOME Desktop 多一些服务器相关的工具。

设置默认启动方式

查看当前默认启动方式

systemctl get-default

输出 multi-user.target 就是命令行模式,graphical.target 就是图形界面模式。

设置默认启动到图形界面

systemctl set-default graphical.target

设置默认启动到命令行

如果以后想改回命令行:

systemctl set-default multi-user.target

重启生效

reboot

重启之后就会进入图形界面了。

不重启直接进入图形界面

如果不想重启,可以直接启动图形界面:

startx

或者:

systemctl isolate graphical.target

常见坑

坑1:yum 安装报错

安装的时候报错,下载失败。

原因: yum 源没配好。

解决: 先换国内 yum 源(参考之前的 yum 源更换教程),然后再装。

坑2:安装完了还是命令行

装完重启后还是进命令行。

原因: 没设置默认启动方式。

解决:

systemctl set-default graphical.target
reboot

坑3:服务器装图形界面很卡

云服务器上装了图形界面之后特别卡。

原因: 图形界面占内存和 CPU 很多,云服务器配置一般不高。

建议: 生产服务器不要装图形界面,命令行更省资源。如果确实需要图形界面,用 VNC 或者远程桌面连。

坑4:安装包太大下载慢

几个 G 的包下载半天。

解决: 先换国内 yum 源,速度会快很多。

总结

步骤 命令
更新系统 yum update -y
安装 GNOME 桌面 yum groupinstall -y "GNOME Desktop"
设置默认图形界面 systemctl set-default graphical.target
重启 reboot

提醒: 生产服务器建议用命令行模式,更稳定、更省资源。图形界面只在测试或者个人电脑上用。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 08:03 

Linux查看端口被哪个进程占用,lsof命令

前言

启动服务的时候提示 "Address already in use",端口被占了,但不知道被哪个进程占了?这时候就需要用 lsof 或者 netstat 命令来查一下。本文讲一下怎么用。

lsof 命令

安装

CentOS 最小化安装可能没有 lsof:

yum install -y lsof

查看某个端口被哪个进程占用

lsof -i:端口号

比如看 80 端口被谁占了:

lsof -i:80

输出类似:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1234  root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)

重点看:

  • PID:进程号
  • COMMAND:进程名

知道了 PID 之后,想杀掉就用 kill PID。

查看所有正在监听的端口

lsof -i -P -n | grep LISTEN

输出所有处于监听状态的端口和对应的进程。

netstat 命令

安装

来自 net-tools 包:

yum install -y net-tools

查看端口被哪个进程占用

netstat -tlnp | grep 端口号

比如看 80 端口:

netstat -tlnp | grep :80

输出类似:

tcp   0   0 0.0.0.0:80   0.0.0.0:*   LISTEN   1234/nginx

最后一列就是 PID/进程名。

参数解释

参数 含义
-t 显示 TCP 连接
-l 只显示监听状态的
-n 显示数字,不解析域名
-p 显示进程名和 PID

查看所有监听端口

netstat -tlnp

fuser 命令

查看端口被哪个进程占用

fuser 端口号/tcp

比如:

fuser 80/tcp

输出:

80/tcp:              1234

直接显示 PID,简单粗暴。

杀掉占用端口的进程

fuser -k 80/tcp

直接把占用 80 端口的进程杀掉。

常见场景

场景1:启动 Nginx 提示端口被占

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

查一下:

lsof -i:80

发现是旧的 nginx 进程没杀掉,直接杀:

kill 1234

或者:

fuser -k 80/tcp

场景2:3306 端口不知道被谁占了

lsof -i:3306

发现是 MySQL 进程,正常的。

场景3:找出所有被占用的端口

netstat -tlnp

列出所有正在监听的端口。

常见坑

坑1:lsof 命令找不到

执行 lsof 提示 command not found。

原因: 没装 lsof 包。

解决:

yum install -y lsof

坑2:普通用户看不到其他用户的进程

用普通用户执行 lsof,看不到 root 的进程。

原因: 权限不够。

解决: 加 sudo 或者切 root:

sudo lsof -i:80

坑3:端口明明没被占但提示被占

服务明明没启动,但启动时提示端口被占。

原因: 可能有 TIME_WAIT 状态的连接还没释放。

解决: 等一会儿再试,或者改端口。

坑4:杀了进程端口还是没释放

杀掉进程了,但端口还是显示被占。

原因: 进程还在退出中,等几秒就好了。

总结

命令 作用
lsof -i:端口号 查看端口被哪个进程占用
netstat -tlnp \| grep :端口号 用 netstat 查端口
fuser 端口号/tcp 查看端口对应的 PID
fuser -k 端口号/tcp 杀掉占用端口的进程

最常用的就是 lsof -i:端口号,一眼就能看到进程名和 PID。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 08:02 

Linux上传下载文件,rz和sz命令使用

前言

经常需要从本地电脑上传文件到服务器,或者把服务器上的文件下载到本地。除了用 FTP 工具,还有更简单的 rz 和 sz 命令,直接在终端里就能操作。本文讲一下怎么用。

安装 lrzsz

rz 和 sz 命令来自 lrzsz 包,CentOS 最小化安装可能没有:

yum install -y lrzsz

Ubuntu 的话:

apt install -y lrzsz

rz 上传文件(从本地上传到服务器)

基本用法

直接输入:

rz

执行后会弹出一个文件选择窗口,选你要上传的文件,点确定就开始上传了。

注意: 文件会上传到你当前所在的目录。

指定文件名

上传后直接改成指定名字:

rz -y 新文件名

-y 是覆盖同名文件。

上传多个文件

执行 rz 之后在文件选择窗口可以按住 Ctrl 多选。

sz 下载文件(从服务器下载到本地)

下载单个文件

sz 文件名

比如下载 index.html:

sz index.html

执行后会弹出保存窗口,选保存位置就开始下载了。

下载多个文件

sz 文件1 文件2 文件3

比如:

sz a.txt b.txt c.txt

下载整个目录(先打包)

sz 不能直接下载目录,要先打包:

tar -zcvf backup.tar.gz /var/www/html
sz backup.tar.gz

常见使用场景

场景1:上传配置文件

# 先进入要上传的目录
cd /etc/nginx/conf.d/

# 上传
rz

选本地的 nginx 配置文件,上传完就直接放到这个目录了。

场景2:下载日志文件

# 进入日志目录
cd /var/log/nginx/

# 下载访问日志
sz access.log

场景3:上传压缩包

本地把项目打包成 zip,然后:

cd /var/www/html/
rz

选本地的项目 zip 文件,上传完再解压。

常见坑

坑1:rz 命令找不到

执行 rz 提示 command not found。

原因: 没装 lrzsz 包。

解决:

yum install -y lrzsz

坑2:上传的文件不知道去哪了

执行了 rz,但不知道文件上传到哪了。

原因: 文件上传到你当前所在的目录。

解决: 上传前先 pwd 看一下当前目录在哪。

坑3:用了某些 SSH 工具不支持 rz/sz

有些 SSH 客户端(比如 Windows 自带的 cmd)不支持 rz/sz。

原因: rz/sz 需要终端支持 ZModem 协议。

解决: 用支持的 SSH 工具,比如 Xshell、SecureCRT、FinalShell、MobaXterm。

坑4:大文件上传慢

上传几百 M 的文件特别慢。

原因: rz/sz 走的是 SSH 通道,速度不快。

解决: 大文件用 SFTP 或者专门的传输工具(FileZilla)更快。

坑5:上传的文件是乱码

上传完中文文件名变成乱码。

原因: 编码问题。

解决: 用英文文件名,或者先打包成 zip 再上传。

总结

命令 作用
rz 从本地上传文件到服务器
sz 文件名 从服务器下载文件到本地

前提: 要先装 lrzsz 包,而且 SSH 工具要支持 ZModem 协议。

小文件用 rz/sz 很方便,大文件还是用 SFTP 吧。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 08:01 

CentOS7 关闭防火墙,永久关闭firewalld

前言

刚装好的 CentOS7 默认开了防火墙,很多端口都访问不了。有时候为了省事想直接关掉防火墙,本文讲一下怎么操作,以及临时关和永久关的区别。

查看防火墙状态

先看看防火墙现在是开还是关:

systemctl status firewalld

输出里有 active (running) 就是开着,inactive (dead) 就是关了。

或者用:

firewall-cmd --state

输出 running 就是开着,not running 就是关了。

临时关闭防火墙

只关掉当前运行状态,重启后又会自动开起来:

systemctl stop firewalld

永久关闭防火墙

永久关闭,重启后也不会再开:

systemctl stop firewalld
systemctl disable firewalld

两条命令一起执行,先停掉当前的,再禁止开机自启。

重新开启防火墙

如果以后又想开起来:

systemctl start firewalld
systemctl enable firewalld

验证是否关闭成功

执行完之后再看一下状态:

systemctl status firewalld

应该显示 inactive (dead)。

常见坑

坑1:只 stop 了但没 disable

执行了 systemctl stop firewalld,但重启后防火墙又自己开起来了。

原因: 只停了当前运行,没关开机自启。

解决: 还要执行 systemctl disable firewalld。

坑2:关了防火墙但还是访问不了

防火墙关了,但外部还是访问不了网站。

原因: 除了系统防火墙,云服务商还有一层安全组。

解决: 去云服务商控制台(阿里云、腾讯云、华为云等)的安全组里,把对应的端口也开放了。

坑3:Ubuntu 用的不是 firewalld

在 Ubuntu 上执行 firewalld 命令报错。

原因: Ubuntu 默认用 ufw 防火墙,不是 firewalld。

解决: Ubuntu 关防火墙用:

ufw stop
ufw disable

坑4:关闭防火墙不安全

直接关了防火墙,服务器暴露在公网上很危险。

建议: 生产环境不要直接关防火墙,而是只开放需要的端口。比如只开 80、443、22 端口,其他都关。

总结

操作 命令
查看防火墙状态 systemctl status firewalld
临时关闭 systemctl stop firewalld
永久关闭 systemctl stop firewalld && systemctl disable firewalld
开启防火墙 systemctl start firewalld
开机自启 systemctl enable firewalld

注意: 生产环境建议不要直接关防火墙,用开放指定端口的方式更安全。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 08:00 

Linux查看所有服务,systemctl命令大全

前言

CentOS7 之后用 systemctl 管理服务,代替了老的 service 和 chkconfig 命令。本文把常用的 systemctl 命令都整理出来,新手照着用就行。

查看服务

查看所有服务

systemctl list-units --type=service

列出所有正在运行的服务。

查看所有服务(包括没运行的)

systemctl list-unit-files --type=service

查看正在运行的服务

systemctl list-units --type=service --state=running

查看某个服务状态

systemctl status 服务名

比如看 nginx 状态:

systemctl status nginx

输出会显示服务是否在运行、PID、内存占用、最近日志等。

启动和停止服务

启动服务

systemctl start 服务名

比如:

systemctl start nginx

停止服务

systemctl stop 服务名

比如:

systemctl stop nginx

重启服务

systemctl restart 服务名

比如:

systemctl restart nginx

重载配置(不重启)

修改了配置文件后,用 reload 重载,不用重启:

systemctl reload 服务名

比如:

systemctl reload nginx

平滑重启(reload 不行就用这个)

systemctl reload-or-restart 服务名

设置开机自启

开启开机自启

systemctl enable 服务名

比如:

systemctl enable nginx

关闭开机自启

systemctl disable 服务名

比如:

systemctl disable nginx

查看是否开机自启

systemctl is-enabled 服务名

输出 enabled 就是开机自启,disabled 就是不是。

其他常用操作

查看服务是否在运行

systemctl is-active 服务名

输出 active 就是在运行,inactive 就是没运行。

查看服务日志

journalctl -u 服务名

比如看 nginx 日志:

journalctl -u nginx

实时看服务日志

journalctl -u 服务名 -f

和 tail -f 一样,实时输出最新日志。

查看服务开机自启状态

systemctl list-unit-files --type=service | grep enabled

列出所有开机自启的服务。

常见服务名

服务名 对应服务
nginx Nginx 网页服务
httpd Apache 网页服务
mysqld MySQL 数据库
firewalld 防火墙
crond 定时任务
sshd SSH 远程连接
php-fpm PHP 解析
redis Redis 缓存

常见坑

坑1:服务名写错了

执行 systemctl 报错 Unit xxx.service could not be found。

原因: 服务名写错了。

解决: 先列一下所有服务,找到正确的服务名:

systemctl list-unit-files --type=service | grep 关键词

坑2:启动了服务但还是访问不了

服务显示 active,但外部还是访问不了。

原因: 防火墙没开端口,或者服务本身配置错了。

解决: 先看防火墙开了没,再看服务日志:

journalctl -u 服务名

坑3:开机自启了但重启后没起来

设置了 enable,但重启后服务还是没启动。

原因: 服务配置有问题,启动失败了。

解决: 看日志找原因:

journalctl -u 服务名

坑4:用了老命令 service

执行 service nginx start 能用,但不推荐了。

原因: 这是老命令,新系统都用 systemctl。

解决: 换成 systemctl start nginx。

总结

操作 命令
查看所有服务 systemctl list-units --type=service
查看服务状态 systemctl status 服务名
启动服务 systemctl start 服务名
停止服务 systemctl stop 服务名
重启服务 systemctl restart 服务名
重载配置 systemctl reload 服务名
开机自启 systemctl enable 服务名
关闭开机自启 systemctl disable 服务名
查看日志 journalctl -u 服务名

systemctl 就这几个常用命令,记住就够用了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:59 

Linux怎么修改主机名,永久生效方法

前言

新装好的服务器默认主机名是 localhost 或者一串乱七八糟的字符,不好区分。怎么改成自己想要的名字,而且重启后还生效?本文讲一下。

查看当前主机名

先看看现在主机名是什么:

hostname

输出类似:

localhost.localdomain

修改主机名的方法

方法一:hostnamectl(推荐,CentOS7+)

这是最方便的方法,一条命令永久生效:

hostnamectl set-hostname 新主机名

比如改成 web-server:

hostnamectl set-hostname web-server

注意: 主机名只能用小写字母、数字、横杠(-),不能用下划线、中文、空格。

方法二:修改配置文件

编辑 /etc/hostname 文件:

vi /etc/hostname

把里面的内容改成新的主机名,保存退出。

然后重启生效:

reboot

或者不重启,手动让它生效:

hostname 新主机名

方法三:临时修改

只改当前运行时的主机名,重启后就恢复:

hostname 新主机名

注意: 这个只是临时生效,重启后还是原来的。

修改后验证

重新登录一下 SSH,或者执行:

bash

让当前 shell 生效,然后看:

hostname

应该显示新的主机名了。

同时修改 hosts

有些服务(比如 MySQL)会用到主机名,最好同时把 /etc/hosts 也改一下:

vi /etc/hosts

找到类似这一行:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

在后面加上新主机名:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 web-server

保存退出。

常见坑

坑1:改了主机名但命令行没变

执行了 hostnamectl set-hostname,但命令行前面还是显示旧的。

原因: 当前 shell 会话没刷新。

解决: 退出重新登录 SSH,或者执行 bash 开个新 shell。

坑2:重启后又变回原来的

改了主机名,重启之后又变回去了。

原因: 只执行了 hostname 新名字(临时修改),没改配置文件。

解决: 用 hostnamectl set-hostname 新名字 永久修改。

坑3:主机名有大写或者下划线

主机名用了大写字母或者下划线,有些服务报错。

原因: 主机名规范要求只能用小写字母、数字、横杠。

正确写法: web-server-01
错误写法: Web_Server_01

坑4:改了主机名导致服务连不上

改了主机名之后,某些服务连不上数据库或者其他服务。

原因: 那些服务里配置的还是旧主机名。

解决: 把相关服务的配置里的主机名也改过来,或者同时改 /etc/hosts 做映射。

总结

方法 命令 是否永久
hostnamectl hostnamectl set-hostname 新名字 是(推荐)
修改 /etc/hostname 编辑文件后重启 是
hostname hostname 新名字 否(临时)

推荐用 hostnamectl set-hostname,一条命令搞定,永久生效。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:58 

Linux查看网卡信息,ip addr和ifconfig命令

前言

想知道服务器有几块网卡、IP 地址是多少、MAC 地址是多少?Linux 下有两个常用命令:ip addr 和 ifconfig。本文讲一下它们的用法和区别。

ip addr 命令(推荐)

现在新的 Linux 系统都推荐用 ip 命令,功能比 ifconfig 更强大。

查看所有网卡信息

ip addr

或者简写:

ip a

输出类似:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:12:34:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever

输出解释

字段 含义
lo 本地回环网卡
eth0 物理网卡名称
state UP 网卡状态是开启的
link/ether MAC 地址
inet IP 地址
/24 子网掩码(255.255.255.0)

只看 IP 地址

不想看那么多信息,只看 IP:

ip addr show eth0 | grep inet

或者更简洁:

ip a s eth0

只看 IPv4 地址

ip -4 addr

查看网卡统计信息

ip -s link

能看到收发包、丢包等统计信息。

ifconfig 命令(老命令)

ifconfig 是老命令,来自 net-tools 包,现在慢慢被淘汰了,但很多老用户还是习惯用。

安装

CentOS 最小化安装可能没有:

yum install -y net-tools

查看所有网卡

ifconfig

输出类似:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:16:3e:12:34:56  txqueuelen 1000  (Ethernet)
        RX packets 12345  bytes 1234567 (1.2 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6789  bytes 987654 (987.6 KB)
        TX errors 0  dropped 0  overruns 0  carrier 0

只看某个网卡

ifconfig eth0

查看 lo 网卡

ifconfig 默认不显示 lo(回环网卡),要看的话加 -a:

ifconfig -a

ip 和 ifconfig 的区别

对比项 ip addr ifconfig
新老 新命令,推荐 老命令,逐步淘汰
包 iproute2 包(默认装) net-tools 包(要单独装)
功能 更强大 基本够用
输出 信息更全 简洁

其他常用命令

查看路由表

ip route

或者老命令:

route -n

查看 DNS 配置

cat /etc/resolv.conf

查看网卡连接状态

cat /sys/class/net/eth0/carrier

输出 1 表示网线插着,0 表示没插。

查看网卡速率

ethtool eth0 | grep Speed

常见坑

坑1:ifconfig 命令找不到

执行 ifconfig 提示 command not found。

原因: CentOS7 最小化安装不带 net-tools 包。

解决:

yum install -y net-tools

或者直接用 ip addr,不用装包。

坑2:网卡名不是 eth0

新系统网卡名可能是 ens33、ens33、enp0s3 之类的。

原因: CentOS7 用了新的网卡命名规则。

解决: 先 ip addr 看一下实际网卡名是什么,然后替换。

坑3:IP 地址不对

看到的 IP 地址和你预期的不一样。

原因: 可能有多个网卡,或者是云服务器的内网 IP,不是公网 IP。

解决: 先 ip addr 看所有网卡,确认哪个是你要的。

坑4:网卡 down 了

网卡状态是 DOWN,连不上网。

解决: 手动开启:

ip link set eth0 up

或者:

ifconfig eth0 up

总结

命令 作用
ip addr 查看所有网卡信息(推荐)
ip a 简写
ip a s eth0 只看 eth0 网卡
ifconfig 老命令查看网卡
ifconfig eth0 只看 eth0
ip route 查看路由表

现在都推荐用 ip addr,功能更全,还不用额外装包。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:54 

CentOS7 防火墙开放端口范围,一次性开放多个端口

前言

有时候需要一次性开放很多端口,或者开放一段端口范围,一个个加太麻烦。CentOS7 的 firewalld 支持开放端口范围,也支持一次性开放多个端口,本文讲一下怎么操作。

查看当前开放的端口

先看看现在防火墙开了哪些端口:

firewall-cmd --list-ports

输出类似:

80/tcp 443/tcp 8080/tcp

开放单个端口

永久开放

firewall-cmd --permanent --add-port=80/tcp

然后重载生效:

firewall-cmd --reload

开放 UDP 端口

把 tcp 改成 udp 就行:

firewall-cmd --permanent --add-port=53/udp
firewall-cmd --reload

一次性开放多个端口

方法一:一条命令加多个

firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp --add-port=8080/tcp
firewall-cmd --reload

多个 --add-port 用空格分开就行。

方法二:开放端口范围

如果要开放一段连续的端口,比如 8000 到 9000:

firewall-cmd --permanent --add-port=8000-9000/tcp
firewall-cmd --reload

这样 8000 到 9000 之间所有 TCP 端口都开放了。

方法三:同时开放 TCP 和 UDP

firewall-cmd --permanent --add-port=53/tcp --add-port=53/udp
firewall-cmd --reload

移除端口

移除单个端口

firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --reload

移除端口范围

firewall-cmd --permanent --remove-port=8000-9000/tcp
firewall-cmd --reload

常见场景

场景1:开放 20 到 80 之间的所有端口

firewall-cmd --permanent --add-port=20-80/tcp
firewall-cmd --reload

场景2:同时开放 HTTP 和 HTTPS 服务

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

场景3:只允许某个 IP 访问某个端口

这个更安全,只允许 192.168.1.100 访问 3306 端口:

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' port protocol='tcp' port='3306' accept"
firewall-cmd --reload

常见坑

坑1:加了端口没生效

执行了 add-port 但还是访问不了。

原因: 没加 --permanent,或者没 reload。

解决: 一定要加 --permanent 参数,然后执行 firewall-cmd --reload。

坑2:端口范围写反了

写成了 9000-8000,报错。

原因: 范围必须从小到大写。

正确写法: 8000-9000/tcp
错误写法: 9000-8000/tcp

坑3:防火墙没启动

执行 firewall-cmd 报错。

原因: firewalld 服务没启动。

解决:

systemctl start firewalld
systemctl enable firewalld

坑4:开了端口但还是访问不了

防火墙开了端口,但是外部还是访问不了。

原因: 除了防火墙,还有可能是云服务商的安全组没开。

解决: 去云服务商控制台(阿里云、腾讯云等)的安全组里,把对应的端口也开放了。

总结

操作 命令
开放单个端口 firewall-cmd --permanent --add-port=80/tcp
开放多个端口 firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp
开放端口范围 firewall-cmd --permanent --add-port=8000-9000/tcp
移除端口 firewall-cmd --permanent --remove-port=8080/tcp
查看已开放端口 firewall-cmd --list-ports
重载生效 firewall-cmd --reload

记住:加完端口一定要 --reload 才生效。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:53 

Linux查看历史命令,history命令使用技巧

前言

在服务器上敲了很多命令,突然想找之前执行过的某条命令,怎么办?history 命令就能帮你查看历史命令。本文讲一下 history 的常用用法和技巧。

基本用法

查看历史命令

history

输出会列出你执行过的所有命令,每条前面有个编号,比如:

  100  yum install -y wget
  101  systemctl restart nginx
  102  df -h

执行第 N 条历史命令

用 !编号 直接执行:

!101

就会重新执行第 101 条命令。

执行上一条命令

几种方式都行:

!!

或者按向上方向键,再回车。

搜索历史命令

输入开头几个字母,然后按 Ctrl + R:

(reverse-i-search)`sys': systemctl restart nginx

会搜索你输入过的包含这个关键词的历史命令,找到之后回车执行。

再按一次 Ctrl + R 会继续往前找下一个匹配的。

常用技巧

只看最近 N 条

history 10

只看最近 10 条命令。

搜索历史命令里的关键词

history | grep 关键词

比如找所有包含 nginx 的命令:

history | grep nginx

执行最近一条以某个关键词开头的命令

!关键词

比如最近一条以 yum 开头的命令:

!yum

会直接执行最近一次输入的 yum 开头的命令。

替换上一条命令里的内容

比如上一条命令是 cp file1.txt file2.txt,想改成 mv file1.txt file2.txt:

^cp^mv

这样就把上一条命令里的 cp 替换成 mv 再执行。

清空历史命令

清空当前会话的历史

history -c

注意:这个只是清空当前内存里的历史,还没写入文件。

清空历史文件

history -w

把当前内存里的历史写入文件(覆盖掉旧的)。

彻底清空

history -c
history -w

两步一起执行,彻底清空所有历史命令。

删除某一条历史命令

history -d 编号

比如删除第 100 条:

history -d 100

历史命令保存在哪

历史命令默认保存在:

~/.bash_history

每个用户都有自己的 .bash_history 文件。

查看历史文件

cat ~/.bash_history

修改历史记录条数

默认记录 1000 条,可以改:

echo "HISTSIZE=10000" >> /etc/profile
echo "HISTFILESIZE=10000" >> /etc/profile
source /etc/profile

改成记录 10000 条。

常见坑

坑1:history 看不到刚执行的命令

刚执行完的命令,history 里没有。

原因: 历史命令是在退出会话的时候才写入文件的,当前会话的历史在内存里。

解决: 执行 history 就能看到当前会话的所有命令,包括刚执行的。

坑2:history -c 清不干净

执行了 history -c,但重新登录后又出来了。

原因: 只清了内存,没清文件。

解决: 还要执行 history -w 写入文件。

坑3:别人 history 能看到我输的密码

不小心在命令行里输了密码,比如 mysql -uroot -p123456,history 里就有了。

解决:

  1. 执行完之后赶紧删掉那条历史:history -d 编号
  2. 以后输密码不要直接写在命令里,用交互式输入:mysql -uroot -p,然后回车再输密码

坑4:多开几个终端,历史命令对不上

开了多个 SSH 窗口,在这个窗口执行的命令,另一个窗口 history 里看不到。

原因: 每个终端会话有自己的内存历史,退出时才写入文件。

解决: 这是正常现象,不用纠结。

总结

命令 作用
history 查看历史命令
history 10 只看最近 10 条
!101 执行第 101 条历史命令
!! 执行上一条命令
!yum 执行最近一条 yum 开头的命令
history \| grep nginx 搜索包含 nginx 的历史命令
history -c 清空当前会话历史
Ctrl + R 搜索历史命令

日常用得最多的就是 Ctrl + R 搜索 和 history | grep,效率很高。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:51 

Linux压缩解压命令大全,tar、zip、unzip用法

前言

服务器上经常需要压缩文件或者解压上传的压缩包,tar、zip、unzip 这些命令怎么用?本文把最常用的压缩解压命令都整理出来,一次讲清楚。

tar 命令(最常用)

tar 是 Linux 下最常用的打包压缩工具,支持 gzip、bzip2、xz 等多种压缩格式。

参数速记

参数 含义
-c 创建新的打包文件
-x 解压
-z 用 gzip 压缩(.tar.gz)
-j 用 bzip2 压缩(.tar.bz2)
-J 用 xz 压缩(.tar.xz)
-v 显示过程
-f 指定文件名(必须放最后)

压缩成 .tar.gz

最常用的,把目录打包成 tar.gz:

tar -zcvf 打包名.tar.gz 要打包的目录

比如把 /var/www/html 打包成 backup.tar.gz:

tar -zcvf backup.tar.gz /var/www/html

解压 .tar.gz

tar -zxvf 文件名.tar.gz

比如:

tar -zxvf backup.tar.gz

解压到指定目录

加 -C 参数:

tar -zxvf backup.tar.gz -C /目标目录

比如解压到 /tmp 目录:

tar -zxvf backup.tar.gz -C /tmp

只看不解压

tar -ztvf 文件名.tar.gz

列出压缩包里的文件列表,不解压。

.tar.bz2 格式

比 gzip 压缩率更高,但更慢:

# 压缩
tar -jcvf backup.tar.bz2 /var/www/html

# 解压
tar -jxvf backup.tar.bz2

.tar.xz 格式

压缩率最高,最慢:

# 压缩
tar -Jcvf backup.tar.xz /var/www/html

# 解压
tar -Jxvf backup.tar.xz

zip 和 unzip

安装

CentOS 最小化安装可能没有 zip/unzip:

yum install -y zip unzip

压缩成 zip

zip -r 打包名.zip 要打包的目录

比如:

zip -r backup.zip /var/www/html

-r 是递归,把目录下所有文件都打进去。

解压 zip

unzip 文件名.zip

比如:

unzip backup.zip

解压到指定目录

unzip 文件名.zip -d /目标目录

比如解压到 /tmp:

unzip backup.zip -d /tmp

只看不解压

unzip -l 文件名.zip

列出 zip 包里的文件列表。

解压到指定目录并覆盖

unzip -o 文件名.zip -d /目标目录

-o 是覆盖,不提示。

其他压缩格式

gz 格式(单文件压缩)

# 压缩
gzip 文件名

# 解压
gunzip 文件名.gz

bz2 格式

# 压缩
bzip2 文件名

# 解压
bunzip2 文件名.bz2

常见坑

坑1:解压后目录结构不对

解压完发现多套了一层目录。

原因: 打包的时候是带路径打的。

解决: 解压前先看一下压缩包里的结构:

tar -ztvf 文件名.tar.gz

或者 zip 用:

unzip -l 文件名.zip

坑2:解压时磁盘空间不足

解压到一半报错 No space left on device。

原因: 磁盘满了。

解决: 先看一下磁盘空间:

df -h

清理空间后再解压。

坑3:tar 参数顺序不对

执行 tar 报错。

原因: -f 参数必须放最后,后面紧跟文件名。

正确写法: tar -zcvf backup.tar.gz /目录
错误写法: tar -fzc backup.tar.gz /目录

坑4:zip 命令找不到

执行 zip 提示 command not found。

原因: 没装 zip 包。

解决:

yum install -y zip unzip

总结

格式 压缩命令 解压命令
.tar.gz tar -zcvf 名.tar.gz 目录 tar -zxvf 名.tar.gz
.tar.bz2 tar -jcvf 名.tar.bz2 目录 tar -jxvf 名.tar.bz2
.zip zip -r 名.zip 目录 unzip 名.zip
.gz gzip 文件名 gunzip 文件名.gz

最常用的就是 tar -zcvf 压缩 和 tar -zxvf 解压,记住这两个就够用了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:50 

Linux查看系统启动时间,uptime命令详解

前言

想知道服务器从上次开机到现在跑了多久?或者想看系统负载?uptime 命令一行就能搞定。本文详细讲一下这个命令的用法。

uptime 命令

基本用法

直接输入:

uptime

输出类似:

 07:49:21 up  2:15,  1 user,  load average: 0.00, 0.01, 0.05

输出解释

字段 含义
07:49:21 当前系统时间
up 2:15 系统已经运行了 2 小时 15 分钟
1 user 当前有 1 个用户登录
load average: 0.00, 0.01, 0.05 1分钟、5分钟、15分钟的平均负载

常用参数

显示漂亮一点

uptime -p

输出类似:

up 2 hours, 15 minutes

显示系统启动时间

uptime -s

输出类似:

2026-10-06 05:34:21

这就是系统上次启动的具体时间。

查看系统启动时间的其他方法

who 命令

who -b

输出类似:

system boot  2026-10-06 05:34

last 命令

last reboot | head -5

列出最近几次重启记录:

reboot   system boot  3.10.0-1160.el7. Fri Oct  6 05:34 - 07:49  (02:15)
reboot   system boot  3.10.0-1160.el7. Thu Oct  5 09:12 - 22:00  (12:47)

systemd-analyze

systemd-analyze

显示系统启动花了多长时间:

Startup finished in 1.234s (kernel) + 2.345s (initrd) + 10.123s (userspace) = 13.702s

负载(load average)怎么看

uptime 最后三个数字是负载,很多人不知道怎么判断高不高。

三个数字的含义

  • 第一个:1 分钟平均负载
  • 第二个:5 分钟平均负载
  • 第三个:15 分钟平均负载

怎么判断高不高

负载和 CPU 核心数有关:

  • 负载 < CPU核心数:正常
  • 负载 ≈ CPU核心数:刚好饱和
  • 负载 > CPU核心数:过载了

查看 CPU 核心数

nproc

输出就是核心数。

比如你的服务器是 4 核 CPU:

  • 负载 1.0:很闲
  • 负载 4.0:刚好跑满
  • 负载 8.0:过载了

常见坑

坑1:负载高但 CPU 不高

负载很高,但 top 看 CPU 使用率不高。

原因: 可能是 I/O 等待高(磁盘读写慢),或者有大量进程在排队。

解决: 用 top 看 %wa 列(I/O 等待),如果高就是磁盘问题。

坑2:up 时间不对

uptime 显示的运行时间和你印象中的不一样。

原因: 系统可能自动重启过,或者你记错了。

解决: 用 last reboot 看历史重启记录。

坑3:1 user 不对

uptime 显示只有 1 个用户,但你明明看到好几个人登录。

原因: 显示的是登录会话数,不是用户数。同一个用户开多个 SSH 连接会算多个会话。

解决: 用 w 命令看详细的在线用户。

总结

命令 作用
uptime 看运行时间和负载
uptime -p 漂亮格式显示运行时间
uptime -s 显示系统启动时间
who -b 看系统启动时间
last reboot 看历史重启记录
nproc 看 CPU 核心数

日常运维用 uptime 一行就能看个大概,很方便。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:49 

CentOS7 安装wget、vim、net-tools常用工具包

前言

新装好的 CentOS7 最小化系统,很多常用命令都没有,比如 wget、vim、ifconfig 都用不了。本文就讲一下怎么一次性把常用工具包装上。

为什么要装这些工具

CentOS7 最小化安装(minimal install)为了节省空间,默认不带很多常用工具。刚装完系统你会发现:

  • wget 命令找不到
  • vim 命令找不到
  • ifconfig 命令找不到
  • netstat 命令找不到

所以刚装完系统第一件事,就是把这些常用工具装上。

安装常用工具包

一键安装

最省事的方式,一条命令全装上:

yum install -y wget vim net-tools lrzsz unzip telnet

这一条命令就把最常用的都装了。

各工具说明

工具包 作用
wget 命令行下载文件
vim 文本编辑器
net-tools 包含 netstat、ifconfig 等网络工具
lrzsz 包含 rz、sz 上传下载文件
unzip 解压 zip 文件
telnet 测试端口连通性

分开装

如果你只想装某一个:

# 只装 wget
yum install -y wget

# 只装 vim
yum install -y vim

# 只装 net-tools(ifconfig、netstat)
yum install -y net-tools

常用工具包推荐

基础工具包(必装)

yum install -y wget vim net-tools lrzsz unzip telnet curl

开发工具包

yum groupinstall -y "Development Tools"

这个包包含了 gcc、make 等编译工具,装东西经常需要。

其他常用工具

# 查看进程树
yum install -y psmisc

# 实时监控网络
yum install -y nload

# 查看端口占用
yum install -y lsof

# 查看磁盘性能
yum install -y iotop

# 查看内存
yum install -y htop

常见坑

坑1:ifconfig 命令找不到

执行 ifconfig 提示 command not found。

原因: CentOS7 最小化安装不带 net-tools 包。

解决:

yum install -y net-tools

装完之后 ifconfig 就能用了。

坑2:vim 命令找不到

执行 vi 能用,但 vim 找不到。

原因: 最小化安装只有 vi,没有 vim。

解决:

yum install -y vim

坑3:rz 命令找不到

想从本地上传文件到服务器,执行 rz 提示找不到。

原因: 没装 lrzsz 包。

解决:

yum install -y lrzsz

装完之后:

  • rz:从本地上传文件到服务器
  • sz 文件名:从服务器下载文件到本地

坑4:yum 安装报错

执行 yum install 的时候报错。

原因: yum 源没配好,或者网络不通。

解决: 先换国内源(参考之前的 yum 源更换教程),然后再装。

总结

新系统刚装完,先跑这一条命令:

yum install -y wget vim net-tools lrzsz unzip telnet curl

把常用工具一次性装齐,后面省得每次都报 command not found。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:47 

Linux查看文件大小,du和df命令区别

前言

服务器磁盘满了,不知道哪个目录占的空间最大?du 和 df 是两个最常用的查看磁盘空间的命令,但很多人搞不清它们的区别。本文一次讲清楚。

du 和 df 的区别

du(Disk Usage)

看的是文件和目录占用的磁盘空间。

比如某个目录下有多少文件,总共占多少空间。

df(Disk Free)

看的是磁盘分区的整体使用情况。

比如整个硬盘总共有多大,用了多少,还剩多少。

一句话总结

  • du:看文件/目录占了多少
  • df:看磁盘分区总共多大、剩多少

df 命令

查看整体磁盘使用情况

df -h

-h 是 human-readable 的意思,输出成 K、M、G 的易读格式。

输出类似:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   30G   18G  63% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/sdb1       100G   50G   45G  53% /data

只看某个分区

df -h /

只看根分区的使用情况。

显示文件系统类型

df -Th

多了一列 Type,显示是 ext4、xfs 还是其他类型。

du 命令

查看某个目录占多大空间

du -sh 目录路径

比如看 /var 目录:

du -sh /var

-s 是 summary,只显示总计;-h 是易读格式。

输出类似:

5.2G    /var

查看当前目录下每个子目录的大小

du -sh *

输出当前目录下每个子目录占多大空间。

按大小排序

du -sh * | sort -hr

sort -hr 是按数字从大到小排,这样就能一眼看到哪个子目录最大。

找当前目录下最大的10个文件

du -ah . | sort -hr | head -10

-a 是包括文件,不只是目录。

只看一层深度

du -h --max-depth=1 /var

只看 /var 下第一层的子目录大小,不往下钻。

常见场景

场景1:磁盘满了,找大文件

# 先看哪个分区满了
df -h

# 然后去那个分区找大目录
cd /
du -sh * | sort -hr | head -10

# 找到大目录后继续往下钻
cd /var
du -sh * | sort -hr | head -10

一步步找到占空间最大的文件,然后删掉。

场景2:看日志占了多少

du -sh /var/log

场景3:看网站占了多少

du -sh /var/www/html

常见坑

坑1:du 和 df 显示的已用空间不一样

明明删了大文件,但 df 显示还是满的。

原因: 文件被进程占用着,删了之后空间没真正释放。

解决: 找到占用这个文件的进程,重启或者杀掉:

lsof | grep deleted

找到 PID 后重启对应的服务。

坑2:du 命令跑了半天还在跑

du 一个大目录,半天没反应。

原因: 目录太大,文件太多。

解决: 加 --max-depth=1 限制深度,或者先确认一下目录有多大再决定要不要跑。

坑3:df 显示已用空间和 du 对不上

df 显示用了 80G,但 du 加起来才 50G。

原因: 可能有隐藏文件、挂载点下面的文件,或者有进程占用着已删除的文件。

解决: 检查:

# 看有没有挂载点
mount

# 看有没有已删除但还被占用的文件
lsof | grep deleted

坑4:du 显示的大小和 ls 不一样

ls 显示文件是 10M,du 显示是 11M。

原因: du 看的是磁盘块占用,文件系统按块分配空间,实际占用会比文件大小略大一点。

解决: 正常现象,不用纠结。

总结

命令 作用
df -h 看磁盘分区整体使用情况
du -sh 目录 看某个目录占多大空间
du -sh * | sort -hr 看当前目录下每个子目录大小并排序
du -h --max-depth=1 目录 只看一层深度
lsof | grep deleted 看已删除但被进程占用的文件

日常运维记住:df 看分区,du 看目录。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:46 

Linux文件权限755、644含义,chmod修改权限

前言

Linux 文件权限是新手最头疼的东西之一,经常遇到 403 权限不足的报错。755、644 这些数字到底是什么意思?怎么改?本文一次讲清楚。

权限基础

三种身份

Linux 把用户分三类:

  • 文件所有者(u):文件的主人
  • 同组用户(g):和主人在同一个组的人
  • 其他用户(o):所有人

三种权限

每种身份有三种权限:

  • 读(r):4
  • 写(w):2
  • 执行(x):1

加起来就是权限数字。

755、644 是什么意思

755

7 = rwx(读+写+执行)= 4+2+1
5 = r-x(读+执行)= 4+1
5 = r-x(读+执行)= 4+1

合起来就是:所有者能读写执行,同组和其他用户只能读和执行。

常用于: 目录、可执行脚本

644

6 = rw-(读+写)= 4+2
4 = r--(只读)= 4
4 = r--(只读)= 4

合起来就是:所有者能读写,其他人只能读。

常用于: 普通文件、网页

常用权限速查表

数字 含义 用途
755 rwxr-xr-x 目录、脚本
644 rw-r--r-- 普通文件、网页
700 rwx------ 私人目录
600 rw------- 私人文件(比如密钥)
777 rwxrwxrwx 所有人都能读写执行(不推荐)

chmod 修改权限

数字方式(最常用)

chmod 755 文件名

比如把 index.php 改成 644:

chmod 644 index.php

字母方式

chmod u+x 文件名

意思是给所有者(u)加执行权限(x)。

常用的:

  • u+x:所有者加执行权限
  • u-w:所有者去掉写权限
  • g+w:同组加写权限
  • o+r:其他用户加读权限
  • a+x:所有人加执行权限

递归修改目录下所有文件

加 -R 参数:

chmod -R 755 /var/www/html

警告: 递归改权限要小心,别把系统目录改坏了。

chown 修改所有者

有时候不是权限数字的问题,是文件属主不对。

查看文件属主

ls -l 文件名

输出第一列后面就是属主:

-rw-r--r-- 1 www www 1234 Oct  6 10:00 index.php

前面的 www 是用户,后面的 www 是组。

修改文件属主

chown 用户:组 文件名

比如把文件改成 www 用户:

chown www:www index.php

递归修改目录属主

chown -R www:www /var/www/html

常见坑

坑1:网站 403 权限不足

网页打不开,报 403 Forbidden。

原因: 文件权限不对,或者属主不对。

解决:

  1. 文件改成 644:chmod 644 文件
  2. 目录改成 755:chmod 755 目录
  3. 属主改成运行用户:chown www:www 文件

坑2:777 万能解决?

一遇到权限问题就 chmod 777。

原因: 图省事,但不安全。

解决: 777 意味着所有人都能读写执行,恶意文件可以直接往你的目录里写木马。生产环境绝对不要用 777。

坑3:改了权限还是不行

执行了 chmod 还是报权限不足。

原因: SELinux 拦截了。

解决: 检查 SELinux:

getenforce

如果是 Enforcing,临时关掉试试:

setenforce 0

坑4:上传文件没有执行权限

写了个脚本想运行,报 Permission denied。

原因: 文件没有执行权限。

解决:

chmod +x 脚本.sh

总结

命令 作用
chmod 755 文件名 改成 755 权限
chmod 644 文件名 改成 644 权限
chmod -R 755 目录 递归改目录权限
chown www:www 文件名 改文件属主
chown -R www:www 目录 递归改目录属主

记住两个常用的:目录 755,文件 644,基本就够用了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:45 

Linux创建用户、删除用户、修改密码完整命令

前言

服务器上要加新用户、删旧用户、改密码,这些都是日常操作。本文把常用的用户管理命令都整理出来,新手也能照着做。

创建用户

useradd 命令

最简单的创建用户:

useradd 用户名

比如创建一个叫 zhangsan 的用户:

useradd zhangsan

创建完之后,这个用户还不能登录,因为没设密码。

创建用户并设密码

一行搞定:

useradd zhangsan && passwd zhangsan

执行 passwd zhangsan 之后会提示输入两次密码。

创建用户并指定家目录

默认家目录是 /home/用户名,想改的话用 -d:

useradd -d /data/zhangsan zhangsan

创建用户并指定用户组

useradd -g 用户组 用户名

比如把 zhangsan 加到 www 组:

useradd -g www zhangsan

创建用户并指定 UID

useradd -u 1001 zhangsan

修改密码

passwd 命令

修改某个用户的密码:

passwd 用户名

比如修改 zhangsan 的密码:

passwd zhangsan

执行后会提示输入两次新密码。

自己改密码

passwd

直接执行,会提示输入旧密码,然后输入新密码两次。

免交互改密码(脚本用)

写脚本的时候不能交互式输入,用这个:

echo "新密码" | passwd --stdin 用户名

比如:

echo "123456" | passwd --stdin zhangsan

删除用户

userdel 命令

只删用户,不删家目录:

userdel 用户名

比如:

userdel zhangsan

删除用户并删家目录

加 -r 参数,把家目录也删掉:

userdel -r zhangsan

警告: -r 会把 /home/zhangsan 整个删掉,里面的文件都没了,确认清楚再执行。

查看用户信息

查看用户 UID、GID、组

id 用户名

比如:

id zhangsan

输出类似:

uid=1001(zhangsan) gid=1001(zhangsan) 组=1001(zhangsan)

查看用户信息

grep 用户名 /etc/passwd

查看所有用户

cat /etc/passwd

每行一个用户,格式是:

用户名:x:UID:GID:注释:家目录:登录Shell

常见坑

坑1:创建用户后不能登录

创建了用户但 SSH 登录不了。

原因: 没设密码,或者 Shell 是 /sbin/nologin。

解决:

  1. 先设密码:passwd 用户名
  2. 检查 Shell:grep 用户名 /etc/passwd,最后一列应该是 /bin/bash

如果是 /sbin/nologin,改回来:

usermod -s /bin/bash 用户名

坑2:删了用户但家目录还在

执行了 userdel zhangsan,但 /home/zhangsan 还在。

原因: 没加 -r 参数。

解决: 手动删:

rm -rf /home/zhangsan

坑3:普通用户没权限 sudo

新用户不能用 sudo。

原因: 没加到 sudoers 里。

解决: 加到 wheel 组(CentOS)或者 sudo 组(Ubuntu):

usermod -aG wheel 用户名

坑4:密码过期了

用户突然不能登录了,提示密码过期。

解决: root 改密码:

passwd 用户名

或者设置密码永不过期:

chage -M 99999 用户名

总结

操作 命令
创建用户 useradd 用户名
设密码 passwd 用户名
删除用户 userdel 用户名
删除用户+家目录 userdel -r 用户名
查看用户信息 id 用户名
加 sudo 权限 usermod -aG wheel 用户名

日常运维就这几个命令,够用了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:44 

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

前言

CentOS7 默认的 yum 源是国外的,装软件特别慢,有时候还报错 "Could not resolve host" 或者 "Failed to connect"。换个国内源就好了,速度飞快。本文就讲一下怎么换 yum 源。

报错现象

执行 yum install xxx 的时候,报类似这样的错:

Could not retrieve mirrorlist http://mirrorlist.centos.org/...

或者:

Could not resolve host: mirrorlist.centos.org

或者下载速度特别慢,几 KB/s。

原因

默认 yum 源是 CentOS 官方的,服务器在国外,国内访问慢。有时候官方源还会挂。

更换国内源

第一步:备份原来的源

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

第二步:下载阿里源

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

或者用 wget:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

第三步:清理缓存并重建

yum clean all
yum makecache

第四步:测试

yum install -y wget

应该秒装完成。

其他国内源

清华源

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

网易源

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo

中科大源

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.ustc.edu.cn/repo/Centos-7.repo

安装 EPEL 源

EPEL 源是 Extra Packages for Enterprise Linux,很多常用软件(比如 nginx)都在 EPEL 里。

yum install epel-release -y

装完之后也可以换成阿里的 EPEL 源:

mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache

常见坑

坑1:换完源还是慢

换了阿里源还是慢。

原因: DNS 解析慢,或者服务器本身带宽小。

解决: 换个源试试(清华、网易),或者检查 DNS:

cat /etc/resolv.conf

坑2:yum makecache 报错

执行 yum makecache 的时候报错。

原因: 源文件没下好,或者网络不通。

解决: 检查源文件内容对不对:

cat /etc/yum.repos.d/CentOS-Base.repo

或者重新下一遍。

坑3:CentOS7 已经 EOL 了

CentOS7 官方已经停服了(2024年6月30日),官方源已经不能用了。

解决: 用 vault 源(存档源):

阿里 vault 源:

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-7.repo

坑4:404 Not Found

装软件的时候报 404。

原因: 源文件里的路径不对,或者软件包被删了。

解决: 换个源,或者清理缓存:

yum clean all
yum makecache

总结

换 yum 源就三步:

  1. 备份:mv /etc/yum.repos.d/CentOS-Base.repo 备份
  2. 下载新源:curl 下载阿里/清华源
  3. 清缓存:yum clean all && yum makecache

国内服务器一定要换国内源,不然装软件能急死。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:43 

Linux查看进程占用内存最高,kill进程方法

前言

服务器内存用满了,不知道哪个进程占的?找到之后怎么杀掉?本文就讲一下怎么查看占用内存最高的进程,以及怎么 kill 掉。

查看内存占用

top 命令(最常用)

top

打开后默认按 CPU 排序,按 M 键(大写)就会按内存排序。

输出里重点看:

  • PID:进程号
  • USER:运行用户
  • %MEM:内存占用百分比
  • RES:实际用的物理内存(KB)

按 q 退出。

ps 命令

一行命令直接看内存占用前 10:

ps aux --sort=-%mem | head -10

输出按内存从大到小排,前 10 个就是最占内存的。

只看进程名和 PID

ps aux --sort=-%mem | head -10 | awk '{print $2, $11}'

只显示 PID 和进程名,更简洁。

kill 杀掉进程

kill 命令

先从 top 或 ps 里找到进程 PID,然后:

kill 进程号

比如杀掉 PID 为 1234 的进程:

kill 1234

kill -9 强制杀

有时候 kill 没用,进程就是不死,用 -9 强制杀:

kill -9 1234

注意: -9 是强杀,进程没机会清理资源,可能导致数据丢失。尽量先试普通 kill,不行再 -9。

pkill 按名字杀

不用找 PID,直接按进程名杀:

pkill nginx

杀掉所有叫 nginx 的进程。

killall 杀同名进程

killall nginx

和 pkill 类似,也是按名字杀。

常用操作示例

找出最占内存的进程并杀掉

# 找前5个最占内存的
ps aux --sort=-%mem | head -5

# 假设 PID 是 1234,杀掉
kill 1234

杀掉所有 php-fpm 进程

pkill php-fpm

杀掉某个用户的所有进程

pkill -u www

常见坑

坑1:杀错进程了

把系统关键进程杀了,服务器直接挂。

解决: 杀之前先确认一下这个进程是干嘛的:

ps -p 进程号 -o comm=

或者:

ls -l /proc/进程号/exe

坑2:kill 了进程又自动起来了

杀掉之后过几秒又自动启动了。

原因: 有服务管理工具(systemd、supervisor)在监控,挂了就自动拉起。

解决: 先停服务再杀:

systemctl stop nginx

或者:

supervisorctl stop nginx

坑3:kill 没权限

普通用户杀不了 root 启动的进程。

解决: 加 sudo 或切 root:

sudo kill 1234

总结

命令 作用
top 实时看进程,按 M 按内存排序
ps aux --sort=-%mem 按内存排序看进程
kill 进程号 正常杀进程
kill -9 进程号 强制杀进程
pkill 进程名 按名字杀进程
killall 进程名 杀同名所有进程

服务器内存爆了就用 top 按 M 排序,找到最占内存的杀掉就行。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:41