2016-08-02 45 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