我正在运行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
尝试'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
下载更高版本。确保你安装了libc6
和libc6-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
在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
以启用端口转发
更改/ etc / default / jenkins不能在我的设置上运行ubuntu 16.4 Jenkins 2.89.4以及使用iptable路由80到8080的解决方案与80运行jenkins所需的结果相反
分别运行以下代码行:
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。
另一种解决方案是简单地使用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有一个很好的页面解释这些方法。
与网络通常的情况一样,有很多不同的方法可以实现相同的结果。使用最适合你的方法!
而已
我建议使用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>
因为我使用了docker。您可以使用它在端口80上运行jenkins,以下是我的脚本片段:
JENKINS_PORT=80
JENKINS_HOME=/home/jenkins
/usr/bin/docker run -d -p $JENKINS_PORT:8080 -v $JENKINS_HOME jenkins
我有同样的问题,我找到了使用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。
您可以使用以下方法实现此目的。
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。
第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。
添加负载均衡器会增加Jenkins设置的额外成本。如果您在云端,则可以选择云特定的负载均衡器,将其所有端口80流量发送到后端Jenkins 8080端口。
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
没有答案说明如何使用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)上测试