简介这份资源面向需要在Linux服务器上快速搭建Java Web运行环境的运维人员与后端开发者围绕JDK、MySQL、Redis、Nginx四大核心组件提供一键式自动化部署方案帮助解决手动逐个安装配置繁琐、环境变量与依赖易出错的问题。压缩包共27个文件约930.56MB以sh安装脚本、gz源码包、conf与cnf配置文件、rpm依赖包及tar归档为主脚本负责下载解压、环境变量配置与服务注册配置文件则覆盖数据库、缓存与Web服务器的参数设定。目前已有298人学习下载。读者可借助其中的自动化脚本与配套配置快速完成从依赖安装到服务启动的全流程部署理解各组件在Linux下的安装逻辑、目录结构与启动方式并参考脚本中的权限管理、安全初始化与systemd服务配置思路为后续运维排错与批量部署提供可复用的实践模板。1. 一键脚本装四件套为什么我劝你先别急着按回车上周帮一个刚转 Linux 的同事配测试机他拿到一份「Linux 一键式安装 JDK、Mysql、Redis、Nginx」的脚本兴冲冲地bash install.sh跑完结果 MySQL 起不来、Nginx 端口被占、Redis 连不上折腾到凌晨两点。这套组合太常见了——Java 应用要 JDK数据落 MySQL缓存走 Redis前端反代靠 Nginx几乎每个后端项目都绕不开。但「一键」两个字最容易让人放松警惕脚本帮你省了敲命令的时间却没帮你省掉版本选型、端口规划、依赖检查这些真正会翻车的地方。这篇笔记面向的是想在一台干净的 Linux 机器上把这四件套一次性装好、并且装完能验证跑通的开发者不管你是第一次配环境的新手还是想找一份可复现清单的老手下面这套流程都能照着走。2. 装之前先把环境盘清楚版本、端口、依赖一个都不能少2.1 确认系统版本和基础依赖我一般拿到机器第一件事不是下载安装包而是先看清楚系统底子。不同发行版包管理器不一样后面所有命令都建立在这个判断上。# 查看发行版和版本号 cat /etc/os-release # 查看内核和架构确认是 x86_64 还是 aarch64 uname -m # 确认当前用户是否有 sudo 权限 sudo -v/etc/os-release里的ID和VERSION_ID决定了你用yum还是apt。uname -m输出x86_64就下 x64 包输出aarch64就得找 ARM 版本下错了包后面全是玄学报错。sudo -v是提前验证权限别装到一半才发现当前用户没写权限。基础依赖这块CentOS 系和 Ubuntu 系差别不大主要是编译工具和库文件# CentOS / RHEL 系 sudo yum install -y wget curl tar gcc gcc-c make libaio numactl # Ubuntu / Debian 系 sudo apt update sudo apt install -y wget curl tar gcc g make libaio1 numactllibaio是 MySQL 异步 IO 依赖缺了它 MySQL 初始化会直接报错numactl在 NUMA 架构机器上影响 Redis 和 MySQL 的性能表现装上不亏。这些包体积不大但缺一个就可能卡在某个莫名其妙的环节。2.2 版本选择别用最新用最稳一键脚本最容易埋的坑就是版本写死。我见过脚本里 JDK 用 17、MySQL 用 8.0.35、Redis 用 7.2、Nginx 用 1.25结果目标机器是 CentOS 7glibc 版本不够MySQL 8.0.35 直接跑不起来。所以版本选择要跟系统版本对齐。组件推荐版本适用场景备注JDK8u392 / 11.0.21 / 17.0.9老项目用 8新项目用 17优先选 LTSMySQL5.7.44 / 8.0.36兼容老代码用 5.78.0 默认认证插件变了Redis6.2.14 / 7.2.4生产建议 6.27.x 部分命令有变动Nginx1.24.0 / 1.25.4稳定版选 1.241.25 是主线版这张表不是让你照抄而是让你在脚本里把版本号抽成变量装之前先java -version、mysql --version探一下机器上有没有旧版本。如果机器上已经有 JDK 8你脚本里又装一个 JDK 17JAVA_HOME指向谁就成了悬案。2.3 端口规划四个组件别打架默认端口是 JDK 无端口、MySQL 3306、Redis 6379、Nginx 80。听起来不冲突但实际机器上 80 端口经常被 httpd 或旧 Nginx 占着3306 可能被 Docker 映射占着。装之前先扫一遍# 查看 80、3306、6379 是否被占用 ss -tlnp | grep -E :(80|3306|6379)\s # 如果被占用看是哪个进程 sudo lsof -i :80 sudo lsof -i :3306 sudo lsof -i :6379ss -tlnp比netstat快-t看 TCP-l看监听-n不解析域名-p显示进程。如果发现端口被占要么停掉旧服务要么在配置里改端口。我一般会在脚本里加一段检测端口被占就打印出来让用户决定而不是硬装。3. 一键脚本拆开看JDK、MySQL、Redis、Nginx 逐个落地3.1 JDK 安装解压、配环境变量、验证JDK 是四件套里最简单的但环境变量写错的人最多。我习惯用 tar.gz 包手动装不用包管理器因为路径可控。# 下载 JDK 17以 x64 为例实际链接按需替换 cd /opt sudo wget https://example.com/jdk-17.0.9_linux-x64_bin.tar.gz # 解压到 /usr/local sudo tar -zxvf jdk-17.0.9_linux-x64_bin.tar.gz -C /usr/local/ # 重命名方便管理 sudo mv /usr/local/jdk-17.0.9 /usr/local/java-C /usr/local/指定解压目录-z解 gzip-x解压-v显示过程-f指定文件。解压完重命名成/usr/local/java是为了后面配环境变量时路径短一点少打几个字也少出错。接下来配环境变量写到/etc/profile.d/java.sh里比直接改/etc/profile干净# 创建独立的环境变量文件 sudo tee /etc/profile.d/java.sh EOF export JAVA_HOME/usr/local/java export JRE_HOME$JAVA_HOME/jre export CLASSPATH.:$JAVA_HOME/lib:$JRE_HOME/lib export PATH$JAVA_HOME/bin:$PATH EOF # 立即生效 source /etc/profile.d/java.sh # 验证 java -version javac -versionJAVA_HOME指向 JDK 根目录JRE_HOME在 JDK 8 里有意义JDK 11 以后 JRE 被合并了这行可以去掉。CLASSPATH里的.表示当前目录老项目依赖这个。PATH把$JAVA_HOME/bin放最前面避免系统自带 Java 抢先。验证时java -version输出 17.0.9 就对了如果输出的是系统自带的 1.8说明PATH顺序有问题。3.2 MySQL 安装初始化、改密码、开远程MySQL 是四件套里最容易翻车的。我一般用二进制包装不用 yum因为 yum 装的 MySQL 路径分散配置文件不好找。# 下载 MySQL 8.0.36 二进制包 cd /opt sudo wget https://example.com/mysql-8.0.36-linux-glibc2.17-x86_64.tar.gz # 解压 sudo tar -zxvf mysql-8.0.36-linux-glibc2.17-x86_64.tar.gz -C /usr/local/ # 重命名 sudo mv /usr/local/mysql-8.0.36-linux-glibc2.17-x86_64 /usr/local/mysql # 创建 mysql 用户和组 sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql # 创建数据目录并授权 sudo mkdir -p /usr/local/mysql/data sudo chown -R mysql:mysql /usr/local/mysql-r创建系统用户-s /bin/false禁止登录这是 MySQL 运行账户的标准做法。数据目录单独建方便后面备份和迁移。初始化数据库# 初始化生成临时密码 sudo /usr/local/mysql/bin/mysqld --initialize --usermysql --basedir/usr/local/mysql --datadir/usr/local/mysql/data # 初始化完成后临时密码在错误日志里 sudo grep temporary password /usr/local/mysql/data/error.log--initialize会生成一个临时 root 密码必须从 error.log 里捞出来。如果用的是--initialize-insecureroot 密码为空但生产环境别这么干。配置 my.cnfsudo tee /etc/my.cnf EOF [mysqld] basedir/usr/local/mysql datadir/usr/local/mysql/data port3306 socket/tmp/mysql.sock character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci max_connections500 innodb_buffer_pool_size512M log-error/usr/local/mysql/data/error.log pid-file/usr/local/mysql/data/mysql.pid [client] socket/tmp/mysql.sock default-character-setutf8mb4 EOFcharacter-set-serverutf8mb4是必须的不然中文和 emoji 存进去变问号。innodb_buffer_pool_size按机器内存调一般给物理内存的 50%70%。socket路径两边要一致不然客户端连不上。启动并改密码# 启动 MySQL sudo /usr/local/mysql/bin/mysqld_safe --usermysql # 用临时密码登录 /usr/local/mysql/bin/mysql -uroot -p # 登录后立刻改密码 ALTER USER rootlocalhost IDENTIFIED BY YourNewPassword123!; FLUSH PRIVILEGES;mysqld_safe是带守护的启动方式崩了会自动拉起来。改密码时注意 MySQL 8.0 默认认证插件是caching_sha2_password老客户端可能连不上可以改成mysql_native_passwordALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourNewPassword123!;开远程访问按需CREATE USER root% IDENTIFIED BY YourNewPassword123!; GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION; FLUSH PRIVILEGES;root%表示允许任意 IP 连接生产环境建议限制具体网段比如root192.168.1.%。3.3 Redis 安装编译、配置、设密码Redis 用源码编译装虽然慢一点但版本可控。# 下载 Redis 7.2.4 cd /opt sudo wget https://example.com/redis-7.2.4.tar.gz # 解压 sudo tar -zxvf redis-7.2.4.tar.gz # 编译 cd redis-7.2.4 sudo make sudo make install PREFIX/usr/local/redismake编译时间取决于机器性能一般一两分钟。PREFIX/usr/local/redis指定安装目录不指定的话默认装到/usr/local/bin文件散落不好管理。配置 redis.conf# 复制配置文件 sudo mkdir -p /usr/local/redis/conf sudo cp /opt/redis-7.2.4/redis.conf /usr/local/redis/conf/ # 修改关键配置 sudo sed -i s/^daemonize no/daemonize yes/ /usr/local/redis/conf/redis.conf sudo sed -i s/^# requirepass foobared/requirepass YourRedisPassword123/ /usr/local/redis/conf/redis.conf sudo sed -i s/^bind 127.0.0.1/bind 0.0.0.0/ /usr/local/redis/conf/redis.conf sudo sed -i s/^protected-mode yes/protected-mode no/ /usr/local/redis/conf/redis.confdaemonize yes让 Redis 后台运行不然终端一关就断。requirepass设密码不设的话裸奔在公网就是血泪教训。bind 0.0.0.0允许远程连接protected-mode no配合密码使用如果只允许本机访问就把bind改回127.0.0.1。启动 Redis# 启动 /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf # 验证 /usr/local/redis/bin/redis-cli -a YourRedisPassword123 ping返回PONG就对了。如果报NOAUTH说明密码没生效检查配置文件里requirepass前面有没有空格。3.4 Nginx 安装编译、反代、验证Nginx 同样源码编译依赖 pcre 和 zlib。# 安装依赖 sudo yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel # 下载 Nginx 1.24.0 cd /opt sudo wget https://example.com/nginx-1.24.0.tar.gz sudo tar -zxvf nginx-1.24.0.tar.gz # 编译安装 cd nginx-1.24.0 sudo ./configure --prefix/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module sudo make sudo make install--with-http_ssl_module支持 HTTPS--with-http_stub_status_module开启状态监控页。这两个模块后面大概率用得上编译时加上不亏。配置反向代理sudo tee /usr/local/nginx/conf/nginx.conf EOF worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } EOFworker_processes auto按 CPU 核数自动设工作进程。proxy_pass把/api/转发到后端 8080proxy_set_header把真实 IP 传给后端不然后端日志里全是 127.0.0.1。启动 Nginx# 检查配置语法 sudo /usr/local/nginx/sbin/nginx -t # 启动 sudo /usr/local/nginx/sbin/nginx # 验证 curl -I http://127.0.0.1nginx -t输出syntax is ok和test is successful才能启动。curl -I返回200 OK就说明 Nginx 跑起来了。4. 避坑排查这五个坑我替你踩过了4.1 MySQL 启动报 libaio.so.1 找不到现象mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file。原因系统没装libaio库MySQL 依赖它做异步 IO。解决sudo yum install -y libaio或sudo apt install -y libaio1装完再启动。4.2 Redis 远程连不上现象本机redis-cli能连远程连超时。原因bind 127.0.0.1只监听本机或者防火墙没放行 6379。解决改bind 0.0.0.0protected-mode no设requirepass然后sudo firewall-cmd --add-port6379/tcp --permanent sudo firewall-cmd --reload。4.3 Nginx 启动报 80 端口被占现象nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)。原因机器上已经有 httpd 或旧 Nginx 在跑。解决sudo lsof -i :80找到进程sudo systemctl stop httpd停掉或者改 Nginx 监听端口为 8080。4.4 JDK 版本和 JAVA_HOME 不一致现象java -version输出 1.8但echo $JAVA_HOME指向 17。原因PATH里系统自带的 Java 路径排在前面。解决检查/etc/profile.d/java.sh里PATH$JAVA_HOME/bin:$PATH确保$JAVA_HOME/bin在最前面然后source一下。4.5 MySQL 8.0 远程连接报认证插件错误现象Authentication plugin caching_sha2_password cannot be loaded。原因老客户端不支持 MySQL 8.0 默认的caching_sha2_password插件。解决ALTER USER root% IDENTIFIED WITH mysql_native_password BY 密码;然后FLUSH PRIVILEGES;。5. 装完怎么验证四件套联动跑一遍才算数装完不验证等于没装。我一般会写一个简单的验证脚本把四个组件串起来跑一遍。#!/bin/bash # verify.sh - 四件套联动验证 echo JDK java -version 21 | head -1 echo MySQL mysql -uroot -pYourNewPassword123! -e SELECT VERSION(); 2/dev/null echo Redis redis-cli -a YourRedisPassword123 ping 2/dev/null echo Nginx curl -s -o /dev/null -w %{http_code} http://127.0.0.1 echo 这个脚本跑完四个组件都输出正常结果才算真正装好。java -version看版本号mysql -e SELECT VERSION();看数据库能不能连redis-cli ping看缓存能不能通curl看 Nginx 返回码是不是 200。更进一步可以写一个 Java 程序连 MySQL 和 Redis通过 Nginx 反代访问模拟真实业务链路// TestConnection.java import java.sql.*; import redis.clients.jedis.Jedis; public class TestConnection { public static void main(String[] args) throws Exception { // 测试 MySQL Connection conn DriverManager.getConnection( jdbc:mysql://127.0.0.1:3306/mysql?useSSLfalse, root, YourNewPassword123!); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT 1); if (rs.next()) System.out.println(MySQL OK); conn.close(); // 测试 Redis Jedis jedis new Jedis(127.0.0.1, 6379); jedis.auth(YourRedisPassword123); jedis.set(test, hello); System.out.println(Redis OK: jedis.get(test)); jedis.close(); } }编译运行需要 JDBC 驱动和 Jedis 包这一步能跑通说明 JDK、MySQL、Redis 三者之间的网络和认证都没问题。Nginx 的验证更简单浏览器打开http://你的IP/api/能看到后端返回就行。提示验证脚本里的密码不要硬编码在脚本里用环境变量或配置文件传入避免泄露。从那以后我每次装完这套环境都会强制走一遍联动验证哪怕只是测试机。因为单个组件能跑不代表组合能跑端口、认证、字符集这些坑往往在联动时才暴露。希望帮到你。本文还有配套的精品资源点击获取