1

現在、アップグレードしたい複数のリポジトリを持つ古いsubversion1.4.2サーバーがあります。私はいくつかのことをしたい:

  • Subversionの最新バージョン(1.7以降)に移動する
  • リポジトリを別のマシンに分割する
  • ホスト名を変更します(これについては後で説明します)
  • URLのパスではなくFQDNを使用するように変更します(<-これは私が抱えている問題です)

ただし、ダウンタイムはほとんど必要ありません。これを段階的に(大部分は)ユーザーに対してシームレスに実行したいと考えています。

そのため、サーバーは現在次のように解決されています:svn.svr.mycompany.co.ukユーザーに次の使用に切り替えてもらいたい:svn.mycompanyglobal.net

その新しい名前は、ユーザーがいる大陸に応じて、DNSによって適切なサーバーにルーティングされます。これは機能します。

これは、標準タイプのsvnDAVアクセスを使用したApache2インストールを示しています。

<VirtualHost 10.11.22.33>
  Servername svn.svr.mycompany.co.uk

  <Location /main>
    DAV svn
    SVNPath /home/svnrepo/main
    [... Some regular auth stuff ...]
    SVNIndexXSLT /svnindex.xsl
  </Location>

  <Location /data>
    DAV svn
    SVNPath /home/svnrepo/data
    [... Some regular auth stuff ...]
    SVNIndexXSLT /svnindex.xsl
  </Location>
</VirtualHost>

ドキュメントのルートとモジュールに関連する通常のものがありますが、これがその核心です。

したがって、現時点では、http ://svn.svr.mycompany.co.uk/data/Core/Blahからコードをチェックアウトできます。

これで、nginxリバースプロキシをこの前に配置しました。これにはグローバルホスト名があり、次のURLからコードを参照できます:http: //data.svn.mycompanyglobal.net/Core/Blah「データ」をパスからホストの名前に移動したことに注意してください)。次の構成を追加することで、 nginxでこれを実現しました。

server {
  listen 80;

  server_name data.svn.mycompanyglobal.net;

  proxy_set_header  Host svn.svr.mycompany.co.uk;

  location = /svnindex.xsl {
    proxy_pass http://svn.svr.mycompany.co.uk/svnindex.xsl;
  }

  location /data/ {
    proxy_pass http://svn.svr.mycompany.co.uk/data/;
  }

  location / {
    proxy_pass http://svn.svr.mycompany.co.uk/;
    rewrite ^(.*)$ /data$1 break;
  }
}

これはすべて機能します。Webブラウザーで、TortoiseSVNのリポジトリブラウザーまたはコマンドライン「svnls」を介してコードを参照できます。これらはすべてプロキシ経由で行われます。

ただし、コードをチェックアウトしようとすると、エラーが発生します

Unusable URI: it does not refer to this repository

私は、これがこの決定を下す(つまり、エラーを発生させる)クライアントであるという結論に達しました。SVNKitのソースコードを見ると、svnクライアントが要求したパスをサーバーが返したパスと比較していることがわかります。理由はわかりませんが、そのように見えます(DavUtilsを参照)。

チェックアウト元のURLを次のように変更することで、この問題(一種)を解決できます。

http://data.svn.mycompanyglobal.net/data

[つまり、リポジトリの名前を最後に追加します]

これは、上記で追加した「/data/」ルートが原因で機能する可能性があります。

誰かがこのようなことをすることができましたか?Subversionサーバーまたはプロキシのいずれかで、Subversionクライアントへのパスの表示を変更するためにできることはありますか?

これを別々のサーバーに配置すると、各サーバーには1つの「場所」(ルート)しかリストされないため、問題が発生しなくなることはわかっていますが、現時点ではこれに余裕はありません。

また、このボックスはロバの何年も前から存在しており、ハードコードされた参照がたくさんあることを覚えておく必要があります。そのため、すべての参照を新しいURL形式に段階的に移動できるように、プロキシする必要があります。

これは長い質問ですが、何を達成したいのかを明確にしたいと思います。私は正気ではないことを私に言ってください-それは私がそれを機能させることにとても近いように感じます:)。

4

2 に答える 2

1

私はあなたの文脈を正しく理解しているかもしれません。あなたはこれを知っていると確信していますが、SVNも異なるポートで実行されるため、そこで問題が発生する可能性があります:)

nginxのパラメーターに関しては、location構成で設定したサーバー名の場所のみを定義していることに注意する必要があります。したがって、data.svn.company.comそのサブドメインの各場所を定義しているときに定義した上記の唯一のサーバー名について。あなたは実際に複数のサブドメインを定義しようとしていると思います。

その場合、ロケーションURIを定義する代わりに、のようmain.svn.company.comに複数のサーバー名を設定する必要があります。data.svn.company.com

お役に立てば幸いです:)

于 2012-05-13T03:02:54.430 に答える
1

そのため、エンドポイントサーバー(つまり、移動先のサーバー)を編集して、2つの異なる場所に同じリポジトリを配置することでこれを行うことになりました。

<VirtualHost 10.11.22.33>
  Servername svn.svr.mycompany.co.uk

  <Location /data>
    DAV svn
    SVNPath /home/svnrepo/data
    [... Some regular auth stuff ...]
  </Location>
</VirtualHost>

<VirtualHost 10.11.22.33>
  Servername data.svn.svr.mycompany.co.uk

  <Location />
    DAV svn
    SVNPath /home/svnrepo/data
    [... Some regular auth stuff ...]
  </Location>
</VirtualHost>

Subversionはこれをうまく処理することがわかりました。その後、私のプロキシは取るに足らないものになります。明らかに、ここではプロキシは必要ありませんが、エンドポイントサーバーを分割し始めたらプロキシは必要です。

これで、次の場所からチェックアウト、閲覧、チェックインできます。

http://data.svn.mycompanyglobal.net/
http://data.svn.svr.mycompany.co.uk/
http://svn.svr.mycompany.co.uk/data

最初のサーバーはプロキシサーバーにルーティングされ、2番目のサーバーにプロキシされます。2番目と3番目のもの(直接接続されている場合)は、古いサーバーに直接ルーティングされます。

参考までに、私のnginxプロキシエントリは次のようになります。

server {
  listen 80;
  listen 443 ssl;

  server_name data.svn.mycompanyglobal.net;

  proxy_set_header     Host data.svn.svr.mycompany.co.uk;

  location / {
    proxy_pass http://data.svn.svr.mycompany.co.uk/;
  }
}

リポジトリごとにこれらの1つがあります(上記の例では「data」と「main」)。

于 2012-05-18T12:53:15.427 に答える