2017-02-26 74 views
3

我正在Jenkins内部运行Docker后面的Nginx反向代理。现在我解决了问题。Jenkins与Nginx反向代理和解析器

当我启动解析器使用:

set $backend "http://jenkins:8080/"; 
proxy_pass $backend; 

我会得到所有的JavaScript文件以下错误:

Refused to execute script from 'http://localhost/static/....js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled. 

当我只是代理通而不解析:

proxy_pass http://jenkins:8080/; 

它工作,但没有解析器。解析器是强制性的,否则当主机jenkins更改它的IP(Docker DNS服务器)时,安装程​​序将不起作用。

我的配置:

resolver 127.0.0.11 ipv6=off valid=30s; 
client_max_body_size 100m; 
keepalive_timeout  65; 
types_hash_max_size 2048; 

server { 
    listen  80 default_server; 
    listen  [::]:80 default_server; 
    server_name _; 
    location/{ 
     set $backend "http://jenkins:8080/"; 
     proxy_pass $backend; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Proto $scheme; 
    } 
} 
+0

很大的问题! :-) – cnst

+0

感谢您的支持,接受,奖励;顺便说一下,对于未来,您可能希望继续使用手册“奖励”部分,因为问题从精选标签中消失,因此其他人将无法记录并投票。 – cnst

回答

1

根据您收到此错误信息,这听起来像你在地方的JavaScript让HTML页面。

使用带变量的proxy_pass范式,您告诉nginx它不应该混淆该值,例如,不管location和URI如何,对后端的所有请求将始终与变量说(例如,在你的情况下具有相同的URI)。


最佳选择很可能会使用$uri$is_args$args,按NGINX proxy_pass remove path prefix & resolve DNS

-  set $backend "http://jenkins:8080/"; 
-  proxy_pass $backend; 
+  proxy_pass http://jenkins:8080$uri$is_args$args; 

另一种选择,这或许能够成为不太安全,就是使用$uri_request,这比在某些有限的情况下平原$uri一个稍微不同的含义,按Nginx pass_proxy subdirectory without url decoding

proxy_pass http://jenkins:8080$request_uri; 
+0

为什么不''proxy_pass $ backend $ uri $ is_args $ args;'? – blacklabelops

+0

@maybeg,要么变体应该工作;但是如果你在单个上下文中使用变量,没有它的代码可能看起来更干净,更容易理解(否则,有人可能会认为你的变量有特殊含义)。另外,考虑到定义一个上游“变量”的正确方法是使用['upstream'](http://nginx.org/r/upstream)指令,尽管这个上下文中的'server'' resolve'部分是非OSS功能,因此,除非您有订阅,否则不适用于您。 – cnst