現在、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に非常に簡単にマッピングできます。
Https(ポート443)を介してHudsonにアクセスした場合でも、nginx構成ファイルは次のとおりです。
リバースプロキシ(ApacheまたはNginx)の秘訣は、常に同じパスを維持する:です。a_long_and_complex_address/hudson
にリダイレクトする場合、/ hudson部分を保持:myserver/hudson
。myserver
をa_long_and_complex_address/hudson
にリダイレクトしようとしないでください。絶対パス( '/
')を含むあらゆる種類のスクリプトと画像が壊れます。myserver/hudson
をa_long_and_complex_address/hudson
にリダイレクトします。
さらに、myserver/other_services
をa_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/;
}
}
}
私が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ストリーム変更プラグインがない場合は...
ほとんどの場合、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になります