反向代理服务器后面的 Subversion Edge returns HTTP 状态 502 'Bad Gateway'
Subversion Edge behind reverse proxy server returns HTTP status 502 'Bad Gateway'
我在反向代理服务器后面使用 Subversion Edge 5.2.2。乍一看,所有服务 ViewVC、控制台和 Subversion 服务器看起来都很好/工作正常。
然而,Subversion 服务器不适用于特定的 Subversion 命令,例如 svn cp
returns
svn: E175002: Unexpected HTTP status 502 'Bad Gateway' on
'/svn/petclinic/!svn/rvr/16/trunk'
如果我绕过反向代理并直接访问 Subversion Edge,这些命令就可以工作。
Subversion Edge 文档没有任何关于反向代理配置的信息,因此这个 "enterprise" 产品似乎不支持这种典型的 "enterprise" 部署模式。
能否将 Subversion Edge 工作配置为在反向代理后面正常工作?应该如何配置?
出现这个错误是因为nginx把Destination
header不加修改的传给了subversion服务器。如果你在 nginx 服务器上使用 https 但在 subversion 服务器上只使用 http,subversion 将无法执行 COPY 或 MOVE 方法,因为Destination
header 包含一个 https://
值。
您可以通过检查 nginx 的 access.log
来确认这一点;如果您看到带有 502
响应的 COPY 或 MOVE 请求,然后是 DELETE,那么这很可能是问题所在,例如:
… COPY /foo/!svn/rvr/111/trunk HTTP/1.1" 502 …
… DELETE /foo/!svn/txn/111-6v HTTP/1.1" 204 …
您可以通过在任一服务器上重写目标 header 来解决此问题:
Subversion 服务器上的 Apache
RequestHeader edit Destination ^https http early
或 nginx代理服务器:
set $dest $http_destination;
if ($http_destination ~ "^https://(.+)$") {
set $dest http://;
}
proxy_set_header Destination $dest;
我在反向代理服务器后面使用 Subversion Edge 5.2.2。乍一看,所有服务 ViewVC、控制台和 Subversion 服务器看起来都很好/工作正常。
然而,Subversion 服务器不适用于特定的 Subversion 命令,例如 svn cp
returns
svn: E175002: Unexpected HTTP status 502 'Bad Gateway' on '/svn/petclinic/!svn/rvr/16/trunk'
如果我绕过反向代理并直接访问 Subversion Edge,这些命令就可以工作。
Subversion Edge 文档没有任何关于反向代理配置的信息,因此这个 "enterprise" 产品似乎不支持这种典型的 "enterprise" 部署模式。
能否将 Subversion Edge 工作配置为在反向代理后面正常工作?应该如何配置?
出现这个错误是因为nginx把Destination
header不加修改的传给了subversion服务器。如果你在 nginx 服务器上使用 https 但在 subversion 服务器上只使用 http,subversion 将无法执行 COPY 或 MOVE 方法,因为Destination
header 包含一个 https://
值。
您可以通过检查 nginx 的 access.log
来确认这一点;如果您看到带有 502
响应的 COPY 或 MOVE 请求,然后是 DELETE,那么这很可能是问题所在,例如:
… COPY /foo/!svn/rvr/111/trunk HTTP/1.1" 502 …
… DELETE /foo/!svn/txn/111-6v HTTP/1.1" 204 …
您可以通过在任一服务器上重写目标 header 来解决此问题:
Subversion 服务器上的 Apache
RequestHeader edit Destination ^https http early
或 nginx代理服务器:
set $dest $http_destination;
if ($http_destination ~ "^https://(.+)$") {
set $dest http://;
}
proxy_set_header Destination $dest;