Jira安装避坑指南:从环境决策到生产备份的完整实操
先泼一盆冷水Jira 的安装本身不难真正折磨人的是把环境、数据库、权限、备份这一套理顺。我见过太多人下载完安装包就开跑结果装到一半发现磁盘不够、内存分配不合理、MySQL 版本不对最后只能推倒重来。这篇东西就按我自己在实际部署里趟过的流程来写尽量把能预埋的坑先给你填了。这篇内容面向的是需要在本地或内网服务器上搭建 Jira 的运维、开发、测试人员。可能是要搭一个测试环境跑跑流程也可能是团队协作需要一套问题追踪系统。不管你属于哪种情况只要照着操作两三小时内能拿下一个可用的实例。1. 安装前想清楚三件事很多人一上来就想找安装包然后把 Jira 跑起来这其实是顺序搞反了。真正合理的顺序是先明确版本选择、规划好服务器配置、再考虑数据库选型。这三件事没想清楚后面每一步都可能翻车。1.1 版本选型Server 版和 Data Center 版怎么选Jira 官方现在提供三种形态Cloud、Server、Data Center。Cloud 是托管服务不做讨论自托管部署主要在 Server 和 Data Center 之间纠结。Server 版是传统意义上的单机部署数据都存在你自己的服务器上一次性买断 License早期模式后期也改成订阅了。Data Center 则面向集群和高可用场景支持多节点部署代价是 License 价格翻几倍。对于绝大多数中小团队来说Server 版的单机部署完全够用——你不需要多活不需要滚动升级一台配置好点的服务器搞定所有事。参考建议团队规模在 500 人以内选 Server 版就能平滑运行对可用性有硬性要求比如故障切换时间不能超过 10 分钟才考虑 Data Center明确后续要不要接很多第三方插件插件授权在 Data Center 里往往还要另算钱另外有个容易被忽略的事Atlassian 在 2021 年就宣布了 Server 版停售和 EOLEnd of Life时间Server 版新许可证在 2025 年后不再销售但已有的授权可以继续用。如果你现在部署的是测试环境用 Server 版仍然没问题如果要做长期生产规划至少心里要有数——后续可能需要迁移到 Data Center。1.2 服务器配置买多大内存、几核 CPU 才算够Jira 是 Java 应用跑在 JVM 上内存和磁盘 IO 就是它的命脉。我自己部署时遇到的最典型问题是按照官方最小值“2GB 内存”去配结果系统一开起来就卡成幻灯片索引构建时 CPU 直接打满。先给出一套经过实测的配置参考基于中小团队日常使用环境规模CPU内存系统盘数据盘测试/试用2 核4 GB40 GB SSD50 GB 以上50 人以内的生产4 核8 GB60 GB SSD100 GB 以上200 人左右的生产8 核16 GB100 GB SSD500 GB 以上注意Jira 的“数据盘”不只是 MySQL 的数据目录还有 Jira 的 HOME 目录里面装索引、附件、导入文件。附件大小往往比数据库还要夸张团队传几个大文件测试包几十 GB 就没了。所以数据盘按未来一年的附件增速去预估不要卡着最低线算。内存分配的技巧在后面配置 Java 参数时会详细说现在先记住一个总原则给系统留 1GB 左右内存剩下全部给 Java 堆。4GB 物理内存的机器别天真到把 3GB 都塞给 JVM。1.3 数据库选型MySQL 还是 PostgreSQLJira 官方同时支持 MySQL、PostgreSQL、Oracle、SQL Server 等实际部署中大部分人也就用前两种。关于选型我的建议是新部署、没有历史包袱优先选 PostgreSQL。它对 SQL 标准的支持更规范Jira 的兼容性测试覆盖得也更好遇到诡异语法错误的概率小如果团队里有专职 DBA 且对 MySQL 运维更熟练选 MySQL 5.7 或 8.x 也能稳定运行有一点必须特殊强调Jira 对数据库版本有硬性要求且对 MySQL 的版本兼容性要求极其苛刻。比如某个 Jira 版本明确不支持 MySQL 8.0.16 之前的一些版本或者某些旧版本对 MySQL 8.0.x 中的 caching_sha2_password 认证插件不支持。这些都是真实的坑。最稳妥的办法是先确定 Jira 版本再去官方文档查对应的数据库支持矩阵最后再建库。不要先装了 MySQL 最新版再回头看 Jira 支不支持。我见过一个团队装了 MySQL 8.0.28Jira 连不上报错信息也不够直观折腾了半天最后发现是 MySQL 认证插件不兼容这就是顺序搞反了的代价。1.4 网络与端口规划Jira 的默认端口是 HTTP 8080控制台端口是 8005这个端口默认是用来接受 shutdown 指令的生产环境最好改掉或加防火墙限制。如果你在内网部署8080 端口基本可以直接用如果在云服务器上记得在安全组放行 8080。另外还需要考虑数据库端口默认 MySQL 3306、PostgreSQL 5432。Jira 应用服务器和数据库服务器之间如果隔了防火墙一定要保证双向放通。这里有一个常被忽略的点Jira 服务器所在的主机阿里云/腾讯云安全组放行不算完系统自带的 firewalld 或 iptables 也得放行。我遇到过一个客户安全组全放开了内部防火墙没有放行 3306数据库连接超时排查了很久才发现是这个原因。2. 环境准备与依赖安装到这一步才开始真正动手。Jira 是 Java 写的但别急着装最新版 JDK——Jira 对 Java 版本有固定要求装错了版本启动时直接失败或者某些功能不可用。2.1 操作系统基础配置我习惯用 CentOS 7 系或者 Ubuntu 20.04 LTS / 22.04 LTS 来部署。如果你也用的是 CentOS 7注意 CentOS 7 官方已经停止维护了如果条件允许建议切到 Alibaba Cloud Linux、Anolis OS 或者 Ubuntu LTS。操作系统层面要做的事情很简单更新系统软件包关闭 SELinux如果不想关闭至少要设置为 permissive 模式否则会有诡异的权限问题调整文件描述符上限系统默认 1024 一般也够用但建议调大2.2 Java 环境准备先说 Java 版本选择。以 Jira 8.22 和 Jira 9.x 为例8.22 支持 Java 8 和 Java 119.x 则要求 Java 11。安装完 Jira 后你可以通过java -version检查也可以在 Jira 的排障信息里查看。我推荐使用 OpenJDK 11各发行版仓库里都有直接装就行。如果系统自带的是 Java 8而你要装 Jira 9.x那就必须先升级 Java。有些部署教程会建议用 Oracle JDK但没必要OpenJDK 完全满足要求还免了授权顾虑。以 Ubuntu 为例安装 Java 11 的命令sudo apt update sudo apt install -y openjdk-11-jdk java -version安装完之后要确认一下JAVA_HOME环境变量是否设置。在很多发行版里命令能执行java -version不代表 JAVA_HOME 正确配置了。Jira 的启动脚本setenv.sh里最好显式指定 JAVA_HOME避免后续系统默认 JDK 变化时把 Jira 搞挂。2.3 数据库创建与账号权限这是全局最容易出错的一步。以 PostgreSQL 为例整个配置过程有明确的顺序安装 PostgreSQL这里以 Ubuntu 为例CentOS 的仓库包名略有差异sudo apt install -y postgresql postgresql-contrib sudo systemctl enable postgresql sudo systemctl start postgresql切换为 postgres 用户进入 psqlsudo -u postgres psql注意PostgreSQL 9.x 中的认证机制叫做scram-sha-256Jira 里配置数据库连接串时需要指定对应的认证方法否则会报密码认证失败的错。创建专门给 Jira 用的数据库和账号CREATE DATABASE jiradb WITH ENCODING UTF8 LC_COLLATE C LC_CTYPE C TEMPLATE template0; CREATE USER jirauser WITH PASSWORD strong_password; GRANT ALL PRIVILEGES ON DATABASE jiradb TO jirauser; GRANT USAGE, CREATE ON SCHEMA public TO jirauser;这里最重要的坑Jira 对数据库字符集和排序规则有硬性要求。数据库必须使用 UTF-8 编码。如果不指定ENCODING UTF8默认库模板可能是 SQL_ASCII 或其他乱七八糟的编码后续 Jira 页面中文会直接变成乱码而且这个乱码不是通过改个配置文件就能修复的只能重建数据库。这就是为什么我在建库命令里加了TEMPLATE template0——因为默认的 template1 库的编码往往不符合要求直接从 template0 建最省事。LC_COLLATE C LC_CTYPE C是避免排序规则导致索引同步失败的关键。很多安装教程里没有这一步如果按默认的en_US.UTF-8排序规则创建库某些 Jira 版本会在构建索引时报 “could not find valid identifier” 之类的错误。如果是 MySQL建库语句如下CREATE DATABASE jiradb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;注意 MySQL 5.7 里时区设置可以用SET GLOBAL time_zone 08:00;这个问题如果不处理Jira 页面时间和数据库时间对不上日志排查时逻辑容易混乱。2.4 Jira 部署包下载Atlassian 的官方下载链接可以直接拿到。不同版本的下载地址不同最靠谱的方式是通过 Atlassian 的 Archive 页面或者直接改版本号拼 URL。以 Jira Software 8.22.11 为例Linux 64 位的 tar.gz 包可以从官方 Archive 地址拉取。提醒一句国内网络环境下从官方源下载 Jira 可能有点慢建议挂代理或者用下载工具支持断点续传。文件大概 400MB 上下断线重传功能比什么都重要。3. 安装与初始化配置软件包的安装其实就是解压和改配置。Jira 的目录结构分为两大部分安装目录和 HOME 目录。安装目录放程序文件HOME 目录放数据和配置。搞清楚这个分隔是理解 Jira 运维的第一步。3.1 解压与目录规划把下载好的 tar.gz 包放到规划目录下我习惯放在/opt下cd /opt tar -zxvf atlassian-jira-software-8.22.11.tar.gz mv atlassian-jira-software-8.22.11-standalone jira再创建 HOME 目录mkdir -p /var/jira_home强烈建议把 HOME 目录放在独立的数据盘或分区上不要放在根分区。因为附件和索引会一直增长根分区满了系统直接挂掉。HOME 目录的位置会在首次启动向导里让你填也可以提前在jira-application.properties里指定。3.2 配置文件调整与内存参数计算Jira 的 JVM 参数配置放在安装目录/bin/setenv.sh文件里。这个文件默认内容中 JVM_MINIMUM_MEMORY 和 JVM_MAXIMUM_MEMORY 分别是 256MB 和 512MB这对于实际运行来说完全不够一启动就会卡。我建议的调整思路先看物理内存总量给操作系统和数据库留出余量剩下的全给 JVM 堆。比如一台 8GB 内存的服务器数据库也装在同一台机器上那么 JVM 最大堆建议设置在 4GB 左右。如果数据库单独一台机器8GB 内存可以给到 5GB~6GB。编辑 setenv.sh找到这行JIRA_MAXIMUM_MEMORY4g JIRA_MINIMUM_MEMORY1g这两个值的意义JIRA_MINIMUM_MEMORY是 JVM 启动时分配的初始堆大小JIRA_MAXIMUM_MEMORY是最大堆内存上限。把初始值和最大值设成一致可以避免 JVM 频繁扩容堆时产生卡顿所以我一般会把两者设为相同值至少也不要差太大。还建议在 setenv.sh 里加上JVM_SUPPORT_RECOMMENDED_ARGS参数增加 GC 日志输出和时区指定JVM_SUPPORT_RECOMMENDED_ARGS-Duser.timezoneAsia/Shanghai -XX:HeapDumpOnOutOfMemoryError这个参数有两个作用一是把 JVM 的默认时区默认是 UTC改成东八区避免日志里时间差 8 小时的问题二是在发生内存溢出时自动 dump 堆内存快照后面排查 OOM 原因时有据可查。3.3 启动服务与首次页面配置配置好之后就可以尝试启动了/opt/jira/bin/start-jira.sh第一次启动会比较慢因为 Jira 要创建数据表并初始化。可以通过日志观察进度tail -f /opt/jira/logs/atlassian-jira.log看到类似 “Jira has been started” 之类的日志就说明启动成功了。然后浏览器打开http://服务器IP:8080会看到 Jira 的初始配置向导。向导第一步要求设置数据库连接。如果你用的是 PostgreSQLJDBC 连接串大概是这样的jdbc:postgresql://localhost:5432/jiradb如果你用的是 MySQL连接串是jdbc:mysql://localhost:3306/jiradb?useUnicodetruecharacterEncodingutf8useSSLfalse填写时注意连接串里面不要拼错 schema 名称和密码。如果发生连接错误请重点确认数据库密码、端口、字符集。密码和端口写错的概率最高别问我是怎么知道的。向导下一步会要求设置应用属性Application Title、Mode 等。Mode 一般选择 “Private”私有这样不会把项目暴露给未登录用户。接着会进入 License Key 输入页面。测试环境可以用 Atlassian 提供的免费试用 License或者使用测试专用的开发 License。如果你正式购买了授权把 License Key 粘贴进去就行。3.4 基础配置语言、许可证、应用设置安装完成后进入 Jira 管理后台右上角齿轮图标 → System。有几个基础配置建议在第一时间完成默认语言在 System → General Configuration 里可以把默认语言设置为“中文简体”也可以不设让每个用户自己切邮件通知在 System → Mail 里配置 SMTP 服务。没有邮件通知的 Jira 等于失去了一半功能——你希望有人 你时能收到邮件提醒而不是隔一天才自己打开系统看用户注册内网环境建议关闭用户自助注册由管理员统一创建4. 上线后的必备配置与安全加固服务能访问就算安装成功了吗在我看来还远远不够。不做安全加固、不做备份方案这样的 Jira 就像在裸奔。这一节集中讲生产环境必须处理好的四件事。4.1 服务化管理与开机自启手工跑start-jira.sh启动不叫部署。服务器重启以后你要是忘了拉起来那就是事故。建议注册成 systemd 服务。创建一个服务文件/etc/systemd/system/jira.service[Unit] DescriptionAtlassian Jira Service Afternetwork.target postgresql.service [Service] Typeforking Userjira Groupjira ExecStart/opt/jira/bin/start-jira.sh ExecStop/opt/jira/bin/stop-jira.sh Restarton-failure LimitNOFILE65536 [Install] WantedBymulti-user.target有几个细节需要说明Userjira是让 Jira 以专用账号运行不要用 root 跑。Linux 下有安全机制root 启动 Java 进程可能遭遇各种环境变量问题而专用账号还能限制权限LimitNOFILE65536是因为 Atlassian 官方建议提高文件句柄上限。Jira 要打开很多文件索引文件、日志文件、附件默认的 1024 可能不够导致文件操作失败Restarton-failure是让服务在异常退出时自动拉起。注意Typeforking的选择要和启动脚本行为匹配——start-jira.sh 这个脚本启动完就立即返回Jira 进程会在后台持续运行所以不能使用默认的 simple 类型创建完服务文件后执行systemctl daemon-reload systemctl enable jira.service systemctl start jira.service4.2 反向代理与 HTTPS 配置Jira 默认是 HTTP 8080 直接暴露。如果只是内网访问问题不大一旦要通过公网访问强烈建议在前面加一层 Nginx 做 TLS 终止和反代。这能解决两个实际问题一是你不想让用户记一个带端口号的地址二是公网上跑裸 HTTP 调用 API 会报安全警告总是不太好看。Nginx 配置参考server { listen 443 ssl; server_name jira.example.com; ssl_certificate /etc/nginx/ssl/jira.example.com.pem; ssl_certificate_key /etc/nginx/ssl/jira.example.com.key; client_max_body_size 100M; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }proxy_set_header Host $host是必须的否则 Jira 会认为是访问了错误的域名或端口重定向时可能把请求改写到 8080 端口导致反代失效。配置好反代后还需要同步修改 Jira 自己的配置把基础 URL 改掉。在 Jira 后台 → System → General Configuration 里找到 “Base URL”改成你的域名地址否则 Jira 生成的邮件链接、API 返回的 URL 全部都会是http://服务器IP:8080转发到域名就没意义了。4.3 备份方案从文件备份到数据库备份Jira 的备份不是只导出一份数据库就能万事大吉的附件目录、索引目录都不可丢。完整的备份包含三块内容数据库备份Jira HOME 目录下的data附件和export导出目录Jira 安装目录下的配置如有自定义修改下面是一套我惯用的备份脚本思路#!/bin/bash DATE$(date %Y%m%d) BACKUP_DIR/backup/jira mkdir -p $BACKUP_DIR # 备份数据库 pg_dump -U jirauser -h 127.0.0.1 -F c -f $BACKUP_DIR/jiradb_$DATE.dump jiradb # 备份附件和配置 tar -czf $BACKUP_DIR/jira_home_$DATE.tar.gz /var/jira_home # 保留最近 7 天备份删除更早的 find $BACKUP_DIR -type f -mtime 7 -exec rm {} \;把这脚本放到 crontab 里每天凌晨执行。注意-F c输出的自定义格式将来用 pg_restore 恢复时非常灵活。Jira 自身的附件数据就靠那一条 tar 命令完成。很多团队部署完 Jira 以后不做备份直到某个人把数据误删才追悔莫及。备份这件事别心存侥幸磁盘便宜数据无价。4.4 插件与邮件通知配置Jira 的生态优势在插件上非常明显但装插件前要想清楚很多市场插件会和 Jira 核心版本强绑定版本升级后插件不匹配会导致整个系统无法启动。安装插件以前先去 Atlassian Marketplace 确认该插件兼容你当前的 Jira 版本。邮件通知配置也是一样SMTP 服务器和账号密码准备好以后在后台里填进去发一个测试邮件确认通了再收工。这一步能做的事不大但没做的话后面所有通过邮件触发的通知流全部失效用户只会觉得 Jira “没反应”。5. 常见问题与排查实录从实际部署和后期运维来看Jira 最消耗人力的部分往往是问题排查。这里把我遇到过的高频问题集中整理成一张速查表方便你直接对号入座。问题现象根本原因解决思路启动后页面一直在加载CPU 100%索引构建任务在后台运行等几分钟看日志进度如果一直卡住考虑磁盘 IO 是否成为瓶颈数据库连接超时数据库端口未放行或数据库服务挂了用 telnet 探测端口用 ps 查看服务状态中文乱码数据库字符集不是 UTF-8只能重建数据库没有快捷修复路径附件上传失败Nginx 的 client_max_body_size 太小调大 Nginx 上传限制同时检查 Jira 附件大小限制内存溢出JVM 堆太小或附件加载过多查看日志中的 OutOfMemoryError适当调大 JVM_MAXIMUM_MEMORY访问页面出现 502 Bad GatewayNginx 反代时 Jira 未启动或端口写错检查 8080 端口是否监听检查 Nginx 错误日志忘记管理员密码太久没登录密码遗忘需要通过 Jira 内部数据库表修改具体方法见下文控制台端口 8005 对外暴露安全漏洞防火墙限制或修改 shutdown 端口配置5.1 内存溢出与频繁卡顿最典型的是 Jira 在运行几天后突然变得特别缓慢查看日志发现频繁出现java.lang.OutOfMemoryError: Java heap space。这种问题通常是 JVM 堆参数设置不合理。如果是 4GB 内存的机器却只给了 JVM 512MB 的堆一旦索引构建或批量 JQL 查询时内存不够用系统就卡成死机状。处理方式修改 setenv.sh 把内存调大同时加上 GC 日志输出。注意调完内存后要重启服务。如果重启后还是频繁 OOM就得考虑是不是磁盘太慢导致索引读写时间过长或者某些插件本身就有内存泄漏的毛病。5.2 数据库连接超时或认证失败部署数据库和 Jira 分离时这个连接问题出现的频率最高。排查思路按顺序走用telnet 数据库地址 3306测试端口是否通检查 MySQL/PostgreSQL 是否允许远程连接默认 MySQL 只绑定了 127.0.0.1PostgreSQL 默认只监听 localhostPostgreSQL 需要修改 3 个文件postgresql.conf中的 listen_addresses 改为*pg_hba.conf中添加客户端网段授权行MySQL 调整监听地址的方式是修改my.cnf中的 bind-address 为 0.0.0.0。5.3 启动失败与版本冲突启动失败的现场一般在日志里都有直接记录。我最常遇到的是 Java 版本不兼容明明系统装了 Java 11Jira 还是起不来因为 Jira 需要特定小版本。这时候直接用官网指定的 OpenJDK 版本重新安装并且修改 setenv.sh 里的 JAVA_HOME 指向新路径。另一个排查技巧启动脚本start-jira.sh会通过jira.sh最终调用 Java如果系统里有多个 Java 版本务必在 setenv.sh 里显式写死JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd645.4 忘记管理员密码等日常运维问题Jira 管理员的密码忘记了可以进入数据库调整。操作思路是找到对应的用户表将当前管理员密码置为已知值。注意要了解 Jira 对密码的存储方式不同版本实现有差异操作前先在测试环境验证生产环境务必先备份数据库表。还有一些看似小但实际很影响体验的问题时区不对导致到期时间判断异常项目里看到的时间永远比实际晚 8 小时排查冲突问题时容易懵。解决办法就是按照前面说的在 setenv.sh 里加-Duser.timezoneAsia/Shanghai同时把数据库时区也调整到一致前后端时间就能对上。6. 部署过程中的几点心得整理几点不容易在官方文档里看到、但实际部署非常受用的体会。第一Jira 对磁盘性能的敏感程度远超对 CPU 的要求。我用机械硬盘部署过一次测试环境JQL 复杂查询的响应时间能到 20 多秒换成 SSD 之后直接降到 1 秒以内。所以预算有限时把钱花在 SSD 上比花在高配 CPU 上更值得。第二安装阶段的目录规划至关重要。一旦 Jira 已经开始使用HOME 目录再想迁移就非常麻烦。最稳妥的方案是提前把 HOME 目录放在独立的数据盘并配置好挂载而不是直接放在根分区里。第三安全加固别忽视。我见过没有做任何安全配置的 Jira直接暴露在公网上天天被恶意扫描、垃圾注册、蛮力登录整得焦头烂额。如果你确实要开启公网访问请务必做好 HTTPS、限制登录失败次数、开启双因素认证Atlassian 提供插件支持。第四升级 Jira 时要养成看升级说明的习惯。跨大版本升级比如 8.x → 9.x时插件兼容性、数据库版本支持列表、配置改动每一项都可能变成升级的拦路虎。盲目上生产环境升级中途报错的代价远大于升级前的准备时间。最后分享一个提升日常运维效率的做法搭建好 Jira 之后第一时间用 API 发几个测试请求确认 REST API 通。这样后续写脚本做自动化比如批量导入任务、同步用户组、获取项目数据时你会发现自己已经提前把环境验证好了。Jira 的安装和配置核心就一句话决策前置、配置合理、备份到位。把遇到的问题按这个思路去拆大多数都能顺藤摸瓜找到答案。