首页 / 资讯中心 / 文章详情

Linux一键安装JDK、MySQL、Redis、Nginx:避坑指南与联调验证

Linux一键安装JDK、MySQL、Redis、Nginx:避坑指南与联调验证 ★ FEATURED ARTICLE
简介这份资源面向需要在Linux服务器上快速搭建Java Web运行环境的运维人员与后端开发者提供JDK、MySQL、Redis、Nginx四大核心组件的一键式安装方案帮助解决手动逐个编译配置耗时、依赖繁琐、易出错的问题。压缩包共27个文件约930.56MB以11个sh安装脚本、9个gz源码包为主辅以cnf与conf配置文件、rpm依赖包及tar归档覆盖从环境准备到服务启动的完整链路。内容按组件分目录组织包含JDK解压与环境变量配置、MySQL初始化与root密码重置、Redis编译安装与守护进程设置、Nginx编译及systemd服务管理并额外提供gcc、net-tools、libaio、perl、zlib、openssl、pcre等依赖的安装脚本便于离线环境一次跑通。已有298人学习下载适合希望减少重复劳动、快速获得可复用部署脚本与排错思路的读者参考。1. 一次装完 JDK、MySQL、Redis、Nginx为什么我劝你别再手动逐个编译刚接手一台全新的 Linux 测试机时我第一反应是打开四个终端窗口分别去官网翻 JDK 的 tar.gz、MySQL 的 repo 源、Redis 的 make 参数、Nginx 的编译依赖。结果折腾到凌晨两点Java 环境变量写错了一个斜杠MySQL 初始化时 socket 路径对不上Redis 的protected-mode没关导致本地连不上Nginx 编译到一半提示缺pcre-devel。四个组件单独看都不难凑在一起就是一场环境灾难。后来我学乖了凡是新机器要同时上 JDK、MySQL、Redis、Nginx 这套组合一律走一键式安装脚本先把版本和路径锁死再谈调优。这篇笔记就是给同样卡在“装完这个忘了那个”的开发者看的尤其适合刚拿到云主机、准备搭一套 Java 后端运行环境的新手也适合想把手动步骤固化成脚本的老手。整套流程跑通大约二十分钟前提是你得先看清下面这些版本和目录的坑。2. 装前定版本与目录JDK、MySQL、Redis、Nginx 各选哪个包2.1 版本组合怎么选才不打架一键式安装最怕的就是“脚本里写的是 8你机器上残留的是 11”。我一般会先确认三件事系统发行版、CPU 架构、是否已有旧版本。以 CentOS 7 / Rocky 8 / Ubuntu 20.04 这三类常见环境为例下面这套组合是我跑过最稳的组件推荐版本安装方式默认端口JDKOpenJDK 8 或 11yum/apt 或 tar.gz无MySQL5.7 或 8.0官方 repo 或通用二进制3306Redis6.2 或 7.0源码编译或 yum/apt6379Nginx1.20 或 1.24官方 repo 或源码编译80选 JDK 8 还是 11取决于你的项目用的是 Spring Boot 2.x 还是 3.x。MySQL 5.7 和 8.0 的认证插件不同8.0 默认caching_sha2_password老客户端连不上就得改mysql_native_password。Redis 6.2 以上支持 ACL但如果你只是本地缓存6.0 也够。Nginx 1.24 对 HTTP/2 支持更好但如果你系统自带 1.20直接用系统包更省事。提示不要在一台机器上同时装 OpenJDK 和 Oracle JDKalternatives会把你绕晕。要么全用系统包要么全用 tar.gz 手动指定JAVA_HOME。2.2 目录规划与依赖预检一键脚本里最容易被忽略的是目录规划。我习惯把自装软件统一放/usr/local/下数据放/data/下日志放/var/log/下。这样备份和迁移时思路清晰。# 创建统一目录结构 mkdir -p /usr/local/jdk /usr/local/mysql /usr/local/redis /usr/local/nginx mkdir -p /data/mysql /data/redis mkdir -p /var/log/mysql /var/log/redis /var/log/nginx # 预检依赖编译 Redis 和 Nginx 需要这些 yum install -y gcc gcc-c make pcre pcre-devel zlib zlib-devel openssl openssl-devel wget vim net-tools这段命令先建目录再装编译依赖。pcre-devel是 Nginx 重写模块的依赖zlib-devel是 gzip 压缩用的openssl-devel是 HTTPS 支持。如果你用 Ubuntu把yum换成apt包名基本一致。我见过有人跳过这步直接编译 Nginx结果./configure报错the HTTP rewrite module requires the PCRE library回头再装依赖编译缓存已经乱了。2.3 关闭冲突服务与防火墙预配置装 MySQL 前先查有没有 MariaDB 残留装 Nginx 前先查有没有 Apache 占着 80 端口。# 检查并停止可能冲突的服务 systemctl stop mariadb 2/dev/null systemctl disable mariadb 2/dev/null systemctl stop httpd 2/dev/null systemctl disable httpd 2/dev/null # 开放必要端口firewalld 环境 firewall-cmd --permanent --add-port3306/tcp firewall-cmd --permanent --add-port6379/tcp firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port443/tcp firewall-cmd --reload2/dev/null是为了让脚本在服务不存在时不报错中断。firewall-cmd --reload必须执行否则规则不生效。如果你用的是云主机安全组还得去控制台放行对应端口这一步脚本替不了你。我一般会在脚本最后加一句echo 请确认云安全组已放行 3306/6379/80/443提醒自己。3. 一键脚本拆解JDK、MySQL、Redis、Nginx 的安装与配置3.1 JDK 安装与环境变量写入JDK 我优先用系统包因为一键脚本里手动解压 tar.gz 容易漏掉JAVA_HOME的软链接。# CentOS/Rocky 安装 OpenJDK 11 yum install -y java-11-openjdk java-11-openjdk-devel # 确认安装路径 readlink -f $(which java) # 典型输出/usr/lib/jvm/java-11-openjdk-11.0.xx.x-x86_64/bin/java # 写入环境变量 cat /etc/profile.d/java.sh EOF export JAVA_HOME/usr/lib/jvm/java-11-openjdk export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar EOF source /etc/profile.d/java.sh java -versionreadlink -f用来解析真实路径因为/usr/bin/java通常是个软链接。/etc/profile.d/下的脚本会自动被登录 shell 加载比直接改/etc/profile更干净。CLASSPATH里的dt.jar和tools.jar在 JDK 11 里其实已经移除但很多老教程还在写留着不会报错只是无效。如果你用 JDK 8这两个 jar 是存在的。验证时看到openjdk version 11.0.x就说明成了。3.2 MySQL 安装与初始化安全配置MySQL 用官方 repo 装最省心版本可控依赖自动解决。# 添加 MySQL 8.0 官方 repo以 EL7 为例 rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm # 安装 MySQL 服务端 yum install -y mysql-community-server # 启动并设置开机自启 systemctl start mysqld systemctl enable mysqld # 获取临时密码 grep temporary password /var/log/mysqld.log # 安全初始化会提示改密码、删匿名用户、禁 root 远程 mysql_secure_installationmysql_secure_installation这一步别跳过。它会问你是否设置VALIDATE PASSWORD策略测试环境我一般选0低强度否则密码得包含大小写数字符号容易忘。生产环境选2。临时密码在/var/log/mysqld.log里如果这个文件为空说明 MySQL 没正常启动先看systemctl status mysqld。-- 登录后创建业务库和用户 CREATE DATABASE app_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER app_user% IDENTIFIED BY YourStrongPass123!; GRANT ALL PRIVILEGES ON app_db.* TO app_user%; FLUSH PRIVILEGES;utf8mb4是必须的utf8在 MySQL 里是残废的存不了 emoji。app_user%允许远程连接如果你只在本机用改成app_userlocalhost更安全。FLUSH PRIVILEGES在GRANT后其实会自动生效但手动执行一次不亏。3.3 Redis 源码编译与后台运行配置Redis 用源码编译能拿到最新稳定版但记得装gcc。# 下载并编译 Redis 7.0 cd /usr/local/src wget https://download.redis.io/releases/redis-7.0.15.tar.gz tar -zxvf redis-7.0.15.tar.gz cd redis-7.0.15 make MALLOClibc make install PREFIX/usr/local/redis # 复制配置文件 cp redis.conf /usr/local/redis/ cd /usr/local/redis # 修改关键配置 sed -i s/^daemonize no/daemonize yes/ redis.conf sed -i s/^protected-mode yes/protected-mode no/ redis.conf sed -i s/^bind 127.0.0.1/bind 0.0.0.0/ redis.conf sed -i s/^# requirepass foobared/requirepass YourRedisPass123/ redis.conf # 启动 ./bin/redis-server ./redis.confMALLOClibc是为了避免 jemalloc 在某些系统上的编译问题。daemonize yes让 Redis 后台运行。protected-mode no和bind 0.0.0.0一起改才能远程连接但生产环境务必设requirepass否则等于裸奔。sed命令里的^表示行首匹配避免误改注释行。启动后用./bin/redis-cli -a YourRedisPass123 ping应该返回PONG。3.4 Nginx 编译安装与反向代理示例Nginx 我倾向源码编译因为可以自定义模块路径和前面几个组件的目录风格统一。# 下载并编译 Nginx 1.24 cd /usr/local/src wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0 ./configure \ --prefix/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_stub_status_module \ --with-pcre make make install # 启动 /usr/local/nginx/sbin/nginx # 验证配置 /usr/local/nginx/sbin/nginx -t--with-http_ssl_module支持 HTTPS--with-http_v2_module支持 HTTP/2--with-http_stub_status_module可以看连接数。nginx -t是改配置后必跑的命令它会告诉你语法错在哪一行。启动后curl -I 127.0.0.1应该返回200 OK。# /usr/local/nginx/conf/nginx.conf 里加一个反向代理 server { listen 80; server_name localhost; location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }proxy_pass末尾的斜杠很关键/api/转发到http://127.0.0.1:8080/会去掉/api前缀不加斜杠则保留。X-Real-IP让后端能拿到真实客户端 IP。改完配置记得nginx -s reload。4. 避坑与排查一键安装最常翻车的五个地方4.1 现象MySQL 启动失败日志报Cant create/write to file原因/var/lib/mysql权限不对或者 SELinux 拦截。解决chown -R mysql:mysql /var/lib/mysql然后setenforce 0临时关闭 SELinux 测试。如果确认是 SELinux用semanage fcontext加规则别直接永久关。4.2 现象Redis 编译报jemalloc相关错误原因系统缺少jemalloc开发包或者make时没指定MALLOClibc。解决yum install -y jemalloc-devel或者直接make MALLOClibc绕过。我一般选后者省事。4.3 现象Nginx 启动报bind() to 0.0.0.0:80 failed (98: Address already in use)原因80 端口被占用常见的是系统自带的 httpd 或者之前没关干净的 Nginx 进程。解决netstat -tlnp | grep 80找到 PIDkill -9掉或者systemctl stop httpd。如果是 Nginx 自己残留pkill nginx再启动。4.4 现象Java 命令找不到JAVA_HOME不生效原因环境变量写在了~/.bashrc但用的是sudo执行或者source没执行。解决写到/etc/profile.d/java.sh然后source /etc/profile.d/java.sh。用sudo时加-i参数让环境变量加载。4.5 现象MySQL 8.0 远程连接报Authentication plugin caching_sha2_password cannot be loaded原因老版本客户端不认 MySQL 8.0 默认认证插件。解决ALTER USER app_user% IDENTIFIED WITH mysql_native_password BY YourStrongPass123!;然后FLUSH PRIVILEGES;。这是 MySQL 8.0 最经典的坑没有之一。5. 装完怎么验证四个组件联调跑通才算数装完不验证等于没装。我一般会按“单组件自检 → 交叉联调 → 开机自启确认”三步走。单组件自检就是前面每节末尾的命令java -version、mysql -u app_user -p、redis-cli ping、curl -I 127.0.0.1。这一步只能证明各自活着不能证明它们能一起干活。交叉联调我习惯用一个最小的 Java 程序去连 MySQL 和 Redis再通过 Nginx 反代访问。下面这段代码可以直接用jshell跑或者存成TestConn.java编译。// TestConn.java import java.sql.*; import redis.clients.jedis.Jedis; public class TestConn { public static void main(String[] args) throws Exception { // 1. 测 MySQL String url jdbc:mysql://127.0.0.1:3306/app_db?useSSLfalseserverTimezoneUTC; try (Connection conn DriverManager.getConnection(url, app_user, YourStrongPass123!)) { System.out.println(MySQL 连接成功); } // 2. 测 Redis try (Jedis jedis new Jedis(127.0.0.1, 6379)) { jedis.auth(YourRedisPass123); jedis.set(test_key, hello); System.out.println(Redis 连接成功值 jedis.get(test_key)); } } }跑之前需要把 MySQL JDBC 驱动和 Jedis 的 jar 包放到 classpath 里。如果嫌麻烦用mysql命令行和redis-cli分别连一次也行但 Java 程序能同时验证 JDBC 驱动和网络连通性。我一般会先mysql -h 127.0.0.1 -u app_user -p确认 TCP 连接再用redis-cli -h 127.0.0.1 -a YourRedisPass123确认远程认证。Nginx 的验证更直接在/usr/local/nginx/html/下放一个index.html内容写nginx ok然后curl http://127.0.0.1看返回。如果配了反向代理就curl http://127.0.0.1/api/看是否转发到后端。我还会跑一次nginx -t和nginx -s reload确认配置热加载没问题。最后一步是开机自启确认。systemctl is-enabled mysqld、systemctl is-enabled nginx如果 Nginx 用 systemd 管理的话Redis 和 Nginx 如果是手动启动的得自己写 systemd unit 文件或者加到rc.local。我一般会写两个简单的 unit# /etc/systemd/system/redis.service [Unit] DescriptionRedis Afternetwork.target [Service] Typeforking ExecStart/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf ExecStop/usr/local/redis/bin/redis-cli -a YourRedisPass123 shutdown Restartalways [Install] WantedBymulti-user.target写完systemctl daemon-reload、systemctl enable redis、systemctl start redis。Nginx 同理把ExecStart换成/usr/local/nginx/sbin/nginxExecStop换成/usr/local/nginx/sbin/nginx -s stop。注意ExecStop里的 Redis 密码是明文unit 文件权限设成600别让普通用户读到。从那以后我每次装完这套环境都会强制走一遍“Java 连 MySQL Redis Nginx 反代”的联调哪怕只是测试机。因为单组件能跑不代表组合能跑端口、认证、SELinux、防火墙任何一个环节都能让你在半夜收到告警。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站