通过nginx代理将哈德森映射到子域

我现在正在尝试将nginx设置为Hudson的反向代理,以便可以访问

  http://build.example.com 

直。 我已经在Tomcat上安装了Hudson,并validation了我可以访问Hudson

  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; } } 

有人可以解释一下吗? 安装起来非常简单,但我似乎无法在networking上的任何地方find解决scheme。

更新

对所有花时间回答这个问题的人表示衷心的感谢。 在尝试了各种解决scheme之后,我认为处理这个特定问题最直接的方法是要么…

A)保持独立如@VonCbuild议,让它留在一个子目录。 这是直截了当的,我们可以肯定,没有什么会打破。 要么…

B)将应用程序部署到tomcat webapp目录的根目录如果你想用tomcat安装多个webapps,这可能不是最好的做法。 但是pipe理员可能想要设置一个单独的tomcat安装,只是为了运行Hudson / Jenkins。 Tomcat不能像不同的用户一样运行不同的托pipe应用程序,任何为CI设置Hudson / Jenkins的人都可能希望以特定的用户身份运行它(例如“构build”)。 在这种情况下,部署在ROOT中是最有意义的,可以非常简单地映射到build.example.com。

这是我的nginxconfiguration文件,即使我通过https(端口443)访问Hudson:

反向代理(Apache或Nginx)的技巧是始终保持相同的path
如果你想redirect到a_long_and_complex_address/hudson请保持/ hudson部分myserver/hudson
不要尝试将myserverredirect到a_long_and_complex_address/hudson :各种脚本和图片,绝对path(' / ')将打破。
myserver/hudsonredirect到a_long_and_complex_address/hudson

另外,您也可以将myserver/other_servicesredirect到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而不仅仅是一个目录)。 我相信你的configuration可能是这样的:

 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; } 

请让我知道这对你有没有用。

编辑:要解决绝对的请求,你必须添加在第二个位置定义

 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推荐的redirect:

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

不幸的是,除非你重写哈德森的源代码来检索相对path的资源文件,这是唯一的解决方法,除非nginx有一个HTTPstream修改插件,我不知道像Apache的mod_proxy_html …

哈德森最有可能返回一个HTML页面,它使用绝对path引用资源。 它使用Web应用程序的“contextPath”(等于“/ hudson”)来计算这些path。

Nginx只是将HTML传递给浏览器,它不会改变页面内容。 因此,您的浏览器请求“/ hudson / …”url。

尝试添加一个位置到您的Nginxconfiguration(我没有testing它,你应该赶上这个想法):

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

如果你不希望你的用户看到“/ hudson”前缀,那么在这样的请求上发出301/302redirect:

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

redirect结果302; 301中的permanent结果