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 整体操作流程鸟瞰
把整个任务拆开来看,逻辑链条是这样的:
- 打通连接:确认虚拟机 IP,用 Xshell 建立 SSH 连接
- 传输文件:用 Xftp 把本地准备好的安装包上传到虚拟机
- 装 JDK:解压配置环境变量,验证
java -version - 装 Tomcat:解压启动,验证 8080 端口可访问
- 装 MySQL:安装服务、初始化、设置密码、授权远程连接
- 联调验证:确认三者能协同工作
这个顺序不能乱。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 上传前的文件准备清单
在传文件之前,最好在本地把要用的安装包都准备好。需要哪些?
| 软件 | 推荐版本 | 文件格式 | 说明 |
|---|---|---|---|
| JDK | 1.8(即 Java 8) | .tar.gz | 兼容性最好,Tomcat 7/8/9 都支持 |
| Tomcat | 8.5 或 9.0 | .tar.gz | 8.5 更稳定,9.0 支持新特性 |
| MySQL | 5.7 | .tar.gz 或 .rpm | 5.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_profile3.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 的默认欢迎页,说明部署成功。
如果访问不了,按这个顺序排查:
- Tomcat 进程在不在:
ps -ef | grep tomcat - 端口在不在监听:
netstat -tlnp | grep 8080 - 防火墙放行了没:
firewall-cmd --list-ports - 日志有没有报错:
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 mysql5.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 --reload5.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 是发现异常的第一现场
这套流程我从第一次接触到现在,前前后后在不同机器上重复了不下几十遍。每次遇到的新问题,归根结底都是某个环节的细节没注意到——要么是权限,要么是端口,要么是路径。把上面这些点都过一遍,基本上能覆盖九成以上的场景。剩下的那一成,靠看日志和搜索引擎也能解决。