詹金斯服务器 --httpListenAddress=127.0.0.1 不工作

Jenkins server --httpListenAddress=127.0.0.1 not working

最近安装了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"

重启jenkins后,我仍然可以在端口8080

上访问Jenkins

环境:

Ubuntu 20.04

OpenJDK 11

詹金斯 2.332.1

Netstat 输出:

    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

P.S。我试过 EC2/Amazom linux 2,同样的问题

虽然在 AWS 环境中限制端口 8080 不会有什么坏处,但实际上没有理由为此担心。您需要为您的服务器设置一个 security group,这样除了端口 22 (ssh)、端口 80 (http) 和端口 443 (https) 之外的所有内容都被阻止。您可以通过 AWS 控制台执行此操作。

为此,请转到 AWS 控制台和 select EC2,然后转到您的实例。页面中间是“安全”选项卡。从那里您可以创建一个安全组来确定允许进出的流量。

通过这种方式,没有人可以连接到您不允许进入的任何 端口。您目前没有使用 https 看起来像,所以您可能想离开出端口 443,直到你准备好。

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

如您所见,在 /lib/systemd/system/jenkins.service 中设置环境变量确实有效,但您的直觉是绝对正确的,直接编辑由打包系统管理的单元文件不是最佳做法。与 Linux 中的大多数内容一样,/etc 目录是管理员用来放置他们的配置文件的地方,而 /lib/usr/lib 是为包管理器保留的,所以幸运的是systemd 也不例外,它为此类更改提供了一种机制。

Systemd 具有“drop-in”目录的概念,您可以在其中放置具有部分 systemd 单元配置的“.conf”文件,其指令将覆盖主单元文件中的指令。来自 systemd.unit man page:

Along with a unit file foo.service, a "drop-in" directory foo.service.d/ may exist. All files with the suffix ".conf" from this directory will be merged in the alphanumeric order and parsed after the main unit file itself has been parsed. This is useful to alter or add configuration settings for a unit, without having to modify unit files. Each drop-in file must contain appropriate section headers.

以下是我在 Ubuntu 20.04 上设置 Jenkins 2.332.1 的方法,使用 systemd drop-in 覆盖将侦听器绑定到 127.0.0.1:

验证 Jenkins 是 运行 并监听所有 addresses/interfaces:

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

为 Jenkins 创建一个 systemd drop-in 目录:

$ sudo mkdir /etc/systemd/system/jenkins.service.d

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

[Service]
Environment="JENKINS_LISTEN_ADDRESS=127.0.0.1"

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

$ sudo systemctl daemon-reload

我们可以重新启动 Jenkins 来给它新的配置:

$ sudo systemctl restart jenkins

如果我们验证我们的工作,我们现在可以看到 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))

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