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 协助处理
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 排查步骤:
- 先看 PHP-FPM 是不是挂了 →
systemctl status php-fpm - 再看 Nginx 配置对不对 → fastcgi_pass 路径/端口
- 看错误日志 → Nginx error.log + PHP-FPM error.log
- 常见原因 → 进程数不够、超时太短、权限不对、内存不足
记住:502 问题出在后端,不是 Nginx 的锅。
遇到问题加QQ23979811 协助处理
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 协助处理
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 协助处理
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 协助处理
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 协助处理
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 协助处理
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 协助处理
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 协助处理
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 协助处理
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 协助处理
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 里就有了。
解决:
- 执行完之后赶紧删掉那条历史:
history -d 编号 - 以后输密码不要直接写在命令里,用交互式输入:
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 协助处理
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 协助处理
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 协助处理
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 协助处理
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 协助处理
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。
原因: 文件权限不对,或者属主不对。
解决:
- 文件改成 644:
chmod 644 文件 - 目录改成 755:
chmod 755 目录 - 属主改成运行用户:
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 协助处理
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。
解决:
- 先设密码:
passwd 用户名 - 检查 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 协助处理
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 源就三步:
- 备份:
mv /etc/yum.repos.d/CentOS-Base.repo 备份 - 下载新源:curl 下载阿里/清华源
- 清缓存:
yum clean all && yum makecache
国内服务器一定要换国内源,不然装软件能急死。
遇到问题加QQ23979811 协助处理
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 协助处理