Ubuntu 11.10を実行しており、Sudo apt-get install jenkins
を実行してこのシステムにJenkinsをインストールしています。
リバースプロキシ(Apache、Nginxなど)のセットアップ方法に関するチュートリアルを見てきましたが、これはVM jenkins専用であり、できるだけ無駄のないようにしたいです。ジェンキンスをポート80で実行している間。
/etc/init/jenkins.conf
でupstart構成を見つけ、ポートを80 env HTTP_PORT=80
に変更しました
service jenkins start
を介してjenkinsを起動すると、ps
は、数秒間実行されてから終了することを示します。
これは、ジェンキンスが特権ポートで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
次に、上記のスクリプトを変更して($Java_HOME/bin/Java
部分の前にauthbind
を追加します):
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
を編集し、$Java
の前にauthbind
を追加します
$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
別の解決策は、単に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を呼び出すことができます。 buntu 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_PORT=80
JENKINS_HOME=/home/jenkins
/usr/bin/docker run -d -p $JENKINS_PORT:8080 -v $JENKINS_HOME 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に転送します。
ステップ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ポートに送信するクラウド固有のロードバランサーを選択できます。
私は同じ問題を抱えていて、iptablesを使用してそれに対する最良の解決策を見つけました。
デフォルトでは、Jenkinsはポート8080または8443で実行されます。また、HTTP/HTTPSサーバーはポート80および443で実行されます。
しかし、これは特別なポートであり、それらを使用するプロセスはrootが所有する必要があります。
しかし、Jenkinsをrootとして実行するのは最良の解決策ではありません(独自のユーザーとして実行する必要があります)。
最善の解決策は、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のままになります。
詳細は こちら をご覧ください。
答えはどれも、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)でテスト済み
ポート8080を80に転送するfirewalldの方法:
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
/ etc/default/jenkinsを変更してもセットアップubunutu 16.-4 Jenkins 2.89.4とiptableルート80から8080を使用するソリューションでは動作しません。
次のコード行を個別に実行します。
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に変更されます。
Ubuntu 16.04では、 この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
を実行してポート転送を有効にします