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

haf*_*huk 48 ubuntu continuous-integration hudson upstart jenkins

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

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

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

当我启动jenkins via时service jenkins start,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
Run Code Online (Sandbox Code Playgroud)

Chr*_*key 45

另一种解决方案是简单地使用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
Run Code Online (Sandbox Code Playgroud)

重新格式化为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
Run Code Online (Sandbox Code Playgroud)

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有一个伟大的网页解释这些方法.

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


Rip*_*sim 33

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

而已

  • @PiotrekDe没有投票的原因是因为它不起作用.当我从8080将HTTP_PORT更改为80时,Jenkins无法启动.这是我得到的回溯:https://gist.github.com/tubbo/305164071d00409f6259 (20认同)
  • 以root身份启动Web应用程序是一个糟糕的主意.使用其他答案中解释的iptables技巧配置Apache HTTPD或重定向要好得多. (12认同)
  • 我真的不明白为什么这个答案没有被投票,而是你尝试做一些奇怪的解决方法.我完全按照Ripon的建议做了,就像一个魅力.只需一行配置.hafichuk有'权限被拒绝'异常的问题可能是因为他不是具有root权限的runnig jenkins!Linux端口<1024限制为受非root用户绑定. (6认同)
  • 同意以 root 身份运行是一个坏主意,但我指的是特定问题。我们可以以单独的用户身份运行它,chroot 它等等 - Ripon 解决方案适用于所有这些情况。 (2认同)

JSc*_*Ced 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
Run Code Online (Sandbox Code Playgroud)

然后修改上面的脚本(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
Run Code Online (Sandbox Code Playgroud)

对于较新的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
Run Code Online (Sandbox Code Playgroud)

正如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
Run Code Online (Sandbox Code Playgroud)


reg*_*his 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>
Run Code Online (Sandbox Code Playgroud)


Sub*_*ash 5

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

  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
Run Code Online (Sandbox Code Playgroud)

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

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

sudo iptables-save > /etc/sysconfig/iptables
Run Code Online (Sandbox Code Playgroud)

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

sudo sh -c "iptables-save > /etc/iptables.rules"
Run Code Online (Sandbox Code Playgroud)

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

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

第一步:安装Nginx

sudo yum install nginx
Run Code Online (Sandbox Code Playgroud)

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

sudo vi /etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)

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

location / {
}
Run Code Online (Sandbox Code Playgroud)

第 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;
Run Code Online (Sandbox Code Playgroud)

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

sudo setsebool httpd_can_network_connect 1 -P
Run Code Online (Sandbox Code Playgroud)

第六步:重启Nginx服务器。

sudo systemctl restart nginx
Run Code Online (Sandbox Code Playgroud)

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

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

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