如何配置Jenkins在端口80上运行

问题描述 投票:47回答:12

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

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

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

当我通过service jenkins start开始jenkins时,ps显示它运行了几秒钟然后终止。

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

这是upstart配置:

description "jenkins: Jenkins Continuous Integration Server"
author "James Page <[email protected]>"

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
ubuntu continuous-integration hudson jenkins upstart
12个回答
29
投票

尝试'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

对于较新的Jenkins安装(1.598)在较新的Ubuntu安装(14.04)上编辑/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。这是来自Ubuntu的authbind 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

0
投票

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

sudo nano /etc/rc.local

然后在退出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以启用端口转发


0
投票

更改/ etc / default / jenkins不能在我的设置上运行ubuntu 16.4 Jenkins 2.89.4以及使用iptable路由80到8080的解决方案与80运行jenkins所需的结果相反


0
投票

分别运行以下代码行:

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。


44
投票

另一种解决方案是简单地使用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 Community wiki有一个很好的页面解释这些方法。

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


33
投票
  1. 转到/ etc / default文件夹 - >打开文件“jenkins”
  2. 将HTTP_PORT = 8080行修改为HTTP_PORT = 80
  3. 使用以下命令以root身份启动jenkins:sudo /etc/init.d/jenkins start
  4. 打开浏览器并浏览为localhost:80

而已


7
投票

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

<VirtualHost *:443>
ServerAdmin [email protected]
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>

1
投票

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

JENKINS_PORT=80
JENKINS_HOME=/home/jenkins
/usr/bin/docker run -d -p $JENKINS_PORT:8080 -v $JENKINS_HOME jenkins

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命令并验证您是否正在看第一步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上

你可以找到更多细节here


1
投票

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

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

Method 1: Running Jenkins On 80 Using IP Table Forwarding Rule

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。

Method 2: Running Jenkins Behind Nginx Reverse Proxy

第1步:安装Nginx

sudo yum install nginx

第2步:打开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;

步骤5:为Nginx反向代理执行SELinux命令。

sudo setsebool httpd_can_network_connect 1 -P

第6步:重新启动Nginx服务器。

sudo systemctl restart nginx

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

Method 3: Jenkins Behind A Load Balancer

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


0
投票

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

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

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

顺便说一下,一旦测试过,不要忘记将它包含在服务器的init脚本中,否则重启后会丢失重定向。在Debian 8.2(Jessie)上测试

© www.soinside.com 2019 - 2024. All rights reserved.