1. 环境准备与工具选型背后的逻辑
1.1 为什么是这套组合:CentOS 7 + Xshell + Xftp
先把场景说清楚。手头有一台本地虚拟机,跑的是 CentOS 7 系统,日常开发或者学习时需要把本地写好的文件传到虚拟机里,还要在虚拟机上装 JDK、Tomcat、MySQL 这套经典的 Java Web 运行环境。这个流程在几年前几乎是每个 Java 后端入门的必修课,即便现在容器化很流行,理解这套底层操作依然有价值,因为很多企业的遗留系统、内网测试环境还是这么跑的。
工具层面,Xshell 负责终端连接,Xftp 负责文件传输,两者配合使用体验很顺。为什么不用系统自带的终端或者别的工具?因为 Xshell 支持会话管理、多标签、日志记录、快捷键自定义,长时间操作比系统终端舒服很多。Xftp 则是图形化的 SFTP 客户端,拖拽上传、断点续传、权限修改都很直观,比命令行 scp 更适合频繁传文件的场景。
CentOS 7 这个版本值得单独提一句。它的生命周期已经进入尾声,但大量教程、生产环境、考试环境仍然基于它,原因是稳定、软件包版本保守、社区资料极其丰富。新手拿它练手,遇到问题几乎都能搜到答案,这是它最大的优势。
1.2 虚拟机网络模式的选择与影响
在连接之前,有个容易被忽略但极其关键的环节:虚拟机的网络模式。常见的有 NAT、桥接、仅主机三种。选错了,Xshell 根本连不上。
- NAT 模式:虚拟机和宿主机共享一个网络出口,虚拟机会被分配一个内网 IP,宿主机可以访问虚拟机,虚拟机也能访问外网。缺点是局域网内其他机器访问不到这台虚拟机。适合个人学习。
- 桥接模式:虚拟机会像一台独立设备一样接入物理网络,获得和宿主机同网段的 IP,局域网内其他设备可以直接访问。适合需要模拟真实服务器的场景。
- 仅主机模式:虚拟机和宿主机组成一个封闭网络,虚拟机不能上外网。适合纯隔离测试。
我个人的建议是:如果只是自己学习,NAT 模式最省事,不用操心 IP 冲突;如果想让手机或者其他电脑也能访问虚拟机上的服务,那就用桥接。选好模式后,记得在虚拟机里用ip addr或者ifconfig确认一下 IP 地址,后面 Xshell 连接要用。
提示:CentOS 7 最小化安装默认可能没有
ifconfig命令,用ip addr更稳妥。如果网卡没起来,检查/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT是否改成了yes。
1.3 连接前的检查清单
动手连之前,花两分钟做几个检查,能省掉后面半小时的排查时间。
- 虚拟机是否已经开机,并且网络适配器已连接。
- 虚拟机 IP 地址是否确认,能否在宿主机 ping 通。
- SSH 服务是否运行,CentOS 7 默认装了 OpenSSH,但防火墙可能挡着。
- 防火墙状态,
systemctl status firewalld看一下,如果开着,22 端口是否放行。 - 登录用的账号密码是否记得,root 账号是否允许远程登录。
这几项里,防火墙和 SSH 配置是最容易出问题的。很多人连不上第一反应是 Xshell 有问题,其实八成是虚拟机这边防火墙没放行,或者 sshd 服务没启动。
2. Xshell 远程连接 CentOS 7 的完整实操
2.1 新建会话与关键参数填写
打开 Xshell,点左上角新建会话,弹出配置窗口。这里有几个参数必须填对:
- 名称:随便起,建议用“CentOS7-学习”这种能一眼看懂的。
- 协议:选 SSH,端口默认 22。如果之前改过 sshd 端口,这里要对应改。
- 主机:填虚拟机的 IP 地址,比如 192.168.1.100。
- 端口:22。
填完这些,先别急着连,点左侧的“用户身份验证”。这里填登录虚拟机的用户名和密码。用户名一般是 root,或者你自己创建的普通用户。密码就是对应的登录密码。填好后点确定保存。
注意:如果虚拟机里 root 账号不允许远程登录(有些安全加固会禁用),你需要先用普通用户登录,再
su -切到 root,或者修改/etc/ssh/sshd_config里的PermitRootLogin参数。
2.2 首次连接的主机密钥确认
第一次连接某台主机时,Xshell 会弹出一个窗口,提示“SSH 安全警告”,让你确认主机密钥。这是 SSH 协议的正常机制,用来防止中间人攻击。你确认 IP 没错,点“接受并保存”就行。保存之后,下次再连就不会弹了。
如果哪天虚拟机的系统重装了,或者 SSH 密钥变了,Xshell 会再次弹窗并提示密钥不匹配。这时候不要慌,去 Xshell 的“工具”菜单里找到“主机密钥管理”,把旧的那条删掉,重新连接即可。
2.3 连接成功后的基础环境确认
连上之后,你会看到一个命令行界面,提示符大概是[root@localhost ~]#。先跑几条命令确认环境:
# 查看系统版本 cat /etc/redhat-release # 查看内核版本 uname -r # 查看 IP 地址 ip addr # 查看磁盘空间 df -h # 查看内存 free -h这几条命令能让你对这台虚拟机的状态心里有数。特别是磁盘空间,后面装 JDK、Tomcat、MySQL 都要占地方,如果根分区只剩几百兆,那得先扩容或者清理。
2.4 连接不稳定时的排查思路
有时候连上了,但操作一会儿就卡住或者断开。常见原因有几个:
- 虚拟机内存太小:CentOS 7 图形界面至少 2G 内存,命令行 1G 勉强够。如果只有 512M,跑起来会很吃力。
- 宿主机资源紧张:宿主机同时跑太多程序,虚拟机抢不到 CPU 和内存。
- 网络模式问题:NAT 模式下宿主机网络波动会影响虚拟机。
- SSH 超时设置:可以在 Xshell 会话属性里把“保持活动”勾上,每隔几十秒发个空包,防止被防火墙断开。
我自己的经验是,给虚拟机分配 2 核 CPU、2G 内存、40G 硬盘,跑这套环境比较舒服。低于这个配置,装 MySQL 的时候可能会卡到怀疑人生。
3. Xftp 文件上传与目录规划
3.1 Xftp 连接与界面速览
Xftp 的连接配置和 Xshell 几乎一样,新建会话,填 IP、端口、用户名、密码。连上之后,界面分成左右两栏:左边是本地文件系统,右边是远程虚拟机的文件系统。中间有上传、下载、传输队列等按钮。
这个双栏设计很直观,左边找到文件,右边找到目标目录,双击或者拖拽就能传。传输过程中底部会显示进度和速度,大文件还能看到剩余时间。
3.2 上传前的目录规划建议
很多人传文件是随手拖到/root或者/tmp,当时方便,后面找起来费劲。我建议提前规划好目录结构,比如:
/opt/software:放各种安装包,JDK、Tomcat、MySQL 的压缩包都扔这里。/opt/module:放解压后的软件目录,JDK、Tomcat 解压到这里。/opt/data:放 MySQL 的数据文件,方便单独备份和迁移。/opt/logs:放 Tomcat 等应用的日志。
这样规划的好处是,所有第三方软件集中管理,不会和系统自带的文件混在一起。以后要卸载或者迁移,直接删对应目录就行,干净利落。
# 在虚拟机上提前创建好目录 mkdir -p /opt/software /opt/module /opt/data /opt/logs3.3 上传操作与权限处理
把本地下载好的 JDK、Tomcat、MySQL 安装包通过 Xftp 拖到/opt/software目录。传输完成后,在 Xshell 里ls -lh看一下文件大小是否和本地一致,防止传输中断导致文件损坏。
有时候上传会报权限错误,这是因为目标目录当前用户没有写权限。解决办法有两个:一是用 root 账号连接 Xftp,二是提前给目录赋权。我一般直接用 root 操作,省事。
提示:Xftp 传输大文件时,如果中途网络断了,重新连接后可以尝试续传。但为了保险,传完后用
md5sum对比一下本地和远程的文件校验值,确保文件完整。
3.4 文件传输的替代方案与对比
虽然 Xftp 图形化很方便,但有些场景下命令行更高效。比如批量传大量小文件,或者需要在脚本里自动化传输,这时候scp和rsync更合适。
| 方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Xftp | 日常零散文件传输 | 图形化,拖拽方便,支持断点续传 | 需要额外开图形界面 |
| scp | 单次传输少量文件 | 命令简单,系统自带 | 不支持断点续传,大文件中断要重来 |
| rsync | 大量文件同步、增量传输 | 增量传输,速度快,可保留权限 | 参数较多,需要学习 |
我个人的习惯是:装环境这种一次性传几个大压缩包的场景,用 Xftp 最舒服;如果是日常开发中频繁同步代码或者配置文件,用 rsync 写个脚本更省心。
4. JDK 安装与环境变量配置
4.1 选择哪个 JDK 版本
标题里写的是“jdk4”,这个说法其实不太准确。JDK 的版本命名经历过几次变化,早期有 JDK 1.4、JDK 5、JDK 6 这种叫法,后来改成 JDK 8、JDK 11、JDK 17 这种。如果真的是 JDK 1.4,那已经是二十多年前的版本了,现在几乎没人用,而且很多新软件也不支持。
结合 Tomcat 和 MySQL 这套组合,我推测实际场景大概率是JDK 8,因为 JDK 8 是 Java Web 开发里最经典、最稳定的版本,Tomcat 7/8/9 和 MySQL 5.7/8.0 都跟它配合得很好。下面我就以 JDK 8 为例来写,如果你确实需要其他版本,把下载链接和目录名换掉即可,步骤完全一样。
4.2 安装包上传与解压
假设你已经通过 Xftp 把jdk-8uXXX-linux-x64.tar.gz传到了/opt/software。接下来在 Xshell 里操作:
# 进入软件目录 cd /opt/software # 解压到 /opt/module tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /opt/module/ # 查看解压结果 ls /opt/module/解压完成后,/opt/module下会多出一个类似jdk1.8.0_XXX的目录。为了后续配置方便,可以给它改个短一点的名字:
mv /opt/module/jdk1.8.0_XXX /opt/module/jdk8这样以后引用路径就是/opt/module/jdk8,简洁明了。
4.3 环境变量配置的两种方式
配置 JDK 环境变量,本质上是告诉系统去哪里找java、javac这些命令。有两种常见做法:
方式一:修改/etc/profile,对所有用户生效。适合这台机器上多个用户都需要用 JDK 的场景。
# 编辑 profile 文件 vi /etc/profile # 在文件末尾添加以下内容 export JAVA_HOME=/opt/module/jdk8 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar方式二:修改用户目录下的~/.bash_profile,只对当前用户生效。适合多用户环境下各用各的 JDK 版本。
两种方式选一种即可,改完后执行source /etc/profile或者重新登录,让配置生效。
注意:
CLASSPATH里的.表示当前目录,这个不能少,否则运行某些 Java 程序时会找不到当前目录下的类文件。另外$JAVA_HOME/bin要放在$PATH前面,避免系统自带的旧版本 java 被优先找到。
4.4 验证安装与常见报错
配置完成后,跑几条命令验证:
# 查看 java 版本 java -version # 查看 javac 版本 javac -version # 查看 JAVA_HOME echo $JAVA_HOME如果java -version输出的版本和你装的一致,说明配置成功。如果提示command not found,检查PATH是否写对,JAVA_HOME路径是否存在。
常见报错还有一个:Error: could not open .../lib/...,这通常是CLASSPATH配置有问题,或者 JDK 解压不完整。重新解压一遍,仔细核对路径。
5. Tomcat 部署与启动验证
5.1 Tomcat 版本选择与解压
Tomcat 的版本和 JDK 版本有对应关系。大致来说:
- Tomcat 7 支持 JDK 6 及以上
- Tomcat 8 支持 JDK 7 及以上
- Tomcat 9 支持 JDK 8 及以上
- Tomcat 10 开始使用 Jakarta EE 命名空间,和旧项目兼容性要注意
既然我们装的是 JDK 8,选 Tomcat 8 或者 Tomcat 9 都可以。Tomcat 9 更现代一些,推荐用它。
# 解压 Tomcat cd /opt/software tar -zxvf apache-tomcat-9.0.XX.tar.gz -C /opt/module/ # 改名 mv /opt/module/apache-tomcat-9.0.XX /opt/module/tomcat95.2 启动 Tomcat 与端口检查
Tomcat 的启动脚本在bin目录下:
cd /opt/module/tomcat9/bin ./startup.sh启动后,用ps或者netstat确认进程和端口:
# 查看 Tomcat 进程 ps -ef | grep tomcat # 查看 8080 端口是否监听 netstat -tlnp | grep 8080如果 8080 端口没起来,去看logs/catalina.out日志,里面会有具体报错。最常见的原因是 JDK 环境变量没配好,Tomcat 找不到 Java。
5.3 防火墙放行与浏览器访问
Tomcat 默认监听 8080 端口,但 CentOS 7 的防火墙默认可能没放行这个端口。需要在虚拟机上执行:
# 放行 8080 端口 firewall-cmd --zone=public --add-port=8080/tcp --permanent # 重新加载防火墙配置 firewall-cmd --reload # 查看已放行的端口 firewall-cmd --list-ports然后在宿主机的浏览器里访问http://虚拟机IP:8080,如果看到 Tomcat 的欢迎页面,说明部署成功。
提示:如果访问不了,先确认虚拟机和宿主机之间网络是否通,再确认防火墙是否放行,最后看 Tomcat 日志。这三步能解决 90% 的访问问题。
5.4 配置 Tomcat 开机自启
每次手动启动 Tomcat 太麻烦,可以配置成系统服务,开机自动启动。创建一个 service 文件:
vi /etc/systemd/system/tomcat.service写入以下内容:
[Unit] Description=Tomcat Service After=network.target [Service] Type=forking Environment=JAVA_HOME=/opt/module/jdk8 ExecStart=/opt/module/tomcat9/bin/startup.sh ExecStop=/opt/module/tomcat9/bin/shutdown.sh [Install] WantedBy=multi-user.target然后执行:
systemctl daemon-reload systemctl enable tomcat systemctl start tomcat这样 Tomcat 就会随系统启动,管理起来也方便。
6. MySQL 安装与初始化配置
6.1 安装方式选择:Yum 还是二进制包
MySQL 在 CentOS 7 上有几种安装方式:
- Yum 安装:最简单,一条命令搞定,但版本可能比较旧,而且 CentOS 7 默认源里是 MariaDB,不是 MySQL。
- 二进制包安装:下载官方编译好的 tar.gz 包,解压配置即可,版本可控,适合学习。
- RPM 包安装:下载官方 RPM 包,用
rpm或yum localinstall安装,管理方便。
我推荐用二进制包安装,因为过程透明,能学到东西,而且版本可以自己选。下面以 MySQL 5.7 为例。
6.2 卸载冲突软件与依赖检查
CentOS 7 默认可能装了 MariaDB,会和 MySQL 冲突,先检查并卸载:
# 查看是否安装了 mariadb rpm -qa | grep mariadb # 如果有,卸载掉 rpm -e --nodeps mariadb-libs-XXX另外,MySQL 运行需要libaio库,先确认是否安装:
rpm -qa | grep libaio如果没有,用yum install -y libaio装上。
6.3 解压、用户创建与目录授权
# 解压 MySQL 到 /opt/module cd /opt/software tar -xvf mysql-5.7.XX-linux-glibc2.12-x86_64.tar.gz -C /opt/module/ # 改名 mv /opt/module/mysql-5.7.XX-linux-glibc2.12-x86_64 /opt/module/mysql57 # 创建 mysql 用户组和用户 groupadd mysql useradd -r -g mysql mysql # 创建数据目录并授权 mkdir -p /opt/data/mysql chown -R mysql:mysql /opt/module/mysql57 chown -R mysql:mysql /opt/data/mysql用专门的 mysql 用户运行数据库,是安全实践的基本要求。不要用 root 跑数据库,万一被攻破,影响范围会小很多。
6.4 初始化数据库与配置文件
# 进入 MySQL 目录 cd /opt/module/mysql57 # 初始化数据库 bin/mysqld --initialize --user=mysql --basedir=/opt/module/mysql57 --datadir=/opt/data/mysql初始化完成后,会生成一个临时密码,在输出日志里能找到,类似A temporary password is generated for root@localhost: XXXX。这个密码要记下来,第一次登录要用。
接下来创建配置文件/etc/my.cnf:
[mysqld] basedir=/opt/module/mysql57 datadir=/opt/data/mysql socket=/tmp/mysql.sock port=3306 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] socket=/tmp/mysql.sock default-character-set=utf8mb4字符集设成utf8mb4是为了支持完整的 Unicode,包括 emoji。如果用默认的latin1,中文会乱码。
6.5 启动 MySQL 与修改初始密码
# 启动 MySQL cd /opt/module/mysql57 bin/mysqld_safe --user=mysql & # 登录 bin/mysql -uroot -p # 输入临时密码后,修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; # 允许 root 从任意主机连接(可选,学习环境方便) UPDATE mysql.user SET Host='%' WHERE User='root'; FLUSH PRIVILEGES;改完密码后,退出重新登录,验证新密码是否生效。
注意:生产环境不要开放 root 远程登录,应该创建专门的用户并授予最小必要权限。学习环境图方便可以开,但心里要有数。
6.6 防火墙放行与远程连接测试
和 Tomcat 一样,MySQL 的 3306 端口也需要防火墙放行:
firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload然后在宿主机上用 MySQL 客户端工具连接虚拟机的 3306 端口,测试是否能连上。如果连不上,检查防火墙、MySQL 用户权限、以及my.cnf里是否绑定了127.0.0.1。
7. 常见问题速查与避坑经验
7.1 连接类问题排查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| Xshell 连接超时 | 虚拟机 IP 不对、网络不通 | 宿主机 ping 虚拟机 IP |
| 连接被拒绝 | SSH 服务未启动、端口不对 | systemctl status sshd,检查端口 |
| 密码正确但登录失败 | root 禁止远程登录 | 检查sshd_config的PermitRootLogin |
| 连接后频繁断开 | 网络不稳定、SSH 超时 | 开启 Xshell 保持活动功能 |
| Xftp 上传报权限错误 | 目标目录无写权限 | 用 root 连接或提前赋权 |
7.2 软件安装类问题排查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| java 命令找不到 | 环境变量未生效 | source /etc/profile,检查 PATH |
| Tomcat 启动后 8080 不通 | 防火墙未放行 | firewall-cmd --list-ports |
| Tomcat 启动报 JAVA_HOME 错误 | JDK 路径配置不对 | 检查setclasspath.sh里的 JAVA_HOME |
| MySQL 初始化失败 | 数据目录非空、权限不对 | 清空数据目录,检查属主 |
| MySQL 中文乱码 | 字符集不是 utf8mb4 | 检查my.cnf配置 |
| MySQL 远程连不上 | 用户 Host 限制、防火墙 | 检查 user 表 Host 字段和防火墙 |
7.3 我踩过的几个坑
第一个坑是虚拟机 IP 会变。NAT 模式下,虚拟机重启后 DHCP 可能分配一个新 IP,Xshell 里存的旧会话就连不上了。解决办法是把虚拟机网卡配置成静态 IP,在/etc/sysconfig/network-scripts/ifcfg-ens33里设置BOOTPROTO=static,然后手动指定 IP、网关、DNS。
第二个坑是SELinux 拦截。CentOS 7 默认开启 SELinux,有时候防火墙放行了,但 SELinux 还是挡着。临时关闭可以用setenforce 0,永久关闭改/etc/selinux/config里的SELINUX=disabled。不过生产环境不建议直接关,应该配置相应的策略。
第三个坑是Tomcat 启动慢。第一次启动 Tomcat 时,可能会卡在Deploying web application directory很久,这是因为熵池不够。可以装rng-tools或者配置java.security里的随机源来解决。学习环境忍一忍就过去了,生产环境要处理。
第四个坑是MySQL 密码策略。MySQL 5.7 默认有密码强度要求,如果设的密码太简单,会报Your password does not satisfy the current policy requirements。可以临时降低策略,或者直接设一个复杂点的密码。
7.4 环境搭建完成后的验证清单
全部装完后,按这个清单过一遍,确保每个环节都正常:
- Xshell 能正常连接虚拟机,执行命令无卡顿。
- Xftp 能正常上传下载文件。
java -version输出正确版本。javac -version输出正确版本。- Tomcat 进程存在,8080 端口监听,浏览器能访问欢迎页。
- MySQL 进程存在,3306 端口监听,能本地登录。
- 防火墙放行了 8080 和 3306 端口。
- 虚拟机重启后,Tomcat 和 MySQL 能自动启动(如果配置了自启)。
这套环境搭下来,快的话一两个小时,慢的话可能折腾半天。但把每个环节的原理搞清楚,以后再遇到类似场景,就是复制粘贴的事了。我个人在实际操作中的体会是,最耗时间的往往不是安装本身,而是网络和权限问题。把虚拟机的网络模式、防火墙规则、目录权限这三样提前理清楚,后面会顺很多。