Skip to content

Linux实操篇

1.1 Linux磁盘分区、挂载

1.1.1 Linux分区

  1. 原理介绍

    • Linux来说无论有几个分区,分给哪一目录使用,它归根结底只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分
    • Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得
  2. 硬盘说明

    • Linux硬盘分为IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘
    • 对于IDE硬盘,驱动器标识符为"hdx\~",“hd”表明分区所在设备的类型,这里指IDE硬盘。“x”代表盘号(a为基本盘,b为从属盘,c为辅助主盘,d为辅助从属盘),“~”代表分区,前四个分区用数字1到4表示,他们是主分区或者扩展分区,从5开始是逻辑分区。
    • 对于SCSI硬盘,则标识为“sdx\~”,SCSI硬盘“sd”来表示分区所在设备的类型的,其余和IDE硬盘的表示方法一样。
  3. 相关指令

    • 查看所有设备挂载情况
      • 命令:lsblk 或者 lsblk -f
  4. 挂载的经典案例(增加一块硬盘)

    • 如何增加一块硬盘
      • 虚拟机添加硬盘

        在vmware右击该虚拟机,设置,添加新硬盘即可

      • 分区

        分区命令为 fdisk /dev/所操作的硬盘 ,注意 w 保存修改后退出

      • 格式化

        建立文件系统。

        格式化命令为 mkfs [选项] [-t 文件系统类型] 设备文件名 (make file system),常用命令实例:

        • 格式化为 EXT4(最通用,在一开始就分配好固定数量的i节点):mkfs.ext4 /dev/sdb1
        • 格式化为 XFS (高性能服务器常用,基于B+树动态创建管理i节点):mkfs.xfs /dev/sdb1
        • 格式化为 FAT32 (用于U盘,跨平台兼容):mkfs.vfat /dev/sdb1
      • 挂载

        用户可以直接读写该硬盘。

        命令:mount 硬盘文件 目录 ,如将sdb1硬盘挂载到/newdisk/目录下,mount /dev/sdb1 /newdisk/

        卸载命令为:umount 硬盘文件umount 目录

        注意:使用命令行挂载后,重启会失效

      • 设置可以自动挂载

        修改 /etc/fstab 文件即可完成该操作

        1. vim /etc/fstab

          image-20260209173137180

        2. 仿照前三个分区,将新分区挂载到指定目录即可,分区推荐使用标识符UUID(blkid /dev/sdb1 获取硬盘UUID)

        3. 修改完成后,使用 mount -a ,测试一下是否挂载成功

1.1.2 磁盘使用情况查询

  1. 查询整体磁盘使用情况
    • 基本语法:df -h (disk free)

image-20260209174018232

  1. 查询指定目录的磁盘占用情况

    • 基本语法:du -h 目录 (disk usage),若没有指明目录,默认查询当目录
    • 选项:
      • -s:指定目录占用大小汇总
      • -h:带计量单位
      • -a:将目录下的文件也列出来
      • --max-depth=1:子目录深度
      • -c:列出明细的同时,增加汇总值

    image-20260209181245866

1.1.3 工作使用指令

  1. 统计指定目录下文件的个数

    ll /opt | grep "^-" | wc -lwc -l (word count)命令用来统计文本中换行符的个数,即行数。

  2. 统计指定目录下目录的个数

    ll /opt | grep "^d" | wc -l

  3. 统计指定目录下文件的个数,包括子文件夹的

    ll -R /opt | grep "^-" | wc -l

  4. 统计指定目录下目录的个数,包括子文件夹的

    ll -R /opt | grep "^d" | wc -l

  5. 以树状显示目录结构

    tree

1.2 网络配置

1.2.1 NAT网络配置原理图

image-20260211200929048

1.2.2 网络配置指令

  1. 查看ip地址:ifconfig / ip addr

  2. ping测试主机之间的连通性

    • 基本语法:ping 目的主机ip
  3. Linux网络环境设置

    • DHCP协议自动获取IP(默认),IP不会冲突,但是IP不固定,不适合做服务器

    • 指定IP,使用静态IP,通过修改配置文件的方法,自己指定IP

      • 配置静态IP

        1. /etc/sysconfig/network-scripts/,修改ifcfg-ens33[具体文件看自己的虚拟网卡是哪个]该文件
        TYPE="Ethernet"
        PROXY_METHOD="none"
        BROWSER_ONLY="no"
        BOOTPROTO="static"
        DEFROUTE="yes"
        IPV4_FAILURE_FATAL="no"
        IPV6INIT="yes"
        IPV6_AUTOCONF="yes"
        IPV6_DEFROUTE="yes"
        IPV6_FAILURE_FATAL="no"
        IPV6_ADDR_GEN_MODE="stable-privacy"
        NAME="ens33"
        UUID="cc535551-4caa-4bef-9498-6f138559d326"
        DEVICE="ens33"
        ONBOOT="yes"
        IPADDR=192.168.134.128
        NETMASK=255.255.255.0
        GATEWAY=192.168.134.2
        DNS1=114.114.114.114
        DNS2=8.8.8.8

        将BOOTPROTO[引导协议]值设置为 static ,添加手动配置的IPADDR[静态IP地址]、NETMASK[子网掩码]、GATEWAY[网关]、DNS服务器等配置

        1. 重启网络服务:sudo systemctl restart network

        2. 查看IP地址是否正确

          ip addr

          测试DNS服务是否正常

          ping www.baidu.com

          测试网关

          ping 192.168.134.2

  4. 设置主机名和hosts映射

    • 指令 hostname ,查看主机名

    • 修改主机名

      • /etc/hostname 指定
    • 设置hosts映射,使得主机可以通过主机名与其他主机通信

      • windows系统设置hosts映射关系:修改 C:\Windows\System32\drivers\etc\hosts 文件即可,加上ip及对应的主机名

        image-20260219180123150

      • Linux系统设置hosts映射关系:在 /etc/hosts 文件中指定

    • 主机名解析过程分析(Hosts、DNS)

      • Hosts是什么?

        一个文本文件,用来记录 IP 和 主机名的映射关系

      • DNS(Domain Name System的缩写),域名系统,是互联网上作为域名和IP地址相互映射的一个分布式数据库。

        当对某一个域名发起请求时,计算机首先在浏览器缓存中寻找该域名对应的IP地址,如果没有,就在操作系统DNS缓存中寻找,再没有,会查看本机的hosts文件,寻找该域名的IP映射,最后再没有就会去DNS服务器中寻找。

1.2.3 curl指令(Client URL)

curl (Client URL) 是一个利用 URL 语法在命令行下工作的文件传输工具。


一、 基础探测与查看

用于测试网络连通性和查看服务器响应。

功能命令示例说明
获取源码curl https://example.com将网页 HTML 内容打印在终端
仅看响应头curl -I https://example.com常用。查看状态码(200/404)、Server类型、缓存策略等
详细模式curl -v https://example.com调试必备。显示请求(>)和响应(<)的完整过程
探测端口curl -v telnet://1.1.1.1:22测试远程服务器特定端口是否开放

二、 文件下载

wget 更灵活,支持多种下载策略。

  • 保存为指定文件名 (-o 小写):

    curl -o filename.zip https://example.com/file.zip

  • 使用原始文件名 (-O 大写):

    curl -O https://example.com/image.png

  • 断点续传 (-C -):

    curl -C - -O https://example.com/bigfile.iso

  • 限速下载:

    curl --limit-rate 200k -O https://example.com/file.zip


三、 API 调用与数据提交

开发和运维调试接口的核心用法。

  • 发送 POST 请求 (-d):

    curl -d "user=ethan&pass=123" https://example.com/login

  • 发送 JSON 数据 (-H 指定 Header):

    curl -X POST -H "Content-Type: application/json" -d '{"id": 101}' https://api.com/user

  • 指定请求方法:

    curl -X DELETE https://api.com/user/1

  • 上传文件:

    curl -F "file=@/path/to/img.jpg" https://example.com/upload


四、 常用高级参数速查表

参数全称作用场景建议
-L--location跟随重定向网页有跳转时必加,否则只看得到 301/302 页面
-k--insecure忽略 SSL 证书检查访问证书过期的网站或内网自签证书时使用
-A--user-agent伪装浏览器绕过某些针对爬虫的拦截,如 curl -A "Mozilla/5.0" ...
-H--header自定义请求头传递 Token、Cookie 等认证信息
-x--proxy使用代理curl -x http://proxy.com:8080 https://google.com
-s--silent静默模式不显示下载进度条,常用于脚本处理

五、 实用小技巧

  1. 一行代码查公网 IP:

    curl ifconfig.mecurl cip.cc

  2. 测试网页响应时间:

    curl -o /dev/null -s -w %{time_total}\\n https://www.google.com

  3. 保存并使用 Cookie:

    curl -c cookie.txt https://example.com (保存)

    curl -b cookie.txt https://example.com (使用)


💡 提示:在 Windows 10/11 和 macOS 中,curl 已经是内置指令,用法与 Linux 完全一致。

1.2.4 wget网络下载工具

wget(World Wide Web get)是一个非交互式的网络下载工具,它最强悍的地方在于极高的稳定性强大的递归下载(爬取)能力


一、 wget 的功能

  1. 后台静默执行:你开启下载后可以退出登录,它会在后台默默把活干完。
  2. 断点续传:如果下载 10GB 的文件到 9GB 时断网了,wget 可以接着下,而不是从头开始。
  3. 递归下载:它可以像爬虫一样,把整个网站的图片或文档全部抓取下来。
  4. 极其稳定:在网络极其不稳定的环境下,它的重试机制非常顽强。

二、 常用命令

  1. 基础下载(直接存到当前目录)
wget https://example.com/jdk-11.tar.gz
  1. 下载并重命名 (-O 大写)
wget -O myjava.tar.gz https://example.com/jdk-11.tar.gz
  1. 断点续传 (-c)

这是运维最常用的参数。如果下载中断了,加上 -c 接着下:

wget -c https://example.com/very-big-file.zip
  1. 后台下载 (-b)

下载大文件时,不想让窗口被占死:

wget -b https://example.com/database-backup.sql
# 系统会返回一个 PID,并在当前目录生成 wget-log 日志
  1. 限制下载速度 (--limit-rate)

为了不把公司带宽占满,可以限速:

wget --limit-rate=500k https://example.com/file.zip

三、 高级玩法:镜像一个网站 (-r)

假设你想把某个在线文档全部下载到本地离线查看:

Bash

wget -r -p -np -k https://docs.example.com
  • -r: 递归下载。
  • -p: 下载网页运行所需的所有资源(图片、样式表等)。
  • -np: 不追溯到父目录(只下载当前路径下的内容)。
  • -k: 将下载后的链接转换为本地链接(方便离线点击)。

四、 wget vs curl 该选谁?

虽然两者都能下载,但侧重点不同:

特性wgetcurl
主要定位下载器(专门搬运文件)传输工具(与服务器交互)
递归下载支持(可以爬整个网站)不支持
交互能力较弱极强(模拟表单、API调用)
断点续传原生支持极好需要配合参数 -C -
安装情况多数 Linux 默认自带现代系统默认自带,功能更广

总结建议

  • 如果你只是想下载一个超大的安装包、备份文件,或者想离线保存某个网页,选 wget
  • 如果你是想测试接口、查看 HTTP 头、模拟登录,选 curl

1.3 进程管理

1.3.1 进程基本介绍

  1. 在Linux中,每个执行的程序都称为一个进程。每个进程都分配一个ID号(PID,进程号)
  2. 每个进程都可能以两种方式存在的,前台进程和后台进程,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是系统在后台操作,后台方式执行。
  3. 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。

1.3.2 显示系统执行的进程

  1. 基本介绍:ps命令(process status)是用来查看目前系统中,有哪些进程正在执行,以及它们执行的状况,可以不加任何参数

  2. 基本语法:ps [选项]

  3. 常用选项:

    • -a : 显示当前终端所有进程信息,侧重"人"启动的进程
    • -u : 以用户的格式显示进程信息
    • -x : 显示后台进程运行的参数
    • -e : 显示所有进程,包含“系统”启动的进程
    • -f : 全格式显示,包含UID、PPID等详细信息

    注:平时使用ps命令时有两种风格,当需要看进程的父进程(PPID)时,使用ps -ef,其他时候使用ps -aux即可

  4. ps命令显示的信息选项

    image-20260219185506846

    列名全称意义(通俗解释)
    USERUser该进程属于哪个用户(谁运行的)。
    PIDProcess ID进程 ID。这是每个进程的唯一身份证号,结束进程(kill)时要用到它。
    %CPUCPU Usage进程占用的 CPU 百分比。
    %MEMMemory Usage进程占用的物理内存百分比。
    VSZVirtual Size虚拟内存大小(KB),包含进程可以访问的所有内存,包括置换出去的。
    RSSResident Set Size实际占用的物理内存大小(KB)。
    TTYTerminal Type进程在哪个终端运行。? 表示后台运行(与终端无关)。
    STATStatus进程状态(非常关键,见下表)。
    STARTStart Time进程启动的具体时间。
    TIMECPU Time进程自启动以来实际占用 CPU 的总时间。
    COMMANDCommand启动该进程的完整命令行。
  5. 详解进程状态(STAT)

    • R (Running):正在运行,或者在运行队列中等待。

    • S (Interruptible Sleep):可中断休眠。它在等某个事件发生(比如等用户输入)。

    • D (Uninterruptible Sleep):不可中断休眠。通常在等硬盘 I/O,此时 kill -9 也杀不掉它。

    • T (Stopped):已停止(可能被手动暂停了)。

    • Z (Zombie)僵尸进程。进程已结束,但父进程还没回收它的“尸体”(信息)。

    • <:高优先级进程。

    • N:低优先级进程。

    • +:位于前台进程组。

1.3.3 终止进程kill和killall

  1. 介绍:若是一个进程执行到一半需要停止或消耗过大资源时,可以考虑停止该进程,使用kill命令即可。

  2. 基本语法

    • kill [选项] 进程号,通过进程号杀死进程
    • killall 进程名称,杀死所有该名称的进程,支持通配符
  3. 常用选项

    • -9 : 强制杀死进程
    • -15 : 默认选项,请求进程正常关闭
    • -1 : 挂起信号,通常用于让进程重新加载配置
  4. 案例

    • 踢掉某个非法登录用户

      image-20260219195930527

      ps -aux | grep sshd , 找到管理远程连接的该进程,其中 ethan [priv] 即为目标进程,终止该进程,该远程连接以及其子进程也会断掉

    • 终止远程登录服务sshd:root 7776 1 0 17:44 ? 00:00:00 /usr/sbin/sshd -D,终止该进程即可,重启该服务命令为/bin/systemctl start sshd.service

    • 终止多个gedit:killall gedit

    • 强制杀掉一个终端

      image-20260219201242816

      ps -aux | grep bash,找到所有终端,pts/ 的即为目标,可以在要杀掉的终端内输入tty命令,获取终端号,再根据其对应的进程号杀死即可,需要-9强制杀掉

1.3.4 查看进程树pstree

  1. 基本语法:pstree [选项] ,可以更加直观的来查看进程的信息

  2. 常用选项

    • -p : 显示进程PID

    image-20260228151104902

    • -u : 显示进程所属用户

    image-20260228151138687

1.3.5 服务管理

  1. 介绍:服务(service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其他程序的请求,比如(mysqld,sshd,防火墙等),因此也称为守护进程

  2. service管理指令

    • 基本语法: service 服务名 [start | stop | restart | reload | status]
    • 注意:在CentOS7.0后,很多服务不再使用 service,而是 systemctl
    • service指令管理的服务在 /etc/init.d 查看
  3. 服务管理

    • chkconfig指令(check configuration)

      • 介绍
        • 管理开机自启的指令
        • 通过chkconfig指令可以给服务的各个运行级别设置自启动/关闭,即设置该服务在某个运行级别下是自启动还是关闭
        • 该指令管理的服务可以通过 /etc/init.d 查看
        • CentOS 7.0后,很多服务使用 systemctl 管理
      • chkconfig 基本语法
        • chkconfig --list [| grep xxx] 查看服务
        • chkconfig 服务名 --list 查看特定服务
        • chkconfig --level 5 服务名 on / off
    • systemctl管理指令

      分类操作指令说明
      服务控制启动systemctl start <服务名>立即开启服务
      停止systemctl stop <服务名>立即关闭服务
      重启systemctl restart <服务名>重启服务(先关后开)
      状态systemctl status <服务名>🔍 查看运行详情、PID及最近日志
      开机自启启用systemctl enable <服务名>设置为开机后自动运行
      禁用systemctl disable <服务名>取消开机自动运行
      检查systemctl is-enabled <服务名>查询该服务是否已设为自启
      系统查询运行中systemctl list-unit-files列出磁盘上安装的服务
      失败项systemctl --failed⚠️ 快速找出启动失败的服务

      注意:systemctl管理的指令在 /usr/lib/systemd/system 查看

    • 打开或者关闭防火墙的指定端口

      firewall 指令:

      • 打开端口:firewall-cmd --permanent --add-port=端口号/协议(可以通过 netstat -anp 指令查看端口所使用的协议)。如果不加 --permanent 参数,立即生效;加了该参数需要使用 firewall-cmd --reload 指令重载才能生效。
      • 关闭端口:firewall-cmd --permanent --remove-port=端口号/协议
      • 重新载入,才能生效:firewall-cmd --reload
      • 查询端口是否开放:firewall-cmd --query-port=端口/协议

1.3.6 动态监控进程(top指令)

top指令和ps指令很相似,都用来显示正在执行的进程,top与ps最大的不同之处在于top可以实时更新正在运行的进程。top 指令是 Linux 下最常用的实时系统监控工具。它就像是 Windows 的“任务管理器”,能让你看到 CPU 占用、内存消耗以及哪些进程正在“拖慢”你的系统。

输入 top 后,界面会不断刷新(默认 3 秒一次)。我们可以把输出内容拆解为上下两个部分:


一、 上半部分:系统状态概览(System Summary)

这一部分提供了系统整体的健康报告。

  1. 第一行:任务队列信息
    • up 20 days:系统已经运行了多久。
    • load average: 0.05, 0.03, 0.05核心指标! 分别代表 1分钟、5分钟、15分钟内的系统平均负载。如果数值超过了 CPU 核心数,说明系统很忙。
  2. 第二行:进程统计 (Tasks)
    • 告诉你总共有多少进程,多少在运行(running),多少在睡眠(sleeping),多少已停止(stopped)或成了僵尸进程(zombie)
  3. 第三行:CPU 占用情况 (%Cpu(s))
    • us (user):用户进程占用 CPU 百分比。
    • sy (system):内核进程占用 CPU 百分比。
    • id (idle):空闲率。这个值越高,系统越轻松。
    • wa (iowait):等待磁盘 I/O 的时间。如果这个值很高,说明磁盘太慢了。
  4. 第四/五行:内存与交换区 (Mem / Swap)
    • 显示总内存、已用、空闲以及缓存(buff/cache)占用。

image-20260301092728965


二、 下半部分:进程详情列表

每一行代表一个进程,重要列名如下:

  • PID:进程 ID。
  • USER:进程所有者。
  • PR / NI:优先级。越小优先级越高。
  • VIRT / RES / SHR:虚拟内存、常驻内存(实际占用的物理内存)、共享内存。看内存占用主要看 RES
  • S:进程状态(S=睡眠,R=运行,Z=僵尸)。
  • %CPU / %MEM:该进程占用的 CPU 和内存百分比。
  • COMMAND:进程的名字或启动命令。

image-20260301093114876


三、 top 的交互式快捷键

top 运行期间,你可以直接按键盘来改变视图:

快捷键作用
M内存占用大小排序。
PCPU占用大小排序(默认)。
NPID排序
T按运行时间排序。
u输入用户名,查看指定用户的进程
1 (数字)展开/收起多核 CPU。查看每个核心的负载情况。
c显示完整的命令行参数(Command path)。
k杀掉进程(会提示输入 PID)。
q退出 top

四、 常用命令参数

  • top -d 1:每隔 1 秒刷新一次(默认是 3 秒)。
  • top -p 1234:只监控 PID 为 1234 的特定进程。
  • top -u root:只显示特定用户的进程。

当你发现服务器变慢时,标准流程是:

  1. load average 确认系统是否过载。
  2. %Cpu(s)id 是否太低,或者 wa 是否太高(磁盘瓶颈)。
  3. PM 找出占用资源最高的“罪魁祸首”进程。

1.3.7 监控网络状态

  1. 查看系统网络情况
    • 基本语法:netstat [选项]
    • 常用选项:
      • -a(all):列出所有的连接
      • -n(numeric):以数字形式显示地址和端口号
      • -p(programs):显示占用该链接的进程PID和进程名称
  2. 检测主机连接
    • 基本语法:ping 对方ip地址

1.4 RPM与YUM

1.4.1 RPM包的管理

  1. 介绍:rpm是用于互联网下载包的打包及安装工具,它生成具有.rpm扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似windows的setup.exe。Linux的分发版本都有采用(suse,redhat,centos 等等),可以算是公认的行业标准了。

  2. rpm包的简单查询指令

    • 查询已安装的rpm列表:rpm -qa | grep xx
  3. rpm包名基本格式

    • firefox-60.2.2-1.el7.centos.x86_64
    组成部分具体内容含义说明
    软件名称firefox程序的名称。
    主版本号60.2.2软件官方发布的版本号。通常遵循 主版本.次版本.修订号
    发布次序1这是该版本软件的第几次编译打包(由发行版维护者确定)。
    操作系统el7表示适用于 Enterprise Linux 7(即 RHEL 7 或 CentOS 7)。
    发行商centos标明这个包是由 CentOS 社区编译制作的。
    硬件架构x86_64关键信息! 表示适用于 64 位 Intel/AMD 处理器。
    • 关于硬件架构(x86_64)

      这一部分决定了你的机器能不能装这个包:

      • x86_64 / amd64:标准的 64 位系统。
      • i686 / i386:旧式的 32 位系统。
      • noarch:表示“无架构依赖”。通常是脚本(如 Python、Shell)或文档,可以在任何 CPU 上运行。
      • arm64 / aarch64:适用于手机、树莓派或苹果 M 系列芯片服务器。
    • 关于操作系统标识 (el7)

      • el7 代表 Red Hat Enterprise Linux 7 兼容系列。

      • 如果你在 CentOS 8 上看到它,通常会显示 el8

      • 注意:通常高版本的系统可以兼容低版本的包(如 el7 的包可能在 el8 运行),但反过来往往会报错。

  4. rpm包的其它查询指令

    操作命令说明
    安装rpm -ivh <包名>.rpmi安装,v显示过程,h显示进度条
    卸载rpm -e <包名>e 即 erase
    查询是否安装rpm -q <包名>查询某个特定的包
    查询所有已装rpm -qaa 即 all,常配合 grep 使用
    查询软件包信息rpm -qi 软件包名i 即 information,列出已安装软件包的详细信息
    查看文件所属rpm -qf /bin/ls看看这个文件是哪个安装包生成的

1.4.2 YUM

  1. 介绍:Yum是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

  2. yum基本指令

    操作命令说明
    安装yum install <名>自动下载并安装及其依赖
    卸载yum remove <名>删除软件包
    更新yum update更新系统中所有可升级的包
    列出可用包yum list查看仓库里有哪些软件
    搜索yum search <关键字>忘记全名时很有用
    清理缓存yum clean all当配置了新仓库但不生效时必做

1.5 配置 Java 开发环境

1.5.1 下载JDK并配置环境变量

  1. 准备工作

    我们将压缩包放在/opt/jdk目录下,解压的文件放在/local/local/下,新建文件夹。

  2. 下载JDK

    • 可以从官网下载好 .tar.gz 包,使用xftp上传;也可以使用wget下载压缩包。

    • wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz

  3. 解压到指定目录

tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz -C /usr/local/java

  1. 配置环境变量

    • 编辑全局配置文件:vi /etc/profile

    • 在文件末尾添加以下内容

      # JAVA_HOME 指向你刚才解压的目录
      export JAVA_HOME=/usr/local/java/jdk11
      # 将 Java 的 bin 目录添加到系统搜索路径中
      export PATH=$JAVA_HOME/bin:$PATH

      注意:在更改PATH变量的值时,最后需要将原有的PATH值添加上,类似于引用。

  2. 让配置立即生效

    source /etc/profile

  3. 检查配置是否成功

    java -version

    javac -version

1.5.2 下载并配置tomcat

  1. 推荐自己去官网下载tomcat所需版本,wget下载太慢
  2. 同JDK下载流程一样,把tomcat解压到/usr/local/tomcat/目录下
  3. 检查tomcat使用的端口是否开放:firewall-cmd --query-port=8080/tcp,如未开放开放即可,记得firewall-cmd --reload如果用的是云服务器(阿里云/腾讯云),记得还要在云控制台的安全组里放行 8080 端口。
  4. 启动服务:/usr/local/tomcat/tomcat9/bin/startup.sh
  5. 验证是否成功:查看端口 netstat -anp | grep 8080 或者查看进程 ps -ef | grep tomcat,打开浏览器访问一下

1.5.3 下载配置MySQL

手动安装 MySQL 是最能锻炼 Linux 基本功的任务之一。我们将按照 “下载源 -> 安装 -> 启动 -> 安全配置” 的标准流程进行。

由于 CentOS 7 默认的仓库里只有 MariaDB(MySQL 的一个分支),我们需要先告诉系统去哪里找正统的 MySQL。


第一步:添加 MySQL 官方 YUM 源

我们通过安装一个特定的 .rpm 文件来自动配置 YUM 仓库。

  1. 下载仓库设置文件(以 MySQL 8.0 为例):

    wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  2. 安装这个文件

    rpm -ivh mysql80-community-release-el7-3.noarch.rpm

    安装完后,你可以去 /etc/yum.repos.d/ 目录下看看,会多出几个 mysql-community 开头的文件。


第二步:使用 YUM 安装 MySQL

现在系统已经知道去哪找 MySQL 了,直接安装服务端:

yum install mysql-community-server -y

注意:如果安装过程中提示 GPG key retrieval failed,这是因为 GPG 密钥过期了。解决方法是在命令后加上 --nogpgcheck,即:

yum install mysql-community-server -y --nogpgcheck

第三步:启动服务并获取初始密码

  1. 启动 MySQL 服务

    systemctl start mysqld
  2. 设置开机自启(非常重要,防止服务器重启后数据库没起):

    systemctl enable mysqld
  3. 获取临时密码

    MySQL 启动后会在日志中生成一个复杂的临时密码。

    grep 'temporary password' /var/log/mysqld.log

    记下这串密码,一会儿登录要用。


第四步:登录并修改“强密码”

  1. 使用临时密码登录

    mysql -u root -p
    # 然后粘贴刚才记下的临时密码(输入时屏幕不会显示字符)
  2. 修改 root 密码

    由于 MySQL 8.0 默认有密码强度策略,你的新密码必须包含:大写字母、小写字母、数字和特殊字符,且长度不少于 8 位。

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'JavaDev@2026!';

第五步:开启远程连接(为了用 Navicat 等工具)

默认情况下,root 用户只能在 Linux 本机登录。如果你想在自己的 Windows 电脑上连接:

  1. 创建远程访问用户(或者修改现有的 root):

    -- 创建一个可以从任何 IP 登录的 root
    CREATE USER 'root'@'%' IDENTIFIED BY 'JavaDev@2026!';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
  2. 退出 MySQL:输入 exit;

  3. 开放 3306 防火墙端口

    firewall-cmd --permanent --add-port=3306/tcp
    firewall-cmd --reload

💡 核心目录总结(排错必看)

项目路径用途
配置文件/etc/my.cnf修改端口、字符集、内存设置
数据目录/var/lib/mysql最重要! 所有的数据库表文件都在这
错误日志/var/log/mysqld.log数据库起不来时,第一时间看这里

🚀 验证环节

现在,尝试在你的 Windows 电脑上打开 NavicatDBeaver,输入服务器 IP、端口 3306 和刚才设定的新密码。

1.5.4 下载配置Nginx

Nginx 通常作为“门面”,负责处理 HTTPS、静态资源和请求转发。

根据你的环境(CentOS 7),我们依然采用官方源的手动安装方式,这样最稳定。


第一步:添加 Nginx 官方源

CentOS 默认仓库的 Nginx 版本通常比较旧,建议使用官方 Repo。

  1. 安装实用工具

    yum install -y yum-utils
  2. 创建配置文件

    执行 vi /etc/yum.repos.d/nginx.repo,粘贴以下内容:

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

第二步:安装与启动

  1. 执行安装

    yum install -y nginx
  2. 启动并设置开机自启

    systemctl start nginx
    systemctl enable nginx
  3. 放行防火墙

    Nginx 默认使用 80 端口。

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

    此时在浏览器输入你的服务器 IP,看到 "Welcome to nginx!" 页面就说明安装成功了。


第三步:配置反向代理(对接 Tomcat)

这是后端开发最核心的配置。我们要实现:访问 http://IP,实际上是 Nginx 去找 http://localhost:8080(Tomcat)。

  1. 找到配置文件/etc/nginx/conf.d/default.conf

  2. 修改 server 块(建议先备份):

    Nginx

    server {
        listen       80;
        server_name  localhost;
    
        location / {
            proxy_pass http://localhost:8080; # 转发给 Tomcat
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
  3. 检查语法并重启

    Bash

    nginx -t            # 如果显示 syntax is ok,说明配置没写错
    systemctl restart nginx

第四步:核心目录说明

路径用途
/etc/nginx/nginx.conf主配置文件,通常不需要动
/etc/nginx/conf.d/子配置目录,每个项目建议建一个 .conf 文件
/usr/share/nginx/html/静态资源目录,存放 HTML、Vue 打包后的文件
/var/log/nginx/日志目录access.log 看访问量,error.log 排查报错

💡 后端实战小贴士

  • 解决 403 Forbidden:如果你在 Nginx 里放了图片但访问不了,通常是 SELinux 拦截了。临时关闭命令:setenforce 0
  • 动静分离
    • .jsp/api 请求转发给 Tomcat。
    • .jpg.css.js 直接由 Nginx 处理,速度会提升数倍。

🚀 避坑指南:80 端口占用

如果 Nginx 启动失败,报错 bind() to 0.0.0.0:80 failed (98: Address already in use)

  1. 执行 netstat -tunlp | grep 80 查看是谁占了 80 端口。
  2. 如果是之前为了测试把 Tomcat 改成了 80 端口,记得改回 8080,让 Nginx 守住 80 这个大门。

1.6 Ubuntu

1.6.1 APT

  1. APT 是 Ubuntu 的软件包管理器,类似于CentOS的yum。

  2. APT基本指令

    分类指令说明备注
    更新与升级sudo apt update更新软件源。读取源列表,同步最新的软件包信息。安装或升级前必做
    sudo apt upgrade升级已安装的软件。将系统所有包更新到最新版本。不会删除已安装的包
    sudo apt full-upgrade全系统升级。升级的同时会根据依赖关系删除旧包。升级内核或大版本时使用
    安装与删除sudo apt install <包名>安装软件包。自动处理并安装相关依赖。
    sudo apt remove <包名>卸载软件包。保留配置文件。
    sudo apt purge <包名>彻底卸载。删除软件包及其所有配置文件。推荐想清空环境时使用
    sudo apt install ./<文件名>.deb安装本地 .deb 文件。并自动补全缺失依赖。替代旧的 dpkg -i
    搜索与查询apt search <关键词>搜索软件包。在仓库中查找包含关键词的包。不需要 sudo
    apt show <包名>显示详情。查看包的版本、大小、依赖、描述等。不需要 sudo
    apt list --installed列出已安装。查看当前系统中所有已安装的软件。
    apt list --upgradeable列出可升级。查看哪些软件有新版本。
    清理与维护sudo apt autoremove自动清理。删除不再需要的孤立依赖包。卸载软件后建议运行
    sudo apt clean清理缓存。删除 /var/cache/apt/archives 下的安装包。节省磁盘空间
    sudo apt edit-sources编辑源列表。直接打开 /etc/apt/sources.list

​ 注意:apt更适合命令行交互使用,apt-get等适合shell脚本使用

  1. 更新Ubuntu软件下载地址
    • 备份 cp /etc/apt/sources.list /etc/apt/sources.list.backup
    • 寻找镜像源
    • 修改 /etc/apt/sources.list 文件,将镜像源替换掉
    • 更新源:sudo apt-get update

1.6.2 远程登录

  1. SSH
    • SSH为Secure Shell的缩写,为建立在应用层和传输层基础上的安全协议。
    • SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。常用于远程登录,几乎所有的 Unix/Linux 平台都可运行SSH
    • 使用SSH服务,需要安装相应的服务器和客户端。如果A机器想被B机器远程控制,那么A机器要装SSH服务器,B机器要装SSH客户端。
    • Ubuntu默认没有安装SSHD服务,需要手动安装
  2. 安装SSH和启用服务
    • 安装:sudo apt-get install openssh-server ,会将服务端和客户端都安装上
    • 启用服务:systemctl start sshd
  3. Linux主机登录到其他Linux主机
    • 本机需要安装并启用SSH服务
    • 命令:ssh 用户名@ip地址

1.7 日志管理

1.7.1 日志介绍和实例

  1. 基本介绍

    image-20260302190850415

  2. 系统日志文件的保存位置在 /var/log/

    image-20260302191048324

  3. 系统常用日志

    日志文件路径主要用途核心价值
    /var/log/messages系统核心日志记录系统启动、外设插入、内核通知等全局信息。排查硬件或底层服务报错的首选。
    /var/log/secure安全与认证日志记录所有 SSH 登录、密码修改、sudo 执行记录。被黑或登录失败看这里。
    /var/log/mysqld.logMySQL 运行日志记录数据库启动、崩溃、初始临时密码及各种 SQL 错误。
    /var/log/cron定时任务日志检查 crontab 计划任务是否按时执行,是否有执行报错。
    /var/log/maillog邮件系统日志记录 postfix、sendmail 等邮件服务的发送和接收状态。
    /var/log/boot.log系统启动日志记录系统开机自检、服务自启动的具体过程。
    /var/log/dmesg内核缓冲日志记录硬件驱动初始化信息。输入 dmesg 命令可直接查看。
    /var/log/lastlog最后登录日志记录系统中所有用户最后一次登录的时间(需用 lastlog 命令查看)。

1.7.2 日志管理服务 rsyslogd

  1. 配置文件: /etc/rsyslog.conf,编辑文件时的格式是 : *.* ,第一个*代表日志类型,第二个*代表日志级别

  2. 日志类型分为:

    image-20260302192638786

  3. 日志级别分为:

    image-20260302192550251

  4. 由日志服务 rsyslogd 记录的日志文件,格式包含以下4列:

    • 事件产生的时间
    • 产生事件的服务器的主机名
    • 产生事件的服务名或程序名
    • 事件的具体信息

    image-20260302193109481

  5. 自定义日志服务

    • /etc/rsyslog.conf 后面仿照前面格式添加即可,自定义记录什么类型、什么级别的日志,自定义写入到哪个文件

1.7.3 日志轮替

  1. 基本介绍:日志轮替就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围后,就会进行删除。大白话说就是,旧的日志文件存不下来,建一个新的日志文件,并且旧的日志文件到了一定条件(如超过一定时间)会被删除。

  2. 日志轮替全局配置文件:/etc/logrotate.conf,也可以把某个日志文件的轮替规则,写到 /etc/logrotate.d 目录,单独配置的轮替规则优先级更高

    image-20260302210147587

  3. 日志轮替配置文件参数说明

    image-20260302210415807

  4. 把自己的日志加入日志轮替

    • 可以在全局配置文件中加入自己配置文件的策略,但不推荐,日志文件多了以后维护困难

    • /etc/logrotate.d 目录中添加自己配置文件的规则【推荐】

      image-20260302211006712

1.7.4 查看内存日志

  1. 内存日志是写在内存中的,重启系统会清空,用来记录当前系统内核和各服务信息。

  2. 常用指令

    需求命令
    查看所有日志journalctl
    实时滚动查看journalctl -f
    查看本次开机后的日志journalctl -b
    查看特定服务的日志journalctl -u mysqld
    按时间过滤journalctl --since "2026-03-02 12:00:00"
    查看内核日志journalctl -k

1.8 安装配置docker

1.8.1 docker本体

第一步:卸载旧版本

如果系统之前安装过旧版本的 Docker(可能叫 dockerdocker-engine),请先清理干净:

Bash

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

第二步:安装基础依赖与软件源

为了确保安装过程顺利,我们需要安装 yum-utils 并添加 Docker 的官方仓库。

  1. 安装必要工具

    Bash

    sudo yum install -y yum-utils
  2. 添加 Docker 软件源(推荐使用阿里云镜像源,速度更快):

    Bash

    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

第三步:安装 Docker 引擎

这里我们安装的是社区版(Docker CE)。

Bash

sudo yum install -y docker-ce docker-ce-cli containerd.io

第四步:启动并设置开机自启

安装完成后,Docker 默认是不运行的。

Bash

sudo systemctl start docker    # 启动 Docker
sudo systemctl enable docker   # 设置开机自启

验证安装:输入 docker version,看到 Client 和 Server 信息说明安装成功。


第五步:核心配置——镜像加速器 (重要 🚀)

在国内直接拉取镜像(如 docker pull mysql)通常会非常慢甚至超时。我们需要配置国内镜像站(如阿里云、网易等)。

  1. 创建配置目录

    Bash

    sudo mkdir -p /etc/docker
  2. 编写配置文件

    执行 vi /etc/docker/daemon.json,粘贴以下内容(这里以阿里云加速器为例):

    JSON

    {
      "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://noohub.net"
      ]
    }
  3. 重启服务生效

    Bash

    sudo systemctl daemon-reload
    sudo systemctl restart docker

💡 Docker 常用“保命”指令

指令说明备注
docker pull <镜像名>从仓库下载镜像比如 docker pull nginx
docker ps查看当前运行中的容器相当于 Linux 的 ps -ef
docker ps -a查看所有容器(含已停止的)
docker images查看本地已有的镜像
docker logs -f <容器ID>实时滚动查看容器日志后端查报错神器
docker exec -it <ID> /bin/bash进入容器内部进行操作就像 SSH 进另一台机器

🚀 避坑指南:权限问题

如果你不想每次执行 docker 命令都加 sudo,可以将你的当前用户加入 docker 组:

Bash

sudo usermod -aG docker $USER

执行后需要重新连接 SSH(或者重新登录)才会生效。

1.8.2 Docker使用

使用流程: pull 安装镜像 + run 创建容器 即可使用

  1. images有关操作 C: docker pull image(镜像名) R: docker images D: docker rmi image(镜像名)

  2. 容器相关操作 // 创建容器时,如果没有找到对应镜像,docker会主动拉取镜像 C: docker run [-p 宿主机端口:容器端口 端口映射] [-d 分离模式,在后台启动容器,不占用当前docker窗口] [-- name 自己取的名字] [-it 进入容器控制台交互] [-v 宿主机目录:容器目录 文件(挂载卷)映射,将docker的数据保存到宿主机里,有利于数据的持久化保存] [-e 配置容器默认环境变量,比如为MongoDB启动时默认设置账户密码]

    ​ [--network 网络 创建容器时加入该网络]

    ​ [-- rm 当容器停止时就删除掉容器 一般用于测试是否可行,为正式使用做准备] ​ [-- restart [always 容器停止即立即重启,处理意外情况] [unless-stopped 除非手动停止容器,否则容器停止 ​ 立即重启]] image(镜像名称) ​ R: docker ps [-a 查看当前所有的包括没有正在运行的容器] ​ docker inspect 容器 查看创建的容器信息,直接粘给AI分析即可 ​ docker logs [-f flow滚动查看日志] 容器 ​ U: docker start 容器 ​ docker stop 容器

​ D: docker rm [-f 删除正在运行的容器,需要强制删除]

​ docker exec -it 容器 bash

  1. 挂载卷相关操作

    • docker volume create:创建数据卷
    • docker volume ls:查看所有数据卷
    • docker volume rm:删除指定数据卷
    • docker volume inspect:查看某个数据卷的详情
    • docker volume prune:清除所有未使用的数据卷

教程网址: https://www.bilibili.com/video/BV1THKyzBER6/?spm_id_from=333.337.search-card.all.click&vd_source=527b92fbdcc76c5d20effa2f5f320e52

image-20260304182248910

1.8.3 制作MySQL容器

bash
docker run -d \
  --name mysql-server \
  -p 3307:3306 \
  -e MYSQL_ROOT_PASSWORD=your_password \
  -v /opt/mysql/data:/var/lib/mysql \   # 数据
  -v /opt/mysql/conf:/etc/mysql/conf.d \  # 配置文件
  -v /opt/mysql/init:/docker-entrypoint-initdb.d \  # 初始化脚本
  mysql:8.0

1.8.4 自定义docker镜像

  1. 镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

  2. 构建一个Java镜像的步骤

    • 准备一个Linux运行环境
    • 安装JDK并配置环境变量
    • 拷贝Jar包
    • 编写运行脚本
  3. 镜像结构:添加安装包、依赖、配置等,每次操作都形成新的一层

    image-20260306120720605

  4. Dockerfile

    • Dockerfile 是一个文本文件,包含了构建镜像所需的全部指令,通过执行 docker build 命令,dokcer就会根据该文件,生成镜像,后续通过 docker save 保存镜像文件,将其传递给其他用户。其他用户使用 docker load 命令即可获得该镜像。

    • 常见指令:

      image-20260306121853006

    • 案例:写Dockerfile文件,构建Java应用镜像

      image-20260306122010000

      image-20260306122125633

1.8.5 docker网络

  1. 默认情况下,所有容器都是以桥接方式连接到Docker的一个虚拟网桥上(安装自带),所有的容器和该虚拟网桥处于同一网段内,可以互相通信,那么容器间通信就可以走内网IP,安全型、性能都会提高,成本也会降低。但是有个问题,如果使用容器的内网IP进行通信的话,容器一旦关闭重启,那么其所对应的IP就需要更改,很麻烦,这时就需要搭建一个docker网络。

  2. docker网络常用命令

    image-20260306142750529

  3. 在同一个docker网络中,通信时,可以使用主机名,docker DNS服务会将主机名替换为对应IP

1.8.6 Docker Compose

  1. Docker Compose 通过一个单独的 docker-compose.yml 模版文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

  2. YAML 基础语法规范

在编写 .yml 文件时,缩进就是一切:

  • 缩进:必须使用空格,不能用 Tab。通常缩进 2 个空格。
  • 冒号:所有键值对的冒号后必须加一个空格(如 image: mysql)。
  • 列表:使用短横线 - 开头,横线后也要加空格。
  • 大小写:YAML 对大小写敏感。

  1. Docker Compose 核心配置指令
指令作用备注
version指定 Compose 文件的版本建议使用 "3.8" 或更高版本。
services定义你要启动的容器集合每一个子项代表一个容器。
image指定容器使用的镜像mysql:8.0
container_name手动指定容器名称方便在 docker ps 中查看。
ports宿主机与容器的端口映射格式为 宿主机端口:容器端口
volumes数据卷挂载(持久化数据)格式为 宿主机路径:容器路径
environment设置环境变量比如 MySQL 的密码配置。
networks定义容器所属的网络方便容器间通过名称互相访问。
depends_on定义容器启动顺序比如 App 必须等 MySQL 启动后再启动。

  1. 实战模版:Nginx + App + MySQL 三合一

你可以直接将以下内容保存为 docker-compose.yml

YAML
version: "3.8"

services:
  # 1. 数据库服务
  db:
    image: mysql:8.0
    container_name: mysql-prod
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "你的密码"
      MYSQL_DATABASE: "你的库名"
    volumes:
      - /opt/mysql/data:/var/lib/mysql
    # 注意:为了安全,这里不配置 ports 映射到公网
    networks:
      - app-tier

  # 2. 后端应用服务
  myapp:
    image: myapp:1.0
    /*
    可以使用以下构建镜像的方式实现
    build:
      context: . # Dockerfile 位置
      dockerfile: Dockerfile # Dockerfile名称
    */
    container_name: myapp-prod
    restart: always
    depends_on:
      - db
    environment:
      # 重点:利用容器名解析 IP,端口写 3306 即可
      - DB_HOST=db
      - DB_PORT=3306
    networks:
      - app-tier

  # 3. Nginx 代理服务
  nginx:
    image: nginx:latest
    container_name: nginx-prod
    restart: always
    ports:
      - "80:80"    # 唯一对外开放的端口
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - myapp
    networks:
      - app-tier

# 定义网络,实现内网互通
networks:
  app-tier:
    driver: bridge
    name: weiqiang

  1. 常用管理命令

docker-compose.yml 所在的目录下执行:

  • 启动所有服务docker compose up -d-d 表示后台运行)。
  • 停止并删除容器docker compose down(这会清理掉网络,但挂载的数据卷不会掉)。
  • 查看运行状态docker compose ps
  • 查看某个服务的日志docker compose logs -f myapp

💡 避坑笔记

  1. 相对路径:在 volumes 中,可以使用 ./ 表示当前目录。
  2. 环境变量保护:敏感的密码建议写在同目录下的 .env 文件里,然后在 .yml 中引用,防止密码泄露到 Git 仓库。
  3. 内网 DNS:在 myapp 中连接数据库时,Host 必须写 services 下定义的名称(如上面的 db),而不是容器名。