Jenkins 服务器 --httpListenAddress=127.0.0.1 不工作

1 jenkins nginx-reverse-proxy

最近我安装了 Jenkins 服务器,并想将其隐藏在 Nginx 代理后面。我的 Nginx 代理工作正常,我阅读了限制 Jenkins 的内容,127.0.0.1:8080因此,我编辑了配置文件/etc/default/jenkins并添加了以下代码行:

JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=8080 --httpListenAddress=127.0.0.1"
Run Code Online (Sandbox Code Playgroud)

重新启动詹金斯后,我仍然可以访问端口上的詹金斯8080

环境:

乌班图20.04

OpenJDK 11

詹金斯2.332.1

网络统计输出:

    sudo netstat -plnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      2313/java

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      970/nginx: master p
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      708/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      946/sshd: /usr/sbin
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      757/cupsd

tcp6       0      0 :::80                   :::*                    LISTEN      970/nginx: master p
tcp6       0      0 :::22                   :::*                    LISTEN      946/sshd: /usr/sbin
tcp6       0      0 ::1:631                 :::*                    LISTEN      757/cupsd
Run Code Online (Sandbox Code Playgroud)

PS 我在 EC2/Amazom linux 2 上尝试过,同样的问题

小智 5

从您表示正在运行的 Jenkins 版本 2.332.1 开始,Jenkins 从使用经典 SysV 初始化脚本作为服务运行切换为与支持它的 Linux 发行版(包括 Ubuntu 20.04)上的 systemd 完全集成。我没有看到任何迹象表明 Jenkins 的 systemd 单元文件曾经解析过/etc/default/jenkins,这意味着这些设置仅由 SysV init 脚本解析,这可以解释为什么您的配置在那里没有效果。

正如您所发现的,设置环境变量确实/lib/systemd/system/jenkins.service有效,但您的直觉绝对正确,直接编辑由打包系统管理的单元文件不是最佳实践。与 Linux 中的大多数内容一样,该/etc目录是管理员放置配置文件的位置,并且/lib/usr/lib为包管理器保留的,因此幸运的是 systemd 也不例外,并提供了进行此类更改的机制。

Systemd 具有“插入”目录的概念,您可以在其中放置带有部分 systemd 单元配置的“.conf”文件,这些文件的指令将覆盖主单元文件中的指令。从systemd.unit 手册页

除了单元文件之外,还可能存在foo.service“插入”目录。foo.service.d/此目录中带有后缀“.conf”的所有文件将按字母数字顺序合并,并在解析主单元文件本身后进行解析。这对于更改或添加单元的配置设置非常有用,而无需修改单元文件。每个嵌入式文件必须包含适当的节标题。

以下是我如何在 Ubuntu 20.04 上设置 Jenkins 2.332.1,使用 systemd drop-in override 将侦听器绑定到 127.0.0.1:

验证 Jenkins 正在运行并侦听所有地址/接口:

$ sudo ss -tlnp | grep 8080
LISTEN    0         50               *:8080               *:*        users:(("java",pid=2688,fd=116))       
Run Code Online (Sandbox Code Playgroud)

为 Jenkins 创建一个 systemd 放置目录:

$ sudo mkdir /etc/systemd/system/jenkins.service.d
Run Code Online (Sandbox Code Playgroud)

使用您喜欢的编辑器创建覆盖文件。您可以随意命名它,只要它有.conf扩展名即可。就我个人而言,我更喜欢描述性的内容并以数字开头,这样我就可以控制解析文件的字典顺序,如果我最终得到多个覆盖文件的话。鉴于此,我创建了一个/etc/systemd/system/jenkins.service.d/50-listen-address-override.conf包含以下内容的文件:

[Service]
Environment="JENKINS_LISTEN_ADDRESS=127.0.0.1"
Run Code Online (Sandbox Code Playgroud)

现在,我们所要做的就是告诉 systemd 我们做了一些更改,希望它重新解析:

$ sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

我们可以重新启动 Jenkins 以为其提供新的配置:

$ sudo systemctl restart jenkins
Run Code Online (Sandbox Code Playgroud)

如果我们验证我们的工作,我们现在可以看到 Jenkins 仅绑定到 127.0.0.1:

$ sudo ss -tlnp | grep 8080
LISTEN   0        50          [::ffff:127.0.0.1]:8080          *:*       users:(("java",pid=31636,fd=116))
Run Code Online (Sandbox Code Playgroud)

对于它的价值,您还可以使用该命令systemctl edit jenkins来创建覆盖,systemd 会自动为您创建嵌入目录和覆盖文件,并将您放入默认编辑器中以写入文件内容,但是它不会为您提供可以自由地为覆盖文件选择您自己的名称,而是为其指定一个通用名称override.conf.