✨前言:
当jenkins在公网上的时候,如果要添加局域网内的服务器为节点机器构建的时候,这里就需要通过squid代理服务来实现了。当然你也可以使用其他的方式例如Apache等等,这里主要介绍通过Squid的方式。
🌟什么是Squid?
Squid是一种广泛使用的缓存代理服务器,它主要用于缓存和转发HTTP、HTTPS、FTP等常见的网络协议数据。Squid能够帮助减少带宽消耗、提高内容加载速度,并提供安全的网络访问控制。
🌟以下是Squid的一些主要特点和功能:
缓存和重用:
Squid可以缓存从因特网下载的资源,如网页、图片和其他文件。当相同的资源再次被请求时,Squid可以从其缓存提供这些内容,从而加快了数据传输速度并减少了实际的因特网带宽使用。
提高响应速度:
对于经常请求的数据,Squid由于其缓存功能可以快速响应,从而为用户提供更快的访问体验。
高可用性和负载均衡:
Squid可以配置为高可用性集群,从而帮助分散负载,并在出现问题时提供故障转移功能。
安全控制:
Squid可以通过配置访问控制列表(ACLs)限制用户访问某些网站。这对于企业和学校等机构管理网络安全特别有用。
透明代理:
Squid也可以配置成透明代理的方式运行,这种方式下,用户的网络请求会自动经过Squid代理而无需进行任何特殊配置。
内容过滤:
可以通过配合其他工具如SquidGuard来实现内容过滤,从而屏蔽不适当的或不需要的内容。
身份验证:
Squid支持多种身份验证机制,如BASIC、DIGEST、NTLM等,允许对使用代理服务的用户进行身份验证。
因其强大的功能和灵活的配置选项,Squid在不同规模的网络环境中都得到了广泛的应用,成为了现代代理服务器解决方案的重要组成部分。
✨1.安装Squid
🌟1.1先在代理服务器上安装Squid,可以直接yum 安装
bash
yum install squid
🌟1.2 配置 Squid:
找到 Squid 的配置文件,通常位于 /etc/squid/squid.conf
打开配置文件,并进行必要的设置。下面是一些基本的配置选项:
bash
#http_port 指定 Squid 监听的端口
http_port 3128
#accessible_ports 定义 Squid 能够访问的端口范围,可以限制只转发到特定端口的请求
acl Safe_ports port 80 # http
acl Safe_ports port 443 # https
acl CONNECT method CONNECT
#设置一些基本的访问控制,允许所有请求(你可以根据需要增加限制)
http_access allow all
#如果你需要认证,可以引入 auth_param 设置,配置基于用户名和密码的认证
#auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
#auth_param basic realm proxy
#acl authenticated proxy_auth REQUIRED
#http_access allow authenticated
🌟1.3 启动 Squid 服务:
保存你的配置,并重启 Squid 服务以应用新的配置:
bash
sudo systemctl restart squid
🌟1.4 测试配置:
从你的 Jenkins 节点机器或任何客户机尝试通过配置好的 Squid 代理服务器进行访问,确保代理工作正常。
你可以在 Jenkins 节点机器上设置环境变量或在浏览器设置中指定代理,如下所示:
bash
export http_proxy="http://代理服务器IP:3128"
export https_proxy="http://代理服务器IP:3128"
然后使用 source ~/.bashrc 来应用刚才设置的环境变量。
🌟1.5 日志文件:
Squid 自动生成日志文件,通常在 /var/log/squid/ 目录中。如果遇到问题,阅读 access.log 和 cache.log 可能会有所帮助。这里 后面遇到问题了可以查看access.log
✨2.配置jenkins 节点机器
🌟2.1 添加节点,路径如下图所示,这里选择启动方式要选择Launch agent by connecting it to the controller
🌟2.2 下载 Jenkins 代理 JAR 文件:
访问 Jenkins 主服务器的 Web 界面,在「节点」配置页面(Jenkins Dashboard > Manage Jenkins > Manage Nodes and Clouds 然后选择你的节点),点击「通过 Java Web Start 启动代理」链接或者通过代理服务器的命令行下载:(这里添加了节点机器的时候会让你下载,如果是linux 节点就我一般下载到root目录下)
在你的节点机器上执行这条命令,我的是linux 所以上面选择的是linux的。
bash
curl -sO http://jenkins服务器ip:8080/jnlpJars/agent.jar
下载完成之后root目录下会有一个agent.jar文件
🌟2.3 运行 Jenkins 代理:
使用下载的 JAR 文件启动 Jenkins 代理。你可以在命令中指定代理设置,格式如下:
bash
java -Dhttp.proxyHost=代理服务器IP -Dhttp.proxyPort=代理端口 -Dhttps.proxyHost=代理服务器IP -Dhttps.proxyPort=代理端口 -jar agent.jar -jnlpUrl http://Jenkins主服务器URL/computer/节点名/slave-agent.jnlp -workDir "/path/to/workdir" -secret SECRETTOKEN
# 上面的命令需要修改为你对应的值
⚠️注意:这里的java版本最好是java 11以上,如果yum没有对应的包的话,本人试过jdk1.8不可以,可以自己去java官网下载对应的jdk。
🌟2.4 问题解决
bash
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/java.net.HttpConnectSocketImpl.doTunneling(HttpConnectSocketImpl.java:179)
... 11 more
Caused by: java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 403 Forbidden"
at java.base/sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java:2177)
... 16 more
如果你运行了之后报403 的问题
报错信息 java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 403 Forbidden" 表明 Jenkins 节点机器在尝试通过代理服务器连接到 Jenkins 主服务器时,代理服务器返回了一个 HTTP 403 Forbidden 响应。这意味着代理服务器拒绝了这个连接请求。
这通常是由下面几个原因中的一个或多个导致的:
代理服务器的配置不允许来自 Jenkins 节点机器的连接。
认证问题:如果代理服务器需要认证,Jenkins 节点机器上的命令行需要提供有效的代理服务器认证信息。
Squid 代理服务器的 ACL(Access Control List)配置可能限制了对 Jenkins 主服务器的访问。
🌟2.4.1 首先我们看下代理服务器上的squid的日志,cd /var/log/squid/
我们可以看到:
Jenkins 代理成功下载了 agent.jar(第一行),返回状态 TCP_MISS/200 表明下载成功。
Jenkins 代理也成功访问了 Jenkins 主服务器的 /tcpSlaveAgentListener/ (第二行和第四行),同样返回状态 TCP_MISS/200 表明该 HTTP GET 请求成功。
然而,在尝试通过 CONNECT 方法访问 Jenkins 主服务器的端口 50000 时(第三行和第五行),该请求被 Squid 以状态码 TCP_DENIED/403 拒绝,说明代理服务器不允许此请求。
从这个日志可以确定问题所在:Squid 配置不允许 CONNECT 方法的请求到 Jenkins 的端口 50000,这是 Jenkins 代理用来与 Jenkins 主服务器建立双向通信的端口。
🌟2.4.2 确认 Squid 配置中的 ACLs (Access Control Lists):
修改 Squid 的配置文件(通常是 /etc/squid/squid.conf)以允许 CONNECT 方法到 50000 端口。例如,你可以通过添加或调整这些行来允许 ACLs:
bash
acl SSL_ports port 50000 # 允许50000端口作为安全端口
acl Safe_ports port 50000 # 允许50000端口作为安全端口
acl CONNECT method CONNECT
http_access allow CONNECT SSL_ports
http_access allow Safe_ports
🌟2.4.3 检查顺序很重要:
确保 http_access allow 规则的顺序正确。在 Squid 中,与第一个匹配的规则相关联的操作将被执行。如果存在一个 deny 规则,并且它在 allow 规则之前,那么连接仍然会被拒绝。
🌟2.4.4 重启 Squid 服务:
在更改配置文件后,重启 Squid 服务来应用更改:
bash
sudo systemctl restart squid
🌟2.4.5 重新运行2.3 步骤之后,提示connected就代表代理连接成功,并且jenkins上显示节点是已同步状态即可
✨3 配置自动启动服务
为了将 Jenkins 代理配置成一个服务,你可以使用 systemd 来创建一个服务文件,这样 Jenkins 代理就能在系统启动时自动运行。下面是创建此服务的基本步骤:
3.1 创建一个新的服务文件:
打开文本编辑器,创建一个新的服务文件,例如 jenkins-agent.service,并添加以下内容:
bash
sudo vi /etc/systemd/system/jenkins-agent.service
🌟3.2 编辑服务文件:
在编辑器中,输入以下内容:
bash
[Unit]
Description=Jenkins Agent Service
Wants=network-online.target
After=network-online.target
[Service]
User=root
Environment="JAVA_OPTS=-Dhttp.proxyHost=代理服务器IP -Dhttp.proxyPort=代理端口 -Dhttps.proxyHost=代理服务器IP -Dhttps.proxyPort=代理端口 -Dhttp.proxyUser=root -Dhttp.proxyPassword='123456' -Dhttps.proxyUser=root -Dhttps.proxyPassword='123456'"
ExecStart=/usr/bin/java $JAVA_OPTS -jar /root/agent.jar -url http://jenkins服务器IP:8080/ -secret e599ddfbf117569f7cc26b5b72d59710589b972d68553399d819ff43cccc475a -name "192.168.114.88" -workDir /root/
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
⚠️请注意以下几点:
User=root 指定了以 root 用户运行该服务,这是因为 agent.jar 位于 /root/ 目录下通常只有 root 用户有访问权限。
Environment 这一行定义了一个 JAVA_OPTS 环境变量,其中包含所有 Java 系统属性。注意,密码是被包在引号内的,这对于含有特殊字符的密码来说非常重要。
ExecStart 定义了启动 Jenkins 代理的命令。$JAVA_OPTS 是在之前定义的环境变量,其中包括了代理服务器的配置。
Restart=always 和 RestartSec=10 表明服务在失败后总是会重启,并且每次重启之间会有 10 秒延迟。
注意上面的Environment要根据你实际的路径来填写哈
🌟3.3 启用和启动服务:
接下来,启用该服务并启动它:
bash
sudo systemctl enable jenkins-agent.service
sudo systemctl start jenkins-agent.service
🌟3.4 检查服务状态:
为了确认服务已经启动并运行中,你可以检查它的状态:
bash
sudo systemctl status jenkins-agent.service
完成以上步骤后,你的 Jenkins 代理将作为系统服务运行。在系统重启后,它也将自动启动。
✨小结:
以上就是jenkins通过Squid代理服务器来配置jenkins局域网节点的步骤,希望对大家有帮助。