52

我正在运行 Ubuntu 11.10 并已运行sudo apt-get install jenkins在此系统上安装 Jenkins。

我已经看过一些关于如何设置反向代理(Apache、Nginx 等)的教程,但是这是一个专门用于 jenkins 的 VM,我希望在让 jenkins 在端口 80 上运行时尽可能保持精简。

我在其中找到了新贵配置/etc/init/jenkins.conf并将端口修改为 80env HTTP_PORT=80

当我通过 启动 jenkins 时service jenkins startps显示它运行了几秒钟然后终止。

这是因为 jenkinsjenkins在特权端口上以用户身份运行吗?如果是这样,我该如何解决这个问题?欢迎任何其他想法。

这是暴发户配置:

description "jenkins: Jenkins Continuous Integration Server"
author "James Page <james.page@ubuntu.com>"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]

env USER="jenkins"
env GROUP="jenkins"
env JENKINS_LOG="/var/log/jenkins"
env JENKINS_ROOT="/usr/share/jenkins"
env JENKINS_HOME="/var/lib/jenkins"
env JENKINS_RUN="/var/run/jenkins"
env HTTP_PORT=80
env AJP_PORT=-1
env JAVA_OPTS=""
env JAVA_HOME="/usr/lib/jvm/default-java"

limit nofile 8192 8192

pre-start script
    test -f $JENKINS_ROOT/jenkins.war || { stop ; exit 0; }
    $JENKINS_ROOT/bin/maintain-plugins.sh   
    mkdir $JENKINS_RUN > /dev/null 2>&1  || true
    chown -R $USER:$GROUP $JENKINS_RUN || true
end script

script
    JENKINS_ARGS="--webroot=$JENKINS_RUN/war --httpPort=$HTTP_PORT --ajp13Port=$AJP_PORT"
    exec daemon --name=jenkins --inherit --output=$JENKINS_LOG/jenkins.log --user=$USER \
        -- $JAVA_HOME/bin/java $JAVA_OPTS -jar $JENKINS_ROOT/jenkins.war $JENKINS_ARGS \
        --preferredClassLoader=java.net.URLClassLoader
end script
4

13 回答 13

49

另一种解决方案是简单地使用 iptables 将传入流量从 80 重新路由到 8080。规则如下所示:

-A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
-A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

重新格式化为 iptables.rules 文件:

*filter
:INPUT ACCEPT [100:100000]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [95:9000]
-A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
COMMIT

*nat
-A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
COMMIT

iptable.rules 文件的优点是规则可以在重新启动后保留。只需确保将任何其他当前 iptable 规则集成到同一个文件中!

在 Redhat/CentOS 上,这个文件可以进入/etc/sysconfig/iptables.

在 Debian/Ubuntu 系统上,它们可以/etc/iptables/rules.v4通过使用iptables-persistent包来保存。/etc/network/interfaces或者可以通过修改或挂接到if-up/if-down脚本来调用 iptable.rules 。Ubuntu 社区 wiki有一个很棒的页面来解释这些方法。

与网络通常的情况一样,有很多不同的方法可以实现相同的结果。使用最适合您的!

于 2013-01-15T22:08:17.580 回答
37
  1. 转到 /etc/default 文件夹 --> 打开文件“jenkins”
  2. 将 HTTP_PORT=8080 行修改为 HTTP_PORT=80
  3. 使用以下命令以 root 身份启动 jenkins:sudo /etc/init.d/jenkins start
  4. 打开浏览器并以 localhost:80 身份浏览

就是这样

于 2013-01-10T12:18:53.227 回答
33

尝试“ authbind ”:

sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80 
sudo chown jenkins /etc/authbind/byport/80

然后将上面的脚本修改为具有(在部分authbind之前添加$JAVA_HOME/bin/java):

exec daemon --name=jenkins --inherit --output=$JENKINS_LOG/jenkins.log \
--user=$USER -- authbind $JAVA_HOME/bin/java $JAVA_OPTS \
-jar $JENKINS_ROOT/jenkins.war $JENKINS_ARGS \
--preferredClassLoader=java.net.URLClassLoader

对于较新的 Ubuntu 安装 (14.04) 上较新的 Jenkins 安装 (1.598),请在之前编辑/etc/init.d/jenkins和添加authbind$JAVA

$SU -l $JENKINS_USER --shell=/bin/bash -c "$DAEMON $DAEMON_ARGS -- authbind $JAVA $JAVA_ARGS -jar $JENKINS_WAR $JENKINS_ARGS" || return 2

正如Alan所提到的(请参阅下面的评论),如果您需要 IPv6 并且您的系统低于 Quantal,您可以使用下载更高版本来代替apt-get安装。authbind确保您已安装libc6libc6-udeb安装。这是authbind来自 Ubuntu 的 2.1.1 版本:

然后执行:

sudo dpkg -i authbind_2.1.1_amd64.deb
# or sudo dpkg -i authbind_2.1.1_i386.deb

sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80 
sudo chown jenkins /etc/authbind/byport/80
于 2012-02-17T15:32:14.913 回答
7

我建议使用 apache 和 mod_proxy。这就是我所做的,我的虚拟主机配置看起来有点像这样(我也为 SSL 重定向,但你可以省略它):

<VirtualHost *:443>
ServerAdmin webmaster@example.com
ServerName ci.example.com

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyPreservehost on
ProxyPass / http://localhost:8080/

Header edit Location ^http://ci.example.com/ https://ci.example.com/

SSLEngine on
SSLCertificateFile /etc/apache2/keys/apache.pem
</VirtualHost>
于 2012-04-24T17:07:20.657 回答
6

您可以使用以下方法实现此目的。

  1. IP 表转发规则。
  2. 使用像 Nginx 这样的反向代理。
  3. 在负载均衡器后面运行 Jenkins。

方法一:使用IP表转发规则在80上运行Jenkins

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

现在,您应该保存这些规则,以便即使在 IPtable 或系统重新启动后它也会保留。

对于基于 Redhat 的系统,运行以下命令。

sudo iptables-save > /etc/sysconfig/iptables

对于基于 Debian 的系统,执行以下命令。

sudo sh -c "iptables-save > /etc/iptables.rules"

现在如果你在 80 端口访问 Jenkins,IP 表会自动将请求转发到 8080。

方法二:在 Nginx 反向代理后面运行 Jenkins

第一步:安装 Nginx

sudo yum install nginx

第二步:打开 Nginx 配置文件。

sudo vi /etc/nginx/nginx.conf

第 3 步:在 nginx.conf 文件中找到以下代码段。

location / {
}

第 4 步:在花括号之间添加以下行。

proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
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;

第五步:执行 Nginx 反向代理的 SELinux 命令。

sudo setsebool httpd_can_network_connect 1 -P

第六步:重启 Nginx 服务器。

sudo systemctl restart nginx

现在,如果您能够在端口 80 上访问 Jenkins。

方法 3:负载均衡器后面的 Jenkins

添加负载均衡器会增加 Jenkins 设置的额外成本。如果您在云上,您可以选择特定于云的负载均衡器,它将所有端口 80 流量发送到后端 Jenkins 8080 端口。

于 2019-02-21T14:17:41.097 回答
1

因为我使用了 docker。您可以使用它在端口 80 上运行 jenkins,以下是我的脚本片段:

JENKINS_PORT=80
JENKINS_HOME=/home/jenkins
/usr/bin/docker run -d -p $JENKINS_PORT:8080 -v $JENKINS_HOME jenkins
于 2015-05-13T13:06:54.620 回答
1

我遇到了同样的问题,我使用iptables找到了最好的解决方案。

默认情况下,Jenkins 在端口 8080 或 8443 上运行。HTTP/HTTPS 服务器在端口 80 和 443 上运行。

但这是这些特殊端口,使用它们的进程必须由 root 拥有。

但是以 root 身份运行 Jenkins 并不是最好的解决方案(它应该以自己的用户身份运行),使用 Apache 等 Web 服务器运行 Jenkins 并让它代理对 Jenkins 的请求也是如此

最好的解决方案是在 Linux 上使用 iptables 来转发流量。

1) 使用此命令列出当前的 iptables 配置:

$ iptables -L -n

target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

2)如果您没有看到上述条目,那么您需要运行以下命令:

sudo iptables -I INPUT 1 -p tcp --dport 8443 -j ACCEPT

sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT

sudo iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT

sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

3) 现在重新运行$ iptables -L -n命令并验证您看到的是第 1 步 o/p。

4) 最后一步是运行以下命令将端口 80 流量转发到 8080,将端口 443 流量转发到 8443(如果您使用的是 HTTPS)。

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8443

5) 现在您的 URL 应该保留在端口 80 上

您可以在此处找到更多详细信息。

于 2018-10-16T14:36:59.733 回答
1

单独运行这些代码行:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
sudo iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

如果您的系统是基于 Debian 的,请运行:

sudo sh -c "iptables-save > /etc/iptables.rules"

如果您的系统是基于 RedHat 的:

sudo iptables-save > /etc/sysconfig/iptables

此过程会将您的默认 Jenkins 端口从 8080 更改为 80。

于 2019-04-11T15:40:03.040 回答
0

将端口 8080 转发到 80 的 firewalld 方式:

yum install firewalld
systemctl start firewalld
chkconfig firewalld on
firewall-cmd --permanent --zone=external --change-interface=eth0
firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
于 2014-11-24T23:25:02.450 回答
0

没有一个答案告诉如何使用 iptables 简单地将 80 重定向到 8080。
幸运dskrvk的是,评论确实如此!

还有一个Jenkins wiki记录了这一点


我只需在终端中复制/粘贴这些行即可使重定向正常工作:

sudo iptables -I INPUT 1 -p tcp --dport 8443 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8443

顺便说一句,一旦测试过,不要忘记将它包含到您的服务器的初始化脚本中,否则您将在重新启动后丢失重定向。 在 Debian 8.2 (Jessie) 上测试

于 2017-01-05T17:33:47.240 回答
0

在 Ubuntu 16.04 中,这个 wiki解释了如何做到这一点。

sudo nano /etc/rc.local

然后在exit 0之前添加以下内容

#Requests from outside
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
#Requests from localhost
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

现在重新启动或运行sudo /etc/rc.local以启用端口转发

于 2018-03-20T09:08:31.337 回答
0

更改 /etc/default/jenkins 在我的设置 ubunutu 16.-4 Jenkins 2.89.4 上不起作用,使用 iptable 路由 80 到 8080 的解决方案与在 80 上运行 jenkins 所需的结果相反

于 2018-05-13T17:19:42.693 回答
0

基于此问题的其他答案:如果您像我一样使用 ECS,则可以使用 Nginx 边车容器。一个超级简单的 nginx 配置,类似于

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {

    server {
        listen 80;
        location / {
            proxy_pass http://localhost:8080;
            proxy_redirect off;
            proxy_set_header Host $host;
            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;
        }
    }
}

应该足以转发来自端口 80->8080 的所有传入流量。然后,您可以将此容器绑定到端口 80,瞧 - Jenkins 现在“驻留在”端口 80。

于 2019-12-18T17:51:58.457 回答