提问者:小点点

Jenkins:如何在 Nginx 反向代理后面配置 Jenkins 以便 JNLP 从属设备连接


我正在尝试设置一个 Jenkins 主节点和一个 Jenkins 从节点,其中 Jenkins Master 位于具有 SSL 终止的不同服务器上的 Nginx 反向代理后面。nginx配置如下:

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端口在主全局安全配置Jenkins设置为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主站需要什么配置?


共2个答案

匿名用户

JNLP端口似乎使用二进制协议,而不是基于文本的HTTP协议,因此不幸的是,它不能像正常的Jenkins页面那样通过NGINX进行反向代理。

相反,您应该:

> < li>

配置全局安全性

允许您的固定TCP JNLP端口通过任何防火墙,以便CLI客户端和JNLP代理可以直接到达后端的Jenkins服务器。

设置系统属性< code>hudson。tcpslaveagentlistener . hostname 设置为后端Jenkins服务器的主机名或IP地址。这将导致所有页面发出一个额外的HTTP头(X-Jenkins-CLI-Host ),其中包含这个指定的主机名。这将告诉CLI客户端连接到哪里,但不应该告诉JNLP代理。

对于jenkins.mydomain.com/computer/中使用Launch方法启动从服务器代理JavaWeb Start的节点列表中的每台构建从服务器,单击计算机,单击配置,单击Launch方法下右侧的Advanced…按钮,并适当设置Tunnel连接通过字段。阅读问号帮助。您可能只需要HOST:语法,其中HOST是后端Jenkins服务器的主机名或IP地址。

参考:

    < Li > https://issues . JENKINS-ci . org/browse/JENKINS-11982 < Li > https://support . cloud bees . com/HC/en-us/articles/218097237-How-to-trouble shooting-JNLP-slaves-connection-issues-with-Jenkins < Li > https://wiki . JENKINS-ci . org/display/JENKINS/JENKINS CLI

匿名用户

OP 提出这个问题已经快 4 年了,但是,如果您到达此页面并寻找适当的解决方案,那么现在就可以了。

您唯一需要确保的是您的代理/从属服务器信任 Jenkins 服务器证书(因为 webSocket 不能与 -disableHttpsCertValidation-noCertificateCheck 一起使用)

如果这是Windows代理,请使用:

C:\Program Files (x86)\Java\jre1.8.0_251\bin\keytool.exe -import -storepass "changeit" -keystore "C:\Program Files (x86)\Java\jre1.8.0_251\lib\security\cacerts" -alias <cert_alias> -file "<path_to_cert>"

(根据您的java版本更改路径)