Jenkins通过Squid代理服务器添加局域网节点机器

✨前言:

当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局域网节点的步骤,希望对大家有帮助。

相关推荐
lemons840几秒前
Web基础和HTTP协议
linux·运维·nginx·http·html
安全信息等保测评师16 分钟前
云海中的坚固灯塔:等保测评视角下的混合云安全策略与合规性深度剖析
linux·运维·服务器·网络·网络协议
_秋牧32 分钟前
Docker 镜像导出和导入
运维·docker·容器
Xiao200001011 小时前
一文讲解Docker入门到精通
运维·docker·容器
大雨淅淅1 小时前
【高考志愿】自动化
运维·自动化·高考
Jurio.1 小时前
【ACM出版】第13届亚洲膜计算会议(ACMC2024)暨 2024年机器学习、模式识别与自动化工程国际学术会议(MLPRAE 2024,8月7日-9)
运维·机器学习·自动化·国际会议·模式识别·膜计算
代码之光_19801 小时前
自动化邮件通知:批处理脚本的通讯增强
运维·自动化
软泡芙1 小时前
【Docker】可视化平台Portainer
运维·docker·容器
ZKNOW甄知科技1 小时前
仿真数据管理与运维管理,驱动新型电力系统创新
运维·信息可视化·需求分析·数据库开发·数据库架构
kkk123441 小时前
DevOps
运维·devops