好的,这个问题分为两部分。
我从一家托管公司获得了一个带有 CentOS 的非托管 VPS,以便安装几个 Atlassian 工具,但是,我遇到了一个问题:当启动第二个应用程序时,第一个应用程序开始崩溃。
到目前为止,我已经安装了 Confluence(在端口 8090 上运行)、JIRA(在 8080 上运行)和 Crowd(我不记得的其他端口),但我一次只能运行一个。我尝试设置反向代理,但这似乎不起作用。
在进行一些研究时,我发现这显然是不可能的: https://confluence.atlassian.com/display/JIRA/Deploying+Multiple+Atlassian+Applications+in+a+Single+Tomcat+Container https://confluence.atlassian.com/display/DOC/Installing+Confluence+and+JIRA+Together
我觉得这很奇怪,因为我认为每个 Atlassian 应用程序都带有自己的 Tomcat......所以我想知道我是否只需要找到一种方法来“使用不同的 Tomcat 容器”,但我很愚蠢,我甚至不知道那是什么意思(是的,我使用了谷歌,但它们什么也没做)。
那么,第 1 部分:我是否遗漏了什么?或者根本就没有办法以可接受的方式做到这一点
我认为我找到了一个解决方案,Linux容器:
http://blogs.atlassian.com/2013/06/deploy-java-apps-with-docker-awesome/ http://blogs.atlassian.com/2015/01/stash-docker/ http://blogs.atlassian.com/2013/11/docker-all-the-things-at-atlassian-automation-and-wiring/
因为它们似乎隔离了运行环境,甚至允许您在容器和操作系统之间设置网络路由。
那么,第 2 部分:Linux 容器/docker 是否是解决我的问题的可接受的解决方案?
说实话,我不想租几台服务器......
答案1
我遇到的问题是,当启动第二个应用程序时,第一个应用程序开始崩溃。
您没有提到您的 VPS 的任何系统规格。对我来说,这听起来像是内存不足。您的意思是当应用程序崩溃时,JVM 不再显示在进程列表中吗?您应该检查输出以dmesg
查看 JVM 是否被 OOM 终止程序终止。
我觉得这很奇怪,因为我认为每个 Atlassian 应用程序都带有自己的 Tomcat...所以我想知道我是否只需要找到一种“使用不同的 Tomcat 容器”的方法,
所有 Atlassian 应用程序都与 Tomcat 捆绑在一起。您也可以以 WAR 包的形式下载应用程序。如果您愿意,可以将这些包部署到您自己的应用程序服务器中,但那是另外一回事。
将所有应用程序放入一个 Tomcat 容器中并不明智。从您的描述中,我推断您不熟悉在一个 Tomcat 实例中运行多个应用程序。因此:
- 您提到的应用程序(Confluence、JIRA、Crowd)对内存的要求不同,尤其是当您在其中安装插件时。您很容易遇到 OOM 错误。
- 当所有应用程序都在各自的 Tomcat 实例中运行时,升级应用程序会变得容易得多。从安全角度来看,这非常重要。
- 如果要将一个应用程序迁移到另一台服务器,只需将整个 Tomcat 实例与应用程序一起复制即可。只需要进行少量配置更改。
安装此类环境的工作流程非常简短:
- 为所有应用程序创建单独的用户。
- 下载应用程序(Tomcat 捆绑版本)并提取。
- 配置
server.xml
以使应用程序在不同的端口上运行。这至关重要。否则只有一个应用程序可以为 Tomcat HTTP/AJP 连接器保留 TCP 端口。每个应用程序使用唯一的端口。 - 为所有应用程序创建虚拟主机。
- 启动每个应用程序用户的应用程序。
那么,第 2 部分:Linux 容器/docker 是否是解决我的问题的可接受的解决方案?
这是一个解决方案。您应该考虑您的设置。如果您当前的设置允许您在自己的 Tomcat 实例中运行所有应用程序,那么在单独的 Linux 容器中运行它们有什么好处?使用 Docker 很容易过度设计您的设置。此外,如果您不熟悉 Docker,您必须学习如何使用它。
答案2
这当然是可能的,但是您将使用三个不同的 Tomcat 容器。
每个产品都可以独立运行。如果我没记错的话,就像这样
/.../crowd/bin/start_crowd.sh
/.../jira/bin/start-jira.sh
/.../confluence/bin/start-confluence.sh
并且,您可能希望 Apache httpd 作为反向代理运行。因此 /crowd 指向您的 crowd 端口,/jira 指向您的 jira 端口,/confluence 指向您的 confluence 端口。
这些路径是错误的,但希望你能明白(/.../ 是你解压产品的地方)。
您也可以让它们使用相同或不同的 JAVA_HOME,如果负责运行应用程序的个人/团队与管理操作系统的个人/团队不同,这将很有用。
我有一个合适的启动脚本,用于启动整个堆栈(按顺序依次为 Crowd、Jira 和 Confluence,并在启动下一个之前测试其中一个是否已准备就绪)。它是为 RHEL 5 编写的。如果需要,请调用它;它可以节省修补时间。
答案3
目前我正在使用 apache 作为反向代理和 5 个 jira 实例。
<VirtualHost *:80>
ServerName jira1.example.net
ProxyTimeout 300
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName jira2.example.net
ProxyTimeout 300
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://127.0.0.1:8181/
ProxyPassReverse / http://127.0.0.1:8181/
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
您需要做的就是将每个 jira/confl/crowd 实例绑定到唯一端口。对于每个 jira 实例,您都应该编辑 atlassian/jira/conf/server.xml
<Service name="Catalina">
<Connector port="8080"
maxThreads="150"
minSpareThreads="25"
connectionTimeout="20000"
address="127.0.0.1"
proxyName="jira1.example.net"
proxyPort="80"
scheme="http"
enableLookups="false"
maxHttpHeaderSize="8192"
protocol="HTTP/1.1"
useBodyEncodingForURI="true"
redirectPort="8443"
acceptCount="100"
disableUploadTimeout="true"/>
<Service name="Catalina">
<Connector port="8181"
maxThreads="150"
minSpareThreads="25"
connectionTimeout="20000"
address="127.0.0.1"
proxyName="jira2.example.net"
proxyPort="80"
scheme="http"
enableLookups="false"
maxHttpHeaderSize="8192"
protocol="HTTP/1.1"
useBodyEncodingForURI="true"
redirectPort="8443"
acceptCount="100"
disableUploadTimeout="true"/>