2017-02-26 49 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