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.22(2023年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.22+7 /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_ci(MySQL 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 'jirauser'@'localhost' IDENTIFIED BY 'StrongPass!2024'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,REFERENCES,ALTER,INDEX ON jiradb.* TO 'jirauser'@'localhost'; 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而总内存仅12GB,Linux OOM Killer会优先干掉MySQL进程。
- 磁盘:Jira安装目录本身约1.2GB,但附件存储(attachments)和索引(index)目录会随时间爆炸增长。实测数据:每1万个Issue平均占用索引空间1.8GB,附件按人均50MB/年计算,50人团队3年需预留≥150GB SSD空间。
- CPU:Jira后台任务(如邮件通知、索引重建)是CPU密集型。双核CPU在峰值期会持续100%,建议至少4核。
注意:VMware虚拟机安装教程里常忽略一点——必须关闭内存气球(Memory Ballooning)功能。Jira的JVM内存分配是刚性的,VMware的balloon driver会误判Jira内存为“可回收”,导致Jira频繁Full GC甚至直接kill -9。
3. Jira核心安装:绕过向导陷阱,手动生成配置文件
3.1 下载与解压:为什么必须校验SHA256
Jira官网下载页面提供多个版本(Server/Cloud/Data Center),标题中的“jira安装”明确指向Server版(即传统War包或Bin包部署)。切勿下载Data Center版,它需要额外License且架构复杂度远超小白需求。从Atlassian官网下载atlassian-jira-software-9.5.1-x64.bin(Linux 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:MaxGCPauseMillis=200" # 关键!解决中文显示的核心参数 JVM_SUPPORT_RECOMMENDED_ARGS="$JVM_SUPPORT_RECOMMENDED_ARGS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-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.ttl=30"注意:
-Djava.awt.fonts参数指向DejaVu字体目录,这是Linux系统中最兼容中文的开源字体。若系统无此字体,需先安装:sudo apt install fonts-dejavu-core(Ubuntu/Debian)或sudo yum install dejavu-sans-fonts(CentOS/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_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci' skip-character-set-client-handshake = TRUEJira连接字符串(
/var/atlassian/application-data/jira/dbconfig.xml):<url>jdbc:mysql://localhost:3306/jiradb?useUnicode=true&characterEncoding=utf8mb4&sessionVariables=default_storage_engine=InnoDB</url>注意
characterEncoding=utf8mb4(不是utf8),且&在XML中要转义为&。验证连接实际编码:
-- 在MySQL中执行 SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; -- 关键字段应全为utf8mb4 -- 再查Jira连接的会话 SELECT * FROM information_schema.PROCESSLIST WHERE USER='jirauser'; -- 找到对应ID,执行 SHOW SESSION VARIABLES LIKE 'character_set_client'; -- 输出必须为utf8mb4
4.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.0=DejaVu Sans font.fallback.1=DejaVu Serif font.fallback.2=Noto 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; charset=utf-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 "IE=edge,chrome=1"; } }实操心得:某次客户反馈“Jira在iPhone微信里打开全是方块”,排查发现是微信内置浏览器UA识别为
MQQBrowser,Nginx未正确设置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/jira
5.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.class=com.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_timeout=28800(8小时),但Jira连接池(HikariCP)的connection-timeout默认为30秒,当连接空闲超时后,MySQL主动断开,而Jira连接池未及时检测。
修复方案(修改dbconfig.xml):
<validation-query>SELECT 1</validation-query> <validation-query-timeout>3</validation-query-timeout> <idle-timeout>600000</idle-timeout> <!-- 10分钟 --> <max-lifetime>1800000</max-lifetime> <!-- 30分钟 -->同时在MySQL中执行:
SET GLOBAL wait_timeout = 31536000; -- 设为1年,避免超时 SET GLOBAL interactive_timeout = 31536000;5.4 安全加固:为什么Jira不能直接暴露在公网?
Jira曾多次曝出高危漏洞(如CVE-2023-21674远程代码执行),官方补丁发布后,攻击者24小时内即可写出利用脚本。加固要点:
- 禁用HTTP,强制HTTPS:Nginx配置中添加
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?username=admin接口可枚举所有用户名,这是信息泄露。在Nginx中拦截:location ~* ^/secure/ViewUserHover\.jspa$ { deny all; }
这个过程没有捷径。所谓“小白成长之路”,不是跳过这些细节,而是亲手把每个螺丝拧紧后,看到首页左上角清晰显示“项目管理”四个汉字时,那种真实的掌控感。我带过的实习生,第一个任务就是重装Jira并解决中文PDF导出问题,当他成功导出带中文的Release Notes时,那种成就感比背十道Java面试八股文都实在。技术真正的门槛,从来不在概念,而在你愿不愿意为每一个字符的正确显示,深挖三层日志。