团队城市在nginx代理后面

10

我正在尝试在nginx后面设置TeamCity。我想让https://public.address.com/teamcity/... 重定向到 http://127.0.0.1:8111/...,但是尽管nginx成功完成了此操作,登录页面仍然出现引用,看起来像这样:

<script type="text/javascript" src="/res/-8762791360234593415.js?v=1305815890782"></script>

很显然,这样做行不通,并且调整rootURL设置(在服务器配置中的服务器URL:)也没有任何作用。

我该如何在代理下以非根URL运行TeamCity?


顺便说一句,以下是我的nginx配置的相关部分:

location /teamcity/ {
    proxy_pass       http://127.0.0.1:8111/;
    proxy_redirect   http://127.0.0.1:8111/ https://$host/teamcity/;
}

如果需要的话,这里是设置TeamCity服务器反向代理的最新官方文档 - KIR
2个回答

18

我使用标准的Teamcity Windows安装程序完成了这一操作,理论上它应该可以在任何平台上工作。

更改Teamcity位置

根据JetBrains员工的评论:

要将TeamCity地址从http://server/更改为http://server/teamcity/,请将<TeamCity home>\webapps\ROOT目录重命名为<TeamCity home>\webapps\teamcity

请注意,每次升级Teamcity时都需要重命名此目录。

代理配置

Nginx配置文件大致如下:

    location /teamcity/ {
            proxy_pass http://teamcity-server.domain.com/teamcity/;
    }

或者您可以使用Apache(我因身份验证要求而切换到了Apache):

    <Location /teamcity>
            ProxyPass http://teamcity-server.domain.com/teamcity
            ProxyPassReverse http://teamcity-server.domain.com/teamcity
    </Location>

重定向旧的URL

我还创建了一个新的<Teamcity home>\webapps\ROOT,并在其中放置一个index.jsp文件,用于将流量重定向到新的URL,以便旧链接继续工作(例如,如果有人访问http://teamcity-server.domain.com,它会重定向到http://teamcity-server.domain.com/teamcity):

<!DOCTYPE html>
<html>
<head>
  <title>TeamCity</title>
  <meta http-equiv="refresh" content="0;url=/teamcity/overview.html"/>
</head>
<body>
  <!-- no content -->
</body>
</html>

你也可以在nginx/apache中进行重定向,但在Teamcity服务器上进行重定向意味着如果有人直接在teamcity web服务器上访问旧的URL(而不是通过代理),他们仍然会被正确重定向(而不是得到404错误)。


只是想澄清一下:ROOT文件夹应该被重命名为您的目标名称,而不是移动到您的目标名称的文件夹中。 - Frederik
@Frederik 对,这是我内心中的*nix(Unix/Linux)在作祟。(move == rename)。我会更新我的回答。 - gregmac
还有一件事要补充:虽然这将使基本的Web应用程序功能正常,但构建代理将显示“已断开连接”的状态。您需要使用新的URL更新buildAgent/conf/buildAgent.properties。 - Frederik
谢谢!我已经寻找解决方案好几天了,这个对我非常有效!我有几个 Web 应用程序在同一台 Windows 服务器上运行(在不同的非标准端口上提供服务)。我使用 nginx 将请求映射到 http://my.server.local/teamcity -> http://my.server.local:9001。我已经正确配置了 nginx 部分,但是 teamcity 没有正确加载静态图像文件。将 <team city home>\webapps\ROOT 重命名为 <team city home>\webapps\teamcity 是我的设置关键。 - Matt Merrifield

4
我最终自己找到了解决方案......安装Tomcat,然后安装TeamCity的WAR版本,它在上面Java EE Container选项卡的下载区域中。这将在您安装WAR时公开一个基础URL下的TeamCity。
最简单的方法是将.war文件复制到Tomcat的webapps目录中,并将其命名为与所需基础URL相匹配的名称。例如,将teamcity.war安装到$TOMCAT_HOME/webapps中将在url http://localhost:8080/teamcity下加载TeamCity(假设默认的Tomcat安装)。从https://public.address.com/teamcity代理到此内部地址应该在nginx中相当简单。
我在安装完.war文件后无法立即运行它,但在重新启动Tomcat后,一切都变好了。

4
您可能还需要在<teamcity>/conf/server.xml Connector元素中添加scheme="https"(或添加一个专用于代理的Connector),以使TeamCity知道所有URL都必须使用https。 - Eugene Petrenko
使用相同的相对URL是一个很好的建议。我也这样做,将https连接重定向到:8080内部,它像魔法一样工作,而另一个相对URL则失败了。 - BxlSofty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接