可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm running Ubuntu 11.10 and have run sudo apt-get install jenkins
to install Jenkins on this system.
I've seen some tutorials on how to setup a reverse proxy (Apache, Nginx, etc), however this is a VM dedicated for just jenkins and I'd like keep it as lean as possible while having jenkins running on port 80.
I've found the upstart config in /etc/init/jenkins.conf
and modified the port to 80 env HTTP_PORT=80
When I start jenkins via service jenkins start
, ps
reveals that it runs for a few seconds then terminates.
Is this because jenkins is running as the jenkins
user on a privileged port? If so, how do I fix this? Any other ideas a welcome.
Here is the upstart config:
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
回答1:
Give a try to '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
Then modify the script above to have (add authbind
before the $JAVA_HOME/bin/java
part):
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
For newer Jenkins installations (1.598) on newer Ubuntu installations (14.04) edit /etc/init.d/jenkins
and add authbind
before $JAVA
$SU -l $JENKINS_USER --shell=/bin/bash -c "$DAEMON $DAEMON_ARGS -- authbind $JAVA $JAVA_ARGS -jar $JENKINS_WAR $JENKINS_ARGS" || return 2
As mentioned by Alan (see comment below) if you need IPv6 and your system is lower than Quantal you can instead of using apt-get
to install authbind
download a higher version.
Make sure you have libc6
and libc6-udeb
installed. Here is authbind
version 2.1.1 from Ubuntu:
Then execute:
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
回答2:
Another solution is to simply use iptables to reroute incoming traffic from 80 to 8080. The rules would look like:
-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
Reformatted as an iptables.rules file:
*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
The advantage of a iptable.rules file is the rules can persist after reboots. Just make sure to integrate any other current iptable rules into the same file!
On Redhat/CentOS this file can go in /etc/sysconfig/iptables
.
On Debian/Ubuntu systems they can be saved in /etc/iptables/rules.v4
by using the iptables-persistent
package. Or the iptable.rules can be called by modifying /etc/network/interfaces
or hooking into if-up
/if-down
scripts. The Ubuntu Community wiki has a great page explaining these methods.
As is usually the case with networking, there's a lot of different ways to accomplish the same result. Use what works best for you!
回答3:
- Go to /etc/default folder --> Open the file "jenkins"
- Modify the line HTTP_PORT=8080 as HTTP_PORT=80
- Start jenkins as root by using the command: sudo /etc/init.d/jenkins start
- Open a browser and browse as localhost:80
that's it
回答4:
I'd suggest using apache and mod_proxy. This is what I do, and my vhost config looks kinda like this (I also redirect for SSL but you can omit that):
<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>
回答5:
Since I used docker. You can use it to run jenkins on port 80, hereafter a snippet of my script:
JENKINS_PORT=80
JENKINS_HOME=/home/jenkins
/usr/bin/docker run -d -p $JENKINS_PORT:8080 -v $JENKINS_HOME jenkins
回答6:
I had the same problem and I found the best solution to it using iptables.
By default Jenkins runs on ports 8080 or 8443.
And HTTP/HTTPS servers run on ports 80 and 443.
But this is these are the special ports and the process using them must be owned by root.
But running Jenkins as root is not the best solution(it should be run as its own user) and so does to run Jenkins with a web server such as Apache, and let it proxy requests to Jenkins
The best solution is to use iptables on Linux to forward traffic.
1) Use this command to list the current iptables configuration:
$ 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) If you don't see above entries, then you need to run below commands:
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) Now re-run the $ iptables -L -n
command and verify that you are seeing 1st step o/p.
4) The final step is to run the below commands to forward port 80 traffic to 8080, and port 443 traffic to 8443(if you are using 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) Now your URL should stay on port 80
You can find the more details here.
回答7:
the firewalld way to forward port 8080 to 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:
None of the answers tells how to simply redirect 80 to 8080 with iptables.
Fortunately, dskrvk
's comment does !
There's also a Jenkins wiki documenting this
I just had to copy/paste those lines in my terminal to get the redirect working :
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
Btw, don't forget to include it to your server's init scripts once tested, or you'll lose the redirect after a reboot.
Tested on Debian 8.2 (Jessie)
回答9:
In Ubuntu 16.04, this wiki explains how to do it.
sudo nano /etc/rc.local
Then add the following just before the exit 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
Now reboot or run sudo /etc/rc.local
to enable port forwarding
回答10:
changing /etc/default/jenkins doesn't work on my setup ubunutu 16.-4 Jenkins 2.89.4 and the solution to use iptable routes 80 to 8080 whis the opposite of the required result of running jenkins on 80