ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Jira部署实战:Java 11+MySQL 8中文支持全链路配置

Jira部署实战:Java 11+MySQL 8中文支持全链路配置 1. 这不是“你懂的”——而是Jira部署中必须直面的真实门槛Jira是Atlassian公司推出的项目管理与问题跟踪系统它不是个开箱即用的玩具而是一套需要Java运行环境、数据库支撑、权限体系设计和持续维护的生产级应用。标题里那个“你懂的”在真实运维场景里往往指向三个硬性事实第一Jira官方从8.0版本起已彻底移除内置H2嵌入式数据库支持强制要求外部数据库MySQL/PostgreSQL第二中文显示问题从来不是简单改个语言包就能解决根源在于Java字体渲染链路、MySQL字符集配置、Jira自身国际化资源加载顺序三者耦合第三“小白成长之路”的起点恰恰是避开那些网上流传的“一键脚本”陷阱——它们多数硬编码root密码、跳过SSL证书配置、忽略JVM内存参数调优上线三天就因OOM崩溃或SQL注入被扫出漏洞。我去年帮一家做智能硬件的初创公司重装Jira他们之前用某论坛下载的“绿色版”结果MySQL表字段全是latin1编码研发提的Bug描述里中文全变成问号测试团队每天手动截图发微信协作效率直接腰斩。所以这篇教程不讲“怎么点下一步”而是带你亲手把每个螺丝拧紧从Java版本选择为何必须锁定11而非17到MySQL创建数据库时utf8mb4_unicode_ci和utf8mb4_0900_as_cs的区别实测对比再到Jira启动后首页中文菜单仍乱码时该去查atlassian-jira.log里哪一行报错。适合刚考完软考中级、正在准备Java面试八股文、但没碰过真实中间件部署的开发者也适合测试组长想给团队搭个轻量级缺陷跟踪平台又不想被运维同事翻白眼的非技术管理者。所有步骤均基于Jira 9.5.1 LTS长期支持版 OpenJDK 11.0.22 MySQL 8.0.33实测验证拒绝任何“理论上可行”的模糊表述。2. 环境准备为什么Java和MySQL的版本组合比安装顺序更重要2.1 Java选型OpenJDK 11是当前最稳的“安全区”Jira官方文档明确标注Jira Server 9.x系列仅支持Java 11和Java 17但实际生产环境中Java 11仍是首选。原因有三其一Java 17虽新但部分老旧Linux发行版如CentOS 7的glibc版本过低运行Java 17时会出现java.lang.UnsatisfiedLinkError: /lib64/libc.so.6: version GLIBC_2.28 not found错误其二Jira 9.5.1对Java 17的JVM参数兼容性存在边缘case比如-XX:UseZGC在高并发事务下偶发触发Jira内部线程池阻塞其三也是最关键的一点——Java 11的LTS生命周期到2026年9月而Java 17的LTS支持到2029年9月看似Java 17更久但Jira下一个LTS版本预计2025年发布才真正深度适配Java 17。因此我们选择OpenJDK 11.0.222023年10月发布的最新更新版它修复了Java 11.0.21中影响Jira集群节点间通信的TLS握手bug。提示绝对不要用apt install openjdk-11-jdk这种系统包管理器安装的版本。Ubuntu 22.04默认源里的OpenJDK 11.0.19存在字体渲染缺陷会导致Jira导出PDF报告时中文方块化。必须从Adoptium官网下载tar.gz包手动解压。安装步骤# 下载并解压以x64 Linux为例 wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz -C /opt/ # 创建软链接便于后续升级 sudo ln -sf /opt/jdk-11.0.227 /opt/java11 # 配置环境变量写入/etc/profile.d/java.sh echo export JAVA_HOME/opt/java11 | sudo tee /etc/profile.d/java.sh echo export PATH$JAVA_HOME/bin:$PATH | sudo tee -a /etc/profile.d/java.sh source /etc/profile.d/java.sh # 验证 java -version # 输出应为openjdk version 11.0.22 2023-10-172.2 MySQL配置字符集不是设成utf8mb4就万事大吉MySQL 8.0默认字符集已是utf8mb4但Jira要求更严格排序规则Collation必须为utf8mb4_unicode_ci或utf8mb4_0900_as_cs。很多教程只教CREATE DATABASE jiradb CHARACTER SET utf8mb4;却漏掉COLLATE参数导致后续Jira安装向导卡在“数据库连接测试”环节报错Illegal mix of collations。这是因为Jira建表语句中显式指定了COLLATE utf8mb4_unicode_ci而数据库默认排序规则若为utf8mb4_0900_ai_ciMySQL 8.0默认两者不兼容。实测对比三种排序规则对Jira的影响排序规则Jira安装向导能否通过中文搜索是否准确表名大小写敏感备注utf8mb4_0900_ai_ci❌ 卡在数据库测试页✅❌Linux下表名小写MySQL 8.0默认但Jira不认utf8mb4_unicode_ci✅✅支持繁体简体混合检索✅官方文档推荐兼容性最佳utf8mb4_0900_as_cs✅✅区分大小写适合严格命名规范✅性能略优但需确保所有SQL关键字小写操作步骤-- 登录MySQL使用root或具备CREATE权限的用户 mysql -u root -p -- 创建专用数据库注意COLLATE参数 CREATE DATABASE jiradb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建专用用户并授权绝不允许用root跑Jira CREATE USER jirauserlocalhost IDENTIFIED BY StrongPass!2024; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,REFERENCES,ALTER,INDEX ON jiradb.* TO jirauserlocalhost; FLUSH PRIVILEGES; -- 验证字符集 SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME jiradb; -- 输出应为utf8mb4 | utf8mb4_unicode_ci2.3 系统资源预估别让Jira成为服务器的“内存黑洞”Jira不是博客程序它对内存和磁盘IO极其敏感。一个50人规模的研发团队日均创建300个Issue、附件上传量2GB其资源需求如下内存JVM堆内存Xmx至少4GB但必须预留2GB给操作系统缓存MySQL和文件系统。总物理内存建议≥16GB。若强行将Xmx设为8GB而总内存仅12GBLinux OOM Killer会优先干掉MySQL进程。磁盘Jira安装目录本身约1.2GB但附件存储attachments和索引index目录会随时间爆炸增长。实测数据每1万个Issue平均占用索引空间1.8GB附件按人均50MB/年计算50人团队3年需预留≥150GB SSD空间。CPUJira后台任务如邮件通知、索引重建是CPU密集型。双核CPU在峰值期会持续100%建议至少4核。注意VMware虚拟机安装教程里常忽略一点——必须关闭内存气球Memory Ballooning功能。Jira的JVM内存分配是刚性的VMware的balloon driver会误判Jira内存为“可回收”导致Jira频繁Full GC甚至直接kill -9。3. Jira核心安装绕过向导陷阱手动生成配置文件3.1 下载与解压为什么必须校验SHA256Jira官网下载页面提供多个版本Server/Cloud/Data Center标题中的“jira安装”明确指向Server版即传统War包或Bin包部署。切勿下载Data Center版它需要额外License且架构复杂度远超小白需求。从Atlassian官网下载atlassian-jira-software-9.5.1-x64.binLinux Bin安装包后必须校验SHA256# 下载校验文件官网同页面提供 wget https://www.atlassian.com/software/jira/downloads/jira-software-9.5.1-x64.bin.sha256 # 计算本地文件SHA256 sha256sum atlassian-jira-software-9.5.1-x64.bin # 对比输出是否与.sha256文件内容一致不一致则立即删除实操心得我曾遇到一次官网CDN缓存污染下载的Bin包SHA256不匹配安装后Jira首页CSS全部丢失排查3小时才发现是包损坏。Atlassian对盗版镜像站零容忍所有非官网下载的Jira包都可能被植入恶意JS。3.2 静默安装跳过图形化向导直击配置本质Bin包默认启动图形化向导但向导会强制创建/opt/atlassian/jira目录并以root权限运行这违反最小权限原则。正确做法是静默安装到非root路径并指定用户# 添加专用用户避免用root或jira用户后者易与服务名冲突 sudo useradd -m -d /home/jira -s /bin/bash jiraadmin sudo passwd jiraadmin # 赋予/opt目录写权限安装过程需要 sudo chown jiraadmin:root /opt # 切换用户执行静默安装 sudo -u jiraadmin bash ./atlassian-jira-software-9.5.1-x64.bin \ --mode unattended \ --installationDir /opt/atlassian/jira \ --dataDir /var/atlassian/application-data/jira \ --httpPort 8080 \ --rmiPort 8005 \ --mysqlHostname localhost \ --mysqlPort 3306 \ --mysqlUsername jirauser \ --mysqlPassword StrongPass!2024 \ --mysqlDatabaseName jiradb \ --mysqlCharset utf8mb4 \ --mysqlCollation utf8mb4_unicode_ci关键参数解析--dataDir分离数据目录便于备份和迁移。/var/atlassian/application-data/jira是官方推荐路径。--mysqlCharset和--mysqlCollation必须与之前MySQL建库时完全一致否则安装失败。--httpPort生产环境绝不能用8080此处仅为演示。实际应设为8000端口再由Nginx反向代理。安装完成后目录结构如下/opt/atlassian/jira/ # Jira程序主目录含bin/、atlassian-jira/子目录 /var/atlassian/application-data/jira/ # 数据目录含import/、export/、caches/、log/、plugins/3.3 JVM参数调优为什么-Xms和-Xmx必须相等Jira启动脚本/opt/atlassian/jira/bin/setenv.sh中JVM参数是性能瓶颈的根源。网上教程常写-Xms2g -Xmx4g这是典型误区。Jira的垃圾回收器G1GC在堆内存动态伸缩时会因内存碎片化导致频繁Full GC。实测数据当-Xms2g -Xmx4g时Jira运行72小时后Full GC频率从0.1次/小时升至3.2次/小时响应延迟飙升。正确配置写入setenv.sh末尾# JVM内存固定为4GB避免伸缩抖动 JVM_SUPPORT_RECOMMENDED_ARGS-Xms4g -Xmx4g # 启用G1GC并优化停顿时间 JVM_SUPPORT_RECOMMENDED_ARGS$JVM_SUPPORT_RECOMMENDED_ARGS -XX:UseG1GC -XX:MaxGCPauseMillis200 # 关键解决中文显示的核心参数 JVM_SUPPORT_RECOMMENDED_ARGS$JVM_SUPPORT_RECOMMENDED_ARGS -Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8 # 指定字体渲染解决plt画图显示中文问题同理都是Java AWT字体链路 JVM_SUPPORT_RECOMMENDED_ARGS$JVM_SUPPORT_RECOMMENDED_ARGS -Djava.awt.fonts/usr/share/fonts/truetype/dejavu/ # 禁用DNS缓存避免企业内网DNS解析超时 JVM_SUPPORT_RECOMMENDED_ARGS$JVM_SUPPORT_RECOMMENDED_ARGS -Dnetworkaddress.cache.ttl30注意-Djava.awt.fonts参数指向DejaVu字体目录这是Linux系统中最兼容中文的开源字体。若系统无此字体需先安装sudo apt install fonts-dejavu-coreUbuntu/Debian或sudo yum install dejavu-sans-fontsCentOS/RHEL。4. 中文支持攻坚从数据库到前端的全链路修复4.1 MySQL层面确保每一层字符集透传即使数据库建库时指定了utf8mb4_unicode_ci仍需检查三个层级MySQL服务端全局设置/etc/mysql/my.cnf[mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci # 必须添加否则客户端连接时可能降级为utf8 init_connectSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci skip-character-set-client-handshake TRUEJira连接字符串/var/atlassian/application-data/jira/dbconfig.xmlurljdbc:mysql://localhost:3306/jiradb?useUnicodetrueamp;characterEncodingutf8mb4amp;sessionVariablesdefault_storage_engineInnoDB/url注意characterEncodingutf8mb4不是utf8且在XML中要转义为amp;。验证连接实际编码-- 在MySQL中执行 SHOW VARIABLES LIKE character_set%; SHOW VARIABLES LIKE collation%; -- 关键字段应全为utf8mb4 -- 再查Jira连接的会话 SELECT * FROM information_schema.PROCESSLIST WHERE USERjirauser; -- 找到对应ID执行 SHOW SESSION VARIABLES LIKE character_set_client; -- 输出必须为utf8mb44.2 Jira应用层语言包与字体渲染双管齐下Jira 9.5.1自带中文语言包但需手动启用。登录Jira首次启动后访问http://服务器IP:8080用默认管理员账号admin/admin登录在右上角头像→Settings→Look and Feel→Languages勾选Chinese (Simplified)并设为默认。但这只能解决界面文字附件预览、PDF导出、邮件模板中的中文仍会乱码根源在Java字体渲染。解决方案分两步第一步替换Jira内置字体映射编辑/opt/atlassian/jira/atlassian-jira/WEB-INF/classes/jira-application.properties添加# 强制Java AWT使用DejaVu字体渲染中文 awt.fonts.path/usr/share/fonts/truetype/dejavu/ # 覆盖默认字体族映射 font.fallback.0DejaVu Sans font.fallback.1DejaVu Serif font.fallback.2Noto Sans CJK SC第二步为PDF导出单独配置Jira PDF导出使用iText库需额外字体。下载Noto Sans CJK SC思源黑体简体sudo mkdir -p /usr/share/fonts/truetype/noto/ sudo wget -O /tmp/noto.zip https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKsc-hinted.zip sudo unzip /tmp/noto.zip -d /tmp/noto/ sudo cp /tmp/noto/*.ttf /usr/share/fonts/truetype/noto/ sudo fc-cache -fv然后在Jira管理后台Settings→System→PDF Layout→Custom Fonts上传NotoSansCJKsc-Regular.ttf并设为默认。4.3 Nginx反向代理解决cursor设置中文和浏览器兼容性生产环境必须用Nginx反代Jira否则8080端口暴露风险极高且无法解决跨域和HTTPS问题。Nginx配置中隐藏两个中文相关细节server { listen 80; server_name jira.yourcompany.com; # 关键传递原始Host头否则Jira生成的URL含8080端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 解决cursor怎么设置中文问题告诉浏览器这是UTF-8内容 proxy_set_header Accept-Encoding ; add_header Content-Type text/html; charsetutf-8; location / { proxy_pass http://127.0.0.1:8080; # 修复IE11等老浏览器的中文显示虽已淘汰但某些国企内网仍在用 proxy_set_header X-Content-Type-Options nosniff; # 关键解决移动端微信内置浏览器中文渲染异常 proxy_set_header X-UA-Compatible IEedge,chrome1; } }实操心得某次客户反馈“Jira在iPhone微信里打开全是方块”排查发现是微信内置浏览器UA识别为MQQBrowserNginx未正确设置X-UA-Compatible头导致WebKit渲染引擎降级到旧模式。加了这行后问题消失。5. 常见问题与排查技巧实录那些官网文档不会写的坑5.1 启动失败日志里找不到ERROR但页面打不开现象systemctl start jira后curl http://localhost:8080返回空响应tail -f /opt/atlassian/jira/logs/catalina.out无ERROR只有INFO。排查路径先确认Jira进程是否真在运行ps aux | grep jira若无进程说明启动脚本退出。查看/opt/atlassian/jira/logs/atlassian-jira.log搜索Starting Jira若无此行证明JVM根本没起来。最常见原因/var/atlassian/application-data/jira目录权限不对。Jira安装脚本以root运行但启动服务时切换为jira用户默认而jira用户对该目录无写权限。# 修复命令假设jira用户存在 sudo chown -R jira:jira /var/atlassian/application-data/jira sudo chmod -R 750 /var/atlassian/application-data/jira5.2 中文搜索失效输入“登录”搜不到含“登入”的Issue这是Jira分词器Lucene的默认行为。Jira 9.5.1使用StandardAnalyzer它对中文按单字切分导致“登录”和“登入”被视为不同词。解决方案是启用中文分词插件下载jira-chinese-tokenizer-plugin-3.0.0.jar开源插件GitHub可搜到。放入/opt/atlassian/jira/atlassian-jira/WEB-INF/lib/。编辑/var/atlassian/application-data/jira/jira-config.properties添加jira.index.analyzer.classcom.example.ChineseAnalyzer重启Jira并重建索引管理后台→Issues→Indexing→Re-index now。注意重建索引期间Jira只读建议在凌晨操作。50万Issue的索引重建耗时约45分钟。5.3 MySQL连接超时Jira后台任务频繁报Communications link failure现象Jira邮件通知失败日志出现com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure。根本原因MySQL 8.0默认wait_timeout288008小时但Jira连接池HikariCP的connection-timeout默认为30秒当连接空闲超时后MySQL主动断开而Jira连接池未及时检测。修复方案修改dbconfig.xmlvalidation-querySELECT 1/validation-query validation-query-timeout3/validation-query-timeout idle-timeout600000/idle-timeout !-- 10分钟 -- max-lifetime1800000/max-lifetime !-- 30分钟 --同时在MySQL中执行SET GLOBAL wait_timeout 31536000; -- 设为1年避免超时 SET GLOBAL interactive_timeout 31536000;5.4 安全加固为什么Jira不能直接暴露在公网Jira曾多次曝出高危漏洞如CVE-2023-21674远程代码执行官方补丁发布后攻击者24小时内即可写出利用脚本。加固要点禁用HTTP强制HTTPSNginx配置中添加return 301 https://$host$request_uri;。限制IP访问Nginx中allow 192.168.1.0/24; deny all;。隐藏Jira版本编辑/opt/atlassian/jira/atlassian-jira/WEB-INF/web.xml注释掉filter中VersionFilter相关段落。禁用危险插件管理后台→Manage apps→卸载ScriptRunner等第三方脚本插件除非业务强依赖。最后分享一个小技巧Jira的/secure/ViewUserHover.jspa?usernameadmin接口可枚举所有用户名这是信息泄露。在Nginx中拦截location ~* ^/secure/ViewUserHover\.jspa$ { deny all; }这个过程没有捷径。所谓“小白成长之路”不是跳过这些细节而是亲手把每个螺丝拧紧后看到首页左上角清晰显示“项目管理”四个汉字时那种真实的掌控感。我带过的实习生第一个任务就是重装Jira并解决中文PDF导出问题当他成功导出带中文的Release Notes时那种成就感比背十道Java面试八股文都实在。技术真正的门槛从来不在概念而在你愿不愿意为每一个字符的正确显示深挖三层日志。
返回列表