ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CentOS 7 上使用 Xshell 和 Xftp 搭建 JDK、Tomcat 与 MySQL 环境

CentOS 7 上使用 Xshell 和 Xftp 搭建 JDK、Tomcat 与 MySQL 环境

1. 环境准备与整体思路拆解

1.1 为什么选择这套组合方案

把本地开发环境里的文件搬到远程服务器上,再在服务器上把 Java 运行环境、Web 容器和数据库一次性搭好,这是后端开发和运维入门阶段绕不开的一道坎。我见过太多新手卡在这一步:本地写好的代码传不上去,传上去了又跑不起来,跑起来了数据库又连不上。问题往往不在于技术本身有多难,而在于整个流程涉及的环节太多,任何一个细节没注意到就会卡住。

这套方案的核心工具组合是:Xshell 负责远程终端操作,Xftp 负责文件传输,目标机器是一台运行 CentOS 7 的虚拟机,最终要装好JDK、Tomcat和MySQL三件套。为什么是这三个?因为这是最经典的 Java Web 运行环境组合——JDK 提供 Java 运行时,Tomcat 作为 Servlet 容器承载 Web 应用,MySQL 负责数据持久化。三者缺一不可,构成了一个最小可用的后端服务闭环。

选择 Xshell 和 Xftp 而不是其他工具,理由很实际:这两个工具同属一个厂商,界面风格统一,Xftp 可以直接从 Xshell 会话中一键唤起,省去了重复输入主机地址和密码的麻烦。对于刚接触远程操作的人来说,这种联动设计能显著降低操作门槛。而且它们对中文编码的支持比较友好,传输包含中文文件名的文件时不容易出现乱码。

1.2 虚拟机网络模式的选型逻辑

在动手之前,有一个前置问题必须想清楚:虚拟机的网络模式怎么选。这直接决定了你的本地机器能不能连上虚拟机。常见的三种模式对比如下:

网络模式虚拟机 IP 特点本地能否直连适用场景
NAT 模式由虚拟网络分配,通常是 192.168.x.x 段可以,但需确认网段个人开发,不需要外部访问
桥接模式与物理机同网段,像一台独立设备可以,IP 更稳定需要局域网内其他设备访问
仅主机模式只能与物理机通信可以,但无法上外网纯隔离测试环境

我个人的建议是:如果你只是自己练习,用 NAT 模式就够了;如果你希望虚拟机的 IP 相对固定、方便反复连接,桥接模式会更省心。不管选哪种,装完系统后第一件事就是用ip addr或ifconfig确认虚拟机的 IP 地址,记下来,后面 Xshell 连接时要用。

注意:CentOS 7 最小化安装默认可能没有ifconfig命令,用ip addr更稳妥。如果连ip命令都没有,说明系统装得过于精简,建议重装时勾选基础网络工具。

1.3 整体操作流程鸟瞰

把整个任务拆开来看,逻辑链条是这样的:

  1. 打通连接:确认虚拟机 IP,用 Xshell 建立 SSH 连接
  2. 传输文件:用 Xftp 把本地准备好的安装包上传到虚拟机
  3. 装 JDK:解压配置环境变量,验证java -version
  4. 装 Tomcat:解压启动,验证 8080 端口可访问
  5. 装 MySQL:安装服务、初始化、设置密码、授权远程连接
  6. 联调验证:确认三者能协同工作

这个顺序不能乱。JDK 必须最先装,因为 Tomcat 依赖它;MySQL 可以独立安装,但放在最后能避免端口和权限的干扰。下面我按这个流程逐步展开,把每个环节的细节和坑都讲透。

2. 远程连接与文件传输的实操要点

2.1 Xshell 建立连接的完整步骤

打开 Xshell,点击左上角的新建会话,弹出配置窗口。这里有几个关键填写项:

  • 名称:随便起,建议用“CentOS7-测试机”这种一看就懂的名字
  • 协议:保持默认的 SSH
  • 主机:填虚拟机的 IP 地址,比如 192.168.1.100
  • 端口号:默认 22,除非你改过 SSH 配置

填完之后先别急着点确定,左侧有个“用户身份验证”选项卡,点进去填用户名和密码。用户名通常是root,密码是你装系统时设的。如果你用的是普通用户,后面执行安装命令时需要加sudo,或者用su -切换到 root。

连接建立后,第一次会弹出一个主机密钥确认的提示,点“接受并保存”即可。这个提示的意思是:这是你第一次连这台机器,客户端记住了它的指纹,以后如果指纹变了会警告你——这其实是一个安全机制,防止连到冒充的服务器上。

实操心得:如果连接时报“Connection refused”,九成是虚拟机的 SSH 服务没启动,或者防火墙拦了 22 端口。在虚拟机里执行systemctl status sshd看服务状态,执行systemctl stop firewalld临时关掉防火墙再试。生产环境不要直接关防火墙,应该用firewall-cmd放行端口。

2.2 Xftp 传输文件的正确姿势

Xftp 最方便的用法是从 Xshell 里直接唤起。在 Xshell 的菜单栏找到“窗口”或者工具栏上的 Xftp 图标,点一下就会打开一个已经连好同一台机器的 Xftp 窗口,省去了重新输入连接信息的步骤。

Xftp 的界面分左右两栏,左边是本地文件系统,右边是远程文件系统。传输文件就是拖拽,或者选中文件后点中间的箭头按钮。这里有几个细节值得注意:

传输模式的选择。Xftp 支持 ASCII、二进制和自动三种模式。传压缩包、安装包这类文件,一定要用二进制模式,否则文件可能损坏。自动模式大多数情况下没问题,但遇到.tar.gz、.rpm这种,手动切成二进制更保险。

文件存放位置。建议在远程机器上建一个专门的目录放安装包,比如/usr/local/software或者/opt/software。不要随手丢在/root或者/tmp下,/tmp目录可能会被系统清理,/root下文件多了以后不好管理。

# 在 Xshell 里提前建好目录 mkdir -p /usr/local/software cd /usr/local/software

中文文件名乱码问题。如果本地文件名带中文,传输后可能显示成乱码。解决办法是在 Xftp 的会话属性里,把编码设置为 UTF-8。如果已经传完了才发现乱码,用convmv工具转换文件名编码,或者干脆重命名成英文。

2.3 上传前的文件准备清单

在传文件之前,最好在本地把要用的安装包都准备好。需要哪些?

软件推荐版本文件格式说明
JDK1.8(即 Java 8).tar.gz兼容性最好,Tomcat 7/8/9 都支持
Tomcat8.5 或 9.0.tar.gz8.5 更稳定,9.0 支持新特性
MySQL5.7.tar.gz 或 .rpm5.7 是经典版本,资料多

为什么 JDK 选 1.8 而不是更高版本?因为 Tomcat 8.5 和很多老项目对 JDK 8 的支持最成熟,用 JDK 11 或 17 可能会遇到模块化相关的报错。如果你是全新项目,可以考虑 JDK 11,但练习环境用 8 最省心。

提示:下载安装包时注意区分系统架构。CentOS 7 通常是 x86_64 架构,下载对应的 64 位版本。用uname -m命令可以确认。

3. JDK 安装与环境变量配置

3.1 解压与目录规划

假设你已经把jdk-8uXXX-linux-x64.tar.gz传到了/usr/local/software目录。接下来解压:

cd /usr/local/software tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /usr/local/

这里-C /usr/local/的意思是解压到/usr/local/目录下。解压完会得到一个类似jdk1.8.0_XXX的文件夹。为了后续配置方便,我习惯把它重命名成一个简短的名字:

cd /usr/local mv jdk1.8.0_XXX jdk1.8

这样 JDK 的根目录就是/usr/local/jdk1.8,后面写环境变量时路径更清爽。

3.2 环境变量配置的两种方式

配置环境变量有两种常见做法,各有适用场景:

方式一:修改/etc/profile。这是全局配置,对所有用户生效。适合服务器上多个用户都需要用 Java 的场景。

vi /etc/profile

在文件末尾追加:

export JAVA_HOME=/usr/local/jdk1.8 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:${PATH}

方式二:修改~/.bash_profile。这是当前用户的私有配置,只对这个用户生效。如果你只是自己用,改这个文件更干净,不会影响其他用户。

两种方式改完后都需要让配置生效:

source /etc/profile # 或者 source ~/.bash_profile

3.3 验证安装与常见报错

验证很简单,执行:

java -version

如果输出类似java version "1.8.0_XXX"的信息,说明装好了。如果提示command not found,说明 PATH 没配好,检查一下JAVA_HOME路径是否写对,以及有没有执行source。

还有一个容易忽略的点:CLASSPATH里的那个点号。它代表当前目录,意思是 Java 运行时也会在当前目录下找类文件。这个点号不能省,否则运行某些程序时会报NoClassDefFoundError。

踩过的坑:有一次我配完环境变量,java -version正常,但javac命令找不到。排查发现是 PATH 里只加了${JAVA_HOME}/bin,但JAVA_HOME变量本身没导出成功。原因是export写成了exprot,一个字母之差,排查了半小时。所以配完一定要用echo $JAVA_HOME确认变量真的有值。

4. Tomcat 部署与启动验证

4.1 解压与目录结构说明

Tomcat 的安装更简单,解压即用:

cd /usr/local/software tar -zxvf apache-tomcat-8.5.XX.tar.gz -C /usr/local/ cd /usr/local mv apache-tomcat-8.5.XX tomcat8

解压后的目录结构值得了解一下,因为后面排查问题会用到:

  • bin/:启动和关闭脚本,startup.sh和shutdown.sh在这里
  • conf/:配置文件,server.xml改端口,tomcat-users.xml配管理用户
  • webapps/:默认的应用部署目录,把 war 包丢进去会自动解压
  • logs/:日志目录,启动失败先看catalina.out

4.2 启动 Tomcat 与端口配置

启动命令:

cd /usr/local/tomcat8/bin ./startup.sh

看到Tomcat started就说明启动成功了。但这里有个新手常犯的错误:以为启动成功就能访问。实际上还要过防火墙这一关。CentOS 7 默认的防火墙是 firewalld,8080 端口默认是关闭的。

临时放行(重启后失效):

firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload

--permanent表示永久生效,--reload让配置立即生效。这两条命令要一起用,只加--permanent不 reload 是不生效的。

如果 8080 端口被占用了怎么办?改conf/server.xml,找到<Connector port="8080"那一行,把 8080 改成别的,比如 8081,然后重启 Tomcat。

4.3 验证访问与日志排查

在本地浏览器输入http://虚拟机IP:8080,如果看到 Tomcat 的默认欢迎页,说明部署成功。

如果访问不了,按这个顺序排查:

  1. Tomcat 进程在不在:ps -ef | grep tomcat
  2. 端口在不在监听:netstat -tlnp | grep 8080
  3. 防火墙放行了没:firewall-cmd --list-ports
  4. 日志有没有报错:tail -f /usr/local/tomcat8/logs/catalina.out

日志是最直接的线索。我遇到过启动时报Address already in use,一看就是端口冲突;还遇到过JAVA_HOME not found,说明 Tomcat 找不到 JDK,需要在bin/setclasspath.sh里显式指定JAVA_HOME。

实操心得:Tomcat 的启动脚本其实会去读环境变量里的JAVA_HOME。如果你在/etc/profile里配了但 Tomcat 还是报找不到,很可能是因为启动脚本执行时没有加载 profile。解决办法是在bin/setclasspath.sh开头加上export JAVA_HOME=/usr/local/jdk1.8,这样最稳妥。

5. MySQL 安装与远程访问配置

5.1 安装方式的选择

MySQL 在 CentOS 7 上有几种装法,我推荐用tar.gz 解压安装,原因有三:一是版本可控,不会被系统源里的版本绑架;二是卸载干净,删目录就行;三是不依赖 yum 源,离线环境也能装。

如果你图省事,用yum install mysql-server也行,但 CentOS 7 默认源里没有 MySQL,只有 MariaDB。要装 MySQL 得先加官方源,步骤反而更多。

解压安装的流程:

cd /usr/local/software tar -zxvf mysql-5.7.XX-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ cd /usr/local mv mysql-5.7.XX-linux-glibc2.12-x86_64 mysql

5.2 初始化与用户权限设置

MySQL 5.7 安装后需要初始化数据目录。先建一个 mysql 用户组和用户,因为 MySQL 不建议用 root 运行:

groupadd mysql useradd -r -g mysql mysql chown -R mysql:mysql /usr/local/mysql

然后初始化:

cd /usr/local/mysql bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

初始化完成后,临时密码会打印在输出里,一定要记下来,第一次登录要用。如果没注意看,可以删掉 data 目录重新初始化。

启动 MySQL:

bin/mysqld_safe --user=mysql &

登录并改密码:

bin/mysql -u root -p # 输入临时密码 ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

5.3 开启远程访问的关键配置

默认情况下,MySQL 只允许本机连接。要让其他机器连上,需要两步:

第一步:授权远程用户。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码' WITH GRANT OPTION; FLUSH PRIVILEGES;

这里的%表示允许任意 IP 连接。生产环境不建议这么开放,应该指定具体 IP。

第二步:修改绑定地址。编辑my.cnf,找到bind-address这一行,改成0.0.0.0或者直接注释掉。默认是127.0.0.1,只监听本机。

vi /etc/my.cnf # 找到 bind-address = 127.0.0.1 # 改成 bind-address = 0.0.0.0

改完重启 MySQL 生效。然后别忘了防火墙放行 3306 端口:

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

5.4 服务化与开机自启

手动用mysqld_safe启动的方式,重启机器后就没了。正规做法是把它注册成系统服务:

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on

这样就能用service mysqld start/stop/restart来管理,而且开机自动启动。Tomcat 也可以类似处理,在/etc/rc.d/rc.local里加上启动脚本,并给rc.local加执行权限。

6. 常见问题速查与避坑经验

6.1 连接与传输类问题

问题现象可能原因解决办法
Xshell 连接超时虚拟机 IP 变了或网络模式不对重新确认 IP,检查虚拟机网络设置
连接被拒绝SSH 服务未启动或端口被拦启动 sshd,放行 22 端口
Xftp 传文件失败权限不足或磁盘满换有写权限的目录,df -h查磁盘
传输后文件损坏用了 ASCII 模式改用二进制模式重传

6.2 服务启动类问题

Tomcat 启动慢。CentOS 7 上 Tomcat 启动可能卡在Creation of SecureRandom instance这一步,原因是熵池不够。解决办法是安装rng-tools或者改 JVM 参数-Djava.security.egd=file:/dev/./urandom。

MySQL 启动报 socket 错误。通常是/tmp/mysql.sock文件残留或者权限不对。删掉旧 socket 文件,确认 data 目录属主是 mysql 用户。

端口冲突。8080 被占、3306 被占,用netstat -tlnp | grep 端口号找到占用进程,要么杀掉,要么改配置换端口。

6.3 我踩过的几个典型坑

坑一:环境变量配了但新开终端不生效。原因是只改了~/.bash_profile,而 Xshell 新开的会话可能加载的是~/.bashrc。解决办法是把配置写到~/.bashrc里,或者在~/.bash_profile里 source 一下~/.bashrc。

坑二:MySQL 密码策略太严。MySQL 5.7 默认的密码策略要求密码包含大小写字母、数字和特殊字符,长度至少 8 位。如果你设了个简单密码,会报Your password does not satisfy the current policy requirements。临时降低策略:

SET GLOBAL validate_password_policy=LOW; SET GLOBAL validate_password_length=6;

坑三:Tomcat 部署 war 包后访问 404。检查 war 包名和访问路径是否一致。比如myapp.war部署后访问路径是/myapp,不是/。如果想直接访问根路径,把 war 包改名为ROOT.war。

坑四:虚拟机重启后 IP 变了。NAT 模式下 DHCP 分配的 IP 可能会变。解决办法是在虚拟机网络配置里设静态 IP,或者改用桥接模式并在路由器里绑定 MAC 和 IP。

6.4 安全加固的几点建议

练习环境怎么折腾都行,但如果这套环境要对外提供服务,有几件事必须做:

  • 改 SSH 默认端口,从 22 改成不常见的端口,减少扫描
  • 禁用 root 远程登录,用普通用户登录后再su
  • MySQL 不要用 root 远程连接,建专用账号并限制来源 IP
  • Tomcat 管理界面加密码,tomcat-users.xml里配置强密码
  • 定期看日志,catalina.out和 MySQL 的 error log 是发现异常的第一现场

这套流程我从第一次接触到现在,前前后后在不同机器上重复了不下几十遍。每次遇到的新问题,归根结底都是某个环节的细节没注意到——要么是权限,要么是端口,要么是路径。把上面这些点都过一遍,基本上能覆盖九成以上的场景。剩下的那一成,靠看日志和搜索引擎也能解决。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进