我正在运行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
答案 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)
就是这样
答案 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
下载更高版本。
确保已安装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
答案 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并让其将请求代理到Jenkins >
最好的解决方案是在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)
您可以使用以下方法来实现。
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
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端口。
答案 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上。