使用 SSL 将 JIRA 与 Apache 集成
Atlassian 应用程序允许在我们的产品内使用反向代理,但 Atlassian 支持部门不提供相关配置帮助。因此,Atlassian 不能保证为它们提供任何支持。
如果需要相关配置帮助,请在 Atlassian Answers 上提问。
本页介绍了如何利用 mod_proxy 和 mod_ssl,将 Apache HTTP Server(也称为 httpd
)与 JIRA 集成,以便 Apache 通过 HTTPS 作为反向代理运行。如果需要 HTTP 配置,请参见我们的将 JIRA 与 Apache 集成文档。通过配置 Apache,您可以在非标准 HTTP 端口(如 8080)上运行 JIRA,并且用户能够通过标准 HTTPS 访问 JIRA,因为他们的通信将通过代理传送并在网络外部加密。
- 在其自己的域中直接访问:https://atlassian.com/
- 作为其他域的子域访问:https://jira.atlassian.com
- 通过域或子域的上下文路径访问:https://atlassian.com/jira
这意味着 SSL 证书将在 Apache 而不是 Tomcat 中进行管理,此外,Apache 和 Tomcat 之间的连接也不会加密。但浏览器和外部网络之间的连接将被加密。这适用于 JIRA 服务器与 Apache 服务器位于同一网络内的配置,如下所示:
客户端浏览器 -> HTTPS -> Apache 代理 -> HTTP -> Tomcat (JIRA)
本页内容:
这是具有多个 SSL 证书和/或 Web 应用,并且都在一个位置 (Apache) 进行管理的网络的通用配置。
如果需要更复杂的解决方案,请参见 Apache HTTP Server 版本文档、咨询组织内的 Apache SME,如果需要,还可以在 Atlassian Answers 上提问,或与我们的 Atlassian 专家联系。
- JIRA 在 LAN 内一个服务器的 8080 端口上运行,该服务器无法从外部访问(路由器/防火墙不会将 8080 端口的流量转发给它)。
- Apache 设置在另一个服务器(或与 JIRA 相同的服务器)上,该服务器可以通过 HTTPS (443) 从外部访问。
- 然后,系统通过 HTTPS 使用相应的 URL (
VirtualHost
) 访问 Apache,从而将流量路由到 JIRA 服务器或从中路由出来。
开始之前
预计在配置 Apache 之前,SSL 证书已经过 CA 签名并采用 PEM 格式。有关准备和生成 SSL 证书方面的帮助,请咨询 SSL 供应商(例如,GoDaddy、Verisign、RapidSSL)。
确定是否使用域、子域或上下文路径在很大程度上取决于所提供的 SSL 证书类型以及有关网站配置的所有业务规则。要准确无误地运行 SSL,域就必须与证书的通用名称 (CN) 相匹配。
下表说明了哪些 URL 可与证书 CN 一起使用,还推荐了可以使用的 URL。
JIRA FQDN | 通用名称 | 有效 | 推荐的 JIRA FQDN |
---|---|---|---|
https://jira.atlassian.com | jira.atlassian.com | https://jira.atlassian.com | |
https://jira.atlassian.com | *.atlassian.com | https://jira.atlassian.com | |
https://jira.atlassian.com | atlassian.com | https://atlassian.com/jira | |
https://atlassian.com | atlassian.com | https://atlassian.com/jira | |
https://atlassian.com | jira.atlassian.com | https://jira.atlassian.com |
CN 中带有星号 (*) 的证书是通配符证书,可以支持该域的任何子域。如果您不确定要使用的 URL,请咨询系统管理员和提供证书的 SSL 供应商。
步骤 1:配置 Tomcat
- 关闭 JIRA。
(可选:如果 JIRA 不需要上下文路径,请跳过此步骤。)
编辑 Tomcat 的
server.xml
,使其包含所需的 JIRA 上下文路径。下面的示例使用了path="jira"
,这意味着,如果采用的是默认 JIRA 端口,即可通过http://jiraserver:8080/jira
访问 JIRA。<Engine defaultHost="localhost" name="Catalina"> <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <Context docBase="${catalina.home}/atlassian-jira" path="/jira" reloadable="false" useHttpOnly="true"> <!-- ==================================================================================== Note, you no longer configure your database driver or connection parameters here. These are configured through the UI during application setup. ==================================================================================== --> <Resource auth="Container" factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" name="UserTransaction" type="javax.transaction.UserTransaction"/> <Manager pathname=""/> </Context> </Host>
HTML/XML确保
path
值的前面带有正斜杠 (/
)。例如,应为path="/jira"
而不是path="jira"
。编辑 Tomcat 的
server.xml
,使其包含用于代理请求的单独的连接器。这需要scheme
、proxyName
和proxyPort
属性。将这些属性替换为代理的相应域和端口,如下例所示:<Service name="Catalina"> <!-- Apache Proxy Connector with values for scheme, proxyName and proxyPort --> <Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" scheme="https" proxyName="jira.atlassian.com" proxyPort="443"/> <!-- Standard HTTP Connector --> <Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" port="8081" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" />
HTML/XML- 禁止在 Tomcat 内重定向到 HTTPS(如果已启用)- 例如,在通过 SSL 或 HTTPS 运行 JIRA 应用 中对
WEB-INF/web.xml
做出的变更将导致使用 Apache 时发生错误。 - 启动 JIRA。
- 测试 JIRA 是否可通过标准连接器访问,如果适用,请使用上下文路径(如
http://jiraserver:8081/jira
)进行测试。 - 通过相应的代理连接器访问 JIRA,测试新连接器是否已生效。具体行为取决于上下文路径:
- 如果上下文路径为空或根 (
/
) 路径,则通过代理连接器(例如http://jiraserver:8080/
)访问 JIRA 时,您会在进入 JIRA 时收到警告: - 如果上下文路径不为空或根目录 (
/
),如/jira
,则通过代理连接器(如http://jiraserver:8080/jira
)访问 JIRA 会将您重定向到已配置的代理(如https://jira.atlassian.com/jira
)。
- 如果上下文路径为空或根 (
为了在 JIRA 上进行测试,我们使用两个不同的 Tomcat 连接器并在需要时绕过代理,因为这在故障排除时会很有用。预计无法从网络外对标准连接器进行外部访问(防火墙不会向其转发任何端口)。
步骤 2:配置 Apache HTTP Server
本文档未介绍如何安装 Apache 和配置 DNS。此外,文档假设已针对 JIRA 域安装了 Apache 2.2 并配置了 DNS 条目。由于 Apache 的配置特定于所使用的操作系统,因此本文档只提供了部分发行版及其配置。
2.1 启用代理模块
Debian/Ubuntu
按照以下方式启用模块:
$ sudo a2enmod proxy_http sslConsidering dependency proxy for proxy_http:Enabling module proxy.Enabling module proxy_http.Enabling module ssl.See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.To activate the new configuration, you need to run: service apache2 restart
BASH- 重新启动 Apache。
Windows/其他操作系统
找到并编辑
httpd.conf
文件,添加以下行(如果不存在):LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_http_module modules/mod_proxy_http.soLoadModule ssl_module modules/mod_ssl.so
CODE- 重新启动 Apache。
2.2 配置 Apache 以使用这些模块
Debian/Ubuntu
- 切换到用户
root
。 - 备份现有实例或创建新实例。本文档不涵盖有关创建新实例的内容(复制默认实例应该足够了)。
- 修改
$APACHE_INSTALL/sites-available
中的现有实例,如default-ssl
。 将以下内容添加到
VirtualHost
中,将jiraserver
替换为 JIRA 服务器的主机名并修改端口(若需要)。在其自己的域或子域中访问:
# JIRA Proxy Configuration:<Proxy *> Order deny,allow Allow from all</Proxy>SSLProxyEngine OnProxyRequests OffProxyPreserveHost OnProxyPass / http://jiraserver:8080/ProxyPassReverse / http://jiraserver:8080/
如果 URL 末尾缺少正斜杠,则会出现代理错误,因此请确保正确添加正斜杠!
使用以下上下文路径:
# JIRA Proxy Configuration:<Proxy *> Order deny,allow Allow from all</Proxy>SSLProxyEngine OnProxyRequests OffProxyPreserveHost OnProxyPass /jira http://jiraserver:8080/jiraProxyPassReverse /jira http://jiraserver:8080/jira
使用的路径必须与 Tomcat 上下文路径相同。例如,将
/jira
转发到/jira520
必须使用大量的重写规则,而这些规则有时并不可靠。按照以下方式启用实例:
# a2ensite default-sslEnabling site default-ssl.To activate the new configuration, you need to run: service apache2 reload
CODE- 将证书和私有密钥复制到相应目录中。
按照以下方式将其包含在 Apache 配置中,位于
VirtualHost
内:SSLCertificateFile /etc/ssl/certs/jira.crtSSLCertificateKeyFile /etc/ssl/private/jira.key
(可选):
SSLCertificateChainFile
的配置将包含由 CA 供应商提供并签字的中间证书。请咨询 CA 供应商以确认这是否有必要。SSLCertificateChainFile /etc/ssl/certs/jiraintermediate.crt
- 重新加载 Apache 配置。
- 进行测试,方法是通过 Apache 访问 JIRA,例如 http://jira.com 或 http://atlassian.com/jira。
Windows/其他操作系统
- 找到并编辑
httpd.conf
文件。 将以下内容添加到
VirtualHost
中,将jiraserver
替换为 JIRA 服务器的主机名并修改端口(若需要)。在其自己的域或子域中访问:
# JIRA Proxy Configuration:<Proxy *> Order deny,allow Allow from all</Proxy>SSLProxyEngine OnProxyRequests OffProxyPreserveHost OnProxyPass / http://jiraserver:8080/ProxyPassReverse / http://jiraserver:8080/
如果 URL 末尾缺少正斜杠,则会出现代理错误,因此请确保正确添加正斜杠!
使用上下文路径:
# JIRA Proxy Configuration:<Proxy *> Order deny,allow Allow from all</Proxy>SSLProxyEngine OnProxyRequests OffProxyPreserveHost OnProxyPass /jira http://jiraserver:8080/jiraProxyPassReverse /jira http://jiraserver:8080/jira
使用的路径必须与 Tomcat 上下文路径相同。例如,将
/jira
转发到/jira520
必须使用大量的重写规则,而这些规则有时并不可靠。- 将证书和私有密钥复制到相应目录中。
按照以下方式将其包含在 Apache 配置中,位于
VirtualHost
内:SSLCertificateFile /etc/ssl/certs/jira.crtSSLCertificateKeyFile /etc/ssl/private/jira.key
(可选):
SSLCertificateChainFile
的配置将包含由 CA 供应商提供并签字的中间证书。请咨询 CA 供应商以确认这是否有必要。SSLCertificateChainFile /etc/ssl/certs/jiraintermediate.crt
- 重新启动 Apache。
- 进行测试,方法是通过 Apache 访问 JIRA,例如 http://jira.com 或 http://atlassian.com/jira。
2.3 将 HTTP 重定向到 HTTPS
可以通过以下任一方法执行此操作:
- 设置 HTTP
VirtualHost
以跳转到同一 Tomcat 连接器。Tomcat 将使用scheme
、proxyName
和proxyPort
参数重定向到 HTTPS。这可以按照将 JIRA 与 Apache 集成文档中所述来实现。 使用 mod_rewrite(此模块可能需要启用),将以下内容添加到 HTTP
VirtualHost
中:RewriteEngine OnRewriteCond %{HTTPS} offRewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
步骤 3:配置 JIRA
- 如配置 JIRA 选项中所述,将 Use gzip compression 设置为 OFF。众所周知,GZIP 压缩在使用反向代理时会导致性能问题,特别是在代理还压缩流量的情况下更是如此。
- 将 Base URL 设置为 JIRA 将要访问的 FQDN,例如 https://jira.atlassian.com。同样可参见配置 JIRA 选项。
只能将 JIRA 配置为响应单个 URL,并且基本 URL(如配置 JIRA 选项中所述)必须与最终用户访问的 URL 一致。配置错误可能会导致 JIRA 内出现严重问题,例如活动流和仪表盘小工具无法正常工作。 - 通过在 FQDN 上访问 JIRA 进行测试(例如:https://jira.atlassian.com),确保可以访问 JIRA ,并且所有仪表盘小工具都能正确显示。
故障排除
- 劫持会话:一些用户报告了用户会话会在 mod_cache 模块启用的情况下被劫持的问题。如果遇到了这些问题,请尝试禁用
mod_cache
模块。
在一些 Apache HTTP Server 版本 2 发行版中,默认情况下该模块处于启用状态。 - 在使用 SELinux 的 Linux 发行版上启用
mod_proxy
(和mod_jk
)时发生拒绝访问错误:用户报告在尝试运行mod_proxy
(和mod_jk
)时会出现“拒绝访问”错误。禁用 SELinux (/etc/selinux/config
) 似乎可以解决这个问题。 运行 Mac OS X:禁用 webperfcache,因为它默认会代理到 80 端口。报告这一情况的用户认为这可能会导致 JIRA 的会话问题:用户的身份会被混淆,如下所示。
此外,我们不建议使用 Mac OS X,因为它不受支持,具体请参见 Jira安装环境要求。
默认情况下,OSX 服务器会为虚拟主机启用 webperfcache,这非常适合静态内容,但对于动态实例(我们所有的实例都是动态实例)来说,这很糟糕,会导致许多问题。
最近发现的是 jira 会话问题。另请参见:
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man8/webperfcache.8.html
遗憾的是,即使您为某个实例禁用了 webperfcache,但如果有一个实例被启用,那么所有实例都会通过 webperfcache 进行代理,从而导致会话问题。
- 重定向太多:当 Tomcat 和 Apache 中只有一个应当重定向时,两者同时进行了重定向。在 Tomcat 中禁用重定向(按照通过 SSL 或 HTTPS 运行 JIRA 中所述还原所有变更),并确保 Apache 中只有一个重定向。
- 一般问题:
- 清除浏览器缓存,然后重试。
- 确保当绕过 Apache 而从 Tomcat 直接访问 JIRA 时,JIRA 运行正常。例如,访问
http://jiraserver:8080
而不是 http://jira.atlassian.com。 - 提高 Apache 的 LogLevel,以进行调试并重新启动。
- 尝试访问 JIRA 并检查 Apache 日志文件是否存在任何错误。
- 在 Atlassian Answers 上提问以获取帮助。
- 403 Forbidden 错误:
将
RequestHeader unset Authorization
行添加到 Apache 配置页面中以禁用授权标头。<Location /jira> RequestHeader unset Authorization ProxyPreserveHost On ProxyPass http://jiraserver/jira ProxyPassReverse http://jiraserver/jira</Location>
CODE
另请参见
- 将 JIRA 与 Apache 集成
- 使用 AJP 协议配置 Apache 反向代理
- 有关更多高级
mod_webapp
配置(例如SSL),请参见此 mod_proxy 指南。 - Apache 虚拟主机文档