web-dev-qa-db-ja.com

nginxプロキシを介したサブドメインへのハドソンのマッピング

現在、nginxをHudsonのリバースプロキシとしてセットアップして、アクセスできるようにしようとしています。

http://build.example.com
http://127.0.0.1:8080/hudson

http://build.example.com/hudson でhudsonにアクセスできる場所にたどり着くのは非常に簡単でした。しかし、/ hudsonディレクトリを再マップするようにプロキシを設定しようとすると、問題が発生し始めます。 cssまたはイメージファイルはロードされていません。

Nginxアクセスログをざっと見ると、/ hudsonまたは/ hudson/staticのリソースに対して多くのリクエストが行われていることがわかります。これらの要求はTomcatに正しく転送(または書き換え)されていません。しかし、数時間掘り下げた後、私はこの単純な問題を解決する方法に迷っています。

私が使用しているnginx設定は次のようになります

server {
    listen          80;
    server_name     build.example.com;
    location / {
        proxy_pass        http://127.0.0.1:8080/hudson;
        proxy_set_header  Host             $http_Host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

誰かがこれに光を当てることができますか?セットアップは本当に簡単なはずですが、ネット上のどこにも解決策が見つからないようです。

更新

この質問に答えるために時間を割いてくれたすべての人に心から感謝します。さまざまな解決策を試した後、この特定の問題に対処する最も簡単な方法は、次のいずれかだと思います...

A)そのままにしておく@VonCが提案したように、サブディレクトリに残しておきます。それは簡単で、何も壊れないことは間違いありません。または...

B)アプリをTomcatwebappディレクトリのルートにデプロイします。Tomcatインストールで複数のwebappをホストする場合、おそらくこれはbest方法ではありません。しかし、管理者は、とにかくHudson/Jenkinsを実行するためだけに、別のTomcatインストールをセットアップしたい場合があります。 Tomcatは、異なるホストアプリを異なるユーザーとして実行することはできません。また、CI用にHudson/Jenkinsをセットアップする人は、特定のユーザー(「ビルド」など)として実行したいと思うでしょう。この場合、ROOTにデプロイするのが最も理にかなっており、build.example.comに非常に簡単にマッピングできます。

6
odie

Https(ポート443)を介してHudsonにアクセスした場合でも、nginx構成ファイルは次のとおりです。

リバースプロキシ(ApacheまたはNginx)の秘訣は、常に同じパスを維持する:です。
a_long_and_complex_address/hudsonにリダイレクトする場合、/ hudson部分を保持myserver/hudson
myservera_long_and_complex_address/hudsonにリダイレクトしようとしないでください。絶対パス( '/')を含むあらゆる種類のスクリプトと画像が壊れます。
myserver/hudsona_long_and_complex_address/hudsonにリダイレクトします。

さらに、myserver/other_servicesa_long_and_complex_address/other_servicesにリダイレクトすることもできます;)

worker_processes  1;

error_log  logs/error.log  debug;
pid        logs/nginx.pid;

events {
    worker_connections  250;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  150;
    #gzip  on;

    port_in_redirect   on;
    proxy_redirect     off;
    proxy_set_header   Host             $Host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

    server {
        listen       443;
        server_name  (some alias);
        # default max client body size was 1m! => Error code is 413
        # here: max 10Go
        client_max_body_size 10000m;

        ssl                  on;
        ssl_certificate      /home/xxx/.ssl/my.crt;
        ssl_certificate_key  /home/xxx/.ssl/my.key;
        ssl_session_timeout  5m;
        #ssl_protocols SSLv2 SSLv3 TLSv1; # NO: SSLv2 prohibited
        ssl_protocols  SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;

        rewrite ^/hudson$ https://myserver/hudson/ redirect;
        location /hudson/ {
          proxy_pass https://complex_address:8xx3/hudson/;
        }
    }
}
3
VonC

私がnginxで経験したことから、プロキシにURLを指定する方法は少し奇妙です(ディレクトリだけでなく完全なURLを指定する必要があるため)。私はあなたの構成が次のようになると信じています:

upstream 127.0.0.1:8080 {
  ip_hash;
  server 127.0.0.1:8080;
}

location ~* ^/(.*) {
  proxy_pass http://127.0.0.1:8080/hudson/$1;
  proxy_set_header  Host             $http_Host;
  proxy_set_header  X-Real-IP        $remote_addr;
  proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
}

それがあなたのために働くかどうか私に知らせてください。

編集:絶対リクエストを回避するには、2番目の場所の定義を追加する必要があります。

location ~* ^/hudson/(.*) {
  proxy_pass http://127.0.0.1:8080/hudson/$1;
  proxy_set_header  Host             $http_Host;
  proxy_set_header  X-Real-IP        $remote_addr;
  proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
}

または、Alazが推奨するリダイレクトを追加します。

location /hudson {
  rewrite ^/hudson(.*)$ $1 redirect;
}

残念ながら、hudsonのソースを書き換えて相対パスでリソースファイルを取得しない限り、これが唯一の回避策です。ただし、nginxにApacheのmod_proxy_htmlのようなhttpストリーム変更プラグインがない場合は...

2
photoionized

ほとんどの場合、Hudsonは絶対パスを使用してリソースを参照するHTMLページを返します。また、Webアプリの「contextPath」(この場合は「/ hudson」と同じ)を使用してこれらのパスを計算します。

NginxはHTMLをブラウザに渡すだけで、ページのコンテンツを変更しません。したがって、ブラウザは「/ hudson/...」URLを要求します。

Nginx構成にもう1つの場所を追加してみてください(テストはしていません。アイデアを理解する必要があります)。

location /hudson {
  rewrite ^/hudson(.*)$ $1 break;
}

ユーザーに「/ hudson」プレフィックスを表示させたくない場合は、次のようなリクエストで301/302リダイレクトを発行します。

location /hudson {
  rewrite ^/hudson(.*)$ $1 redirect;
}

redirectは302になります。 permanentの結果は301になります

1