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

时间:2012-02-17 14:54:17

标签: ubuntu continuous-integration hudson jenkins upstart

我正在运行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 <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

13 个答案:

答案 0 :(得分: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有一个很好的页面解释了这些方法。

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

答案 1 :(得分:32)

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

答案 2 :(得分: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

对于较新的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。这是来自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

答案 3 :(得分:7)

我建议使用apache和mod_proxy。这就是我所做的,我的vhost配置看起来有点像这样(我也重定向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>

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

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

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

但是,以root身份运行Jenkins并不是最佳解决方案(应以其自己的用户身份运行),因此,使用Web服务器(如Apache)运行Jenkins并让其将请求代理到J​​enkins >

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

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

const ArticlesStack = createStackNavigator({ Articles: ArticlesScreen, }, { cardStyle: { backgroundColor: '#fff' }, }); const ProfileStack = createStackNavigator({ Profile: ProfileScreen, }, { cardStyle: { backgroundColor: '#fff' }, }); const ArticleStack = createStackNavigator({ Article: ArticleScreen, }, { cardStyle: { backgroundColor: '#fff' }, }); ArticlesStack.navigationOptions = { tabBarLabel: 'Articles', tabBarIcon: ({ focused }) => ( <TabBarIcon focused = {focused} name = { Platform.OS === 'ios' ? `ios-link${focused ? '' : '-outline'}` : 'md-link' } /> ), }; ArticleStack.navigationOptions = { header: null, }; ProfileStack.navigationOptions = { tabBarLabel: 'Profile', tabBarIcon: ({ focused }) => ( <TabBarIcon focused = {focused} name = { Platform.OS === 'ios' ? `ios-options${focused ? '' : '-outline'}` : 'md-options' } /> ), }; bottomTabNavigator = createBottomTabNavigator({ ArticlesStack, ArticleStack, ProfileStack, }); export default createSwitchNavigator({ Main: bottomTabNavigator, });

$ iptables -L -n

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

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

3)现在,重新运行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 命令,并验证您是否正在执行第一步o / p。

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

$ iptables -L -n

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

您可以找到更多详细信息here

答案 6 :(得分:1)

您可以使用以下方法来实现。

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

方法1:使用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。

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

第一步:安装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。

方法3:负载均衡器后面的詹金斯

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

答案 7 :(得分: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

答案 8 :(得分: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)上测试

答案 9 :(得分: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以启用端口转发

答案 10 :(得分:0)

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

答案 11 :(得分: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。

答案 12 :(得分: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,然后瞧-詹金斯现在“驻留”在端口80上。