2016-08-02 82 views
4

我試圖建立一個Jenkins主和一個Jenkins從屬節點,Jenkins主在Nginx反向代理的SSL終止的不同服務器上。 nginx的配置如下:Jenkins:如何配置Jenkins後面的Nginx反向代理爲JNLP奴隸連接

upstream jenkins { 
    server <server ip>:8080 fail_timeout=0; 
} 

server { 
    listen 443 ssl; 
    server_name jenkins.mydomain.com; 
    ssl_certificate /etc/nginx/certs/mydomain.crt; 
    ssl_certificate_key /etc/nginx/certs/mydomain.key; 

    location/{ 
    proxy_set_header  Host $host:$server_port; 
    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; 
    proxy_redirect   http:// https://; 
    proxy_pass    http://jenkins; 
    } 
} 

server { 
    listen 80; 
    server_name jenkins.mydomain.com; 
    return 301 https://$server_name$request_uri; 
} 

的JNLP代理的TCP端口在詹金斯大師全球安全配置設置爲50000。端口50000設置爲可從主機上的任何位置訪問。

的JNLP從站使用下面的命令啓動:

java -jar slave.jar -jnlpUrl https://jenkins.mydomain.com/computer/slave-1/slave-agent.jnlp -secret <secret> 

的JNLP從屬未能連接到已配置的JNLP端口上的主:

INFO: Connecting to jenkins.mydomain.com:50000 (retrying:4) 
java.net.ConnectException: Connection timed out 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
     at java.net.Socket.connect(Socket.java:589) 
     at java.net.Socket.connect(Socket.java:538) 
     at hudson.remoting.Engine.connect(Engine.java:400) 
     at hudson.remoting.Engine.run(Engine.java:298) 

什麼是針對所需的配置JNLP從機連接到Jenkins主機?

回答

4

JNLP端口似乎使用二進制協議,而不是基於文本的HTTP協議,所以不幸的是它不能像正常的Jenkins頁面那樣通過NGINX進行反向代理。

相反,你應該:

  1. 配置全局安全>選中 「啓用安全」,並設定一個固定 「爲JNLP從代理TCP端口」。這將導致所有Jenkins頁面 發出指定此端口的額外HTTP標頭:X-Hudson-CLI-Port, X-Jenkins-CLI-Port,X-Jenkins-CLI2-Port。

  2. 允許您的固定TCP JNLP 端口通過任何防火牆,以便CLI客戶端和JNLP代理可以直接到達後端的Jenkins服務器。

  3. 將系統屬性hudson.TcpSlaveAgentListener.hostName設置爲 主機名或您的Jenkins服務器在後端的IP地址。此 將導致所有頁面發出包含此指定主機名的額外HTTP標頭 (X-Jenkins-CLI-Host)。這告訴 CLI客戶端在哪裏連接,但據說不是JNLP代理。

  4. 對於在 jenkins.mydomain.com/computer/使用「通過Java Web Start啓動從代理」的啓動方法,在每一個節點列表您構建從機,單擊計算機,單擊配置,單擊高級...按鈕在Launch方法下的右側,並適當地設置「隧道連接通過」字段。閱讀問號幫助。您可能只需要「HOST:」語法,其中HOST是您後端Jenkins服務器的主機名或IP地址。

聲明:我還沒有測試過第4步,但它在下面的第一個鏈接中提到。

參考文獻:

+0

我使用dockerized詹金斯,與dockerized奴隸運行。 Jenkins背後是一個反向代理(使用註冊者和領事模板)。目前它可以對從端口進行硬編碼,但我們希望使其成爲動態的。在Jenkins運行之前,當我們不知道從端口時,對於配置Jenkins有任何建議嗎? – Brandon

+0

@Brandon我不熟悉註冊者和領事模板。我想你會需要先決定一個固定的從端口,但是你可以在防火牆中打開針孔。如果你必須動態地執行它,可能會找到存儲它的jenkins設置xml文件(包括全局設置和每個從屬設置),然後拿出黑客來編輯這些文件,然後重新加載jenkins配置(或者重新啓動jenkins )所以它會生效。 – PolyTekPatrick

+1

如果像我一樣,你不知道在哪裏設置第3步「設置系統屬性hudson.TcpSlaveAgentListener.hostName」,這是在哪裏以及如何完成的: https://wiki.jenkins.io/display/JENKINS/Features +由+系統+屬性控制+ 並且當您需要使用在Docker中運行的Jenkins master時,https://github.com/jenkinsci/docker/blob/master/README.md#passing-jvm-parameters 額外的titbit不包括此服務器值上的端口(僅限服務器LAN IP或可解析主機名)。 – Eoan