A2enmod代理A2enmod proxy_http A2enmod报头
在你的服务器上有现有网站的情况下,你可能会发现在Apache后面运行Jenkins(或Jenkins运行的servlet容器)很有用,这样你就可以将Jenkins绑定到你可能拥有的更大网站必威国际有限公司的一部分。本节讨论实现此目的的一些方法。
请确保您将Jenkins httpListenAddress必威国际有限公司从默认的0.0.0.0更改为127.0.0.1,否则任何apache级别的限制都可以通过直接访问Jenkins端口轻松绕过。
使用Apache配置Jenkins有几种不同的替代方案。必威国际有限公司选择最能满足你需要的方法:
mod_proxy工作原理是让Apache执行“反向代理”——当一个请求到达特定的url时,Apache成为一个代理并将该请求转发给Jenkins,然后将来自Jenkins的响应转发回客户机。必威国际有限公司
需要安装的Apache模块如下:
A2enmod代理A2enmod proxy_http A2enmod报头
mod_proxy的典型设置是这样的:
ProxyPass /必威国际有限公司 jenkins http://localhost: 8081 / jenkins nocanon ProxyPassReverse / jenkins http://localhost: 8081 / jenkins ProxyRequests AllowEncodedSlashes NoDecode #当地反向代理授权覆盖#大多数unix分布否认代理在Ubuntu默认#看到/etc/apache2/mods-enabled / proxy.conf <代理http://localhost: 8081 / jenkins * >订单所有代理>
这假设您在端口8081上运行Jenkins。必威国际有限公司
为了让这个设置生效,Jenkins的上下文路径必威国际有限公司一定是一样的在你的阿帕奇和詹金斯之间(也就是说,你不能运行詹必威国际有限公司金斯http://localhost:8081/ci让它暴露在http://localhost:80/必威国际有限公司jenkins).
在Windows中通过修改必威国际有限公司jenkins.xml
配置文件,并在
在使用Ubuntu包时,通过添加上下文路径来设置上下文路径——prefix =必威国际有限公司 / jenkins
来必威国际有限公司JENKINS_ARGS
在/etc/default/必威国际有限公司jenkins
(或在/etc/sysconfig/必威国际有限公司jenkins
对于RHEL / CentOS包)
当在专用服务器上运行时,你使用/作为上下文,确保你在apache的代理参数的所有url的末尾添加一个斜杠。否则您可能会遇到代理错误。所以
ProxyPass / http://localhost:8080/ nocanon
而不是
ProxyPass / http://localhost:8080 nocanon #不工作
注意,这是不适用于ProxyPassMatch
指令,其行为不同于ProxyPass
.下面是一个例子ProxyPassMatch
来代理除/ .well-known
(letsencrypt要求的URL):
ProxyPassMatch ^/(?\!. known) http://localhost:8080 nocanon
的ProxyRequests掉阻止Apache作为转发代理服务器(除了ProxyPass),除非服务器应该充当代理,否则建议包含它。
这两个nocanon
选项ProxyPass
,和AllowEncodedSlashes NoDecode
,是詹金斯的某些功能工作所必需的。必威国际有限公司
如果您在一个安全增强的Linux (SE-Linux)机器上运行Apache,那么通过作为根执行命令使SE-Linux做正确的事情是至关重要的
setsebool -P httpd_can_network_connect true
如果没有发出,Apache将不允许将代理请求转发给Jenkins,只会显示一个错误消息。必威国际有限公司
因为Jenkin必威国际有限公司s已经压缩了它的输出,你不能使用普通的proxy-html过滤器来修改url:
SetOutputFilter proxy-html
相反,你可以使用以下方法:
proxy-html;DEFLATE ProxyHTMLURLMap http://your_server:8080/jenkins /jenkins必威国际有限公司
但由于Jenkins必威国际有限公司表现良好,所以最好不要使用SetOutputFilter和ProxyHTMLURLMap。
如果Jenkins有时服务随机垃圾页面有问题,那么下面必威国际有限公司的方法可能会有所帮助:
SetEnv proxy-nokeepalive 1
有些插件从Host头判断客户端请求的url,所以如果遇到错误url的问题,可以尝试打开ProxyPreserveHost
指令,默认关闭:
ProxyPreserveHost上
你可以添加一个额外的ProxyPassReverse
指令将Jenkins生成的非SSL url重定向到SSL端。必威国际有限公司假设你的网络服务器是your.host.com
,在SSL虚拟主机定义中放置以下内容将达到目的:
ProxyRequests Off ProxyPreserveHost On AllowEncodedSlashes NoDecode Order deny,allow allow from all ProxyPass /jenkins http://localhost:8081/jenkins nocanon ProxyPassReverse /jenkins http://localhost:8081/jenkins ProxyPassReverse /jenkins http://your.host.com/jenkins
另一种选择是重写Location头文件,其中包含Jenkins生成的非ssl URL。必威国际有限公司如果你想从https://www.examp必威国际有限公司le.com/jenkins访问Jenkins,在SSL虚拟主机定义中放置以下内容也可以:
ProxyRequests Off ProxyPreserveHost On ProxyPass /必威国际有限公司jenkins/ http://localhost:8081/jenkins/ nocanon AllowEncodedSlashes NoDecode ProxyPassReverse / Order deny,allow allow from all Header edit Location ^http://www.example.com/jenkins/ https://www.example.com/jenkins/
但它也可以很好地工作,仅仅使用简单的转发上面(第一个HTTPS片段),并添加
RequestHeader set x - forward - proto "https"
在HTTPS站点配置中,就像下面的Docker演示一样。(X-Forwarded-Port
不是詹金斯之前解释的吗必威国际有限公司必威国际有限公司詹金斯- 23294因此,配置servlet容器以指定初始端口也是可取的。)
NameVirtualHost *:80 NameVirtualHost *:443 ServerAdmin webmaster@localhost Redirect permanent / https://www.example.com/ SSLEngine on SSLCertificateFile /etc/ssl/certs/cert.pem服务器webmaster@localhost ProxyRequests ProxyPreserveHost在AllowEncodedSlashes NoDecode <代理* >订单否认,允许允许从所有代理> < / ProxyPass / http://localhost: 8080 / nocanon ProxyPassReverse / http://localhost: 8080 / ProxyPassReverse / http://www.example.com/ RequestHeader X-Forwarded-Proto“https”RequestHeader集X-Forwarded-Port“443”< /虚拟主机>
必威国际有限公司Jenkins可以配置为使用mod_ajp或mod_proxy_ajp,这样Jenkins运行在一个不同于典型Tomcat服务器的工作区中,但这两种方式都可以通过Apache web服务器使用。
配置Jenkins使必威国际有限公司用不同于Tomcat的web和ajp端口:
HTTP_PORT = 9080 AJP_PORT = 9009…nohup java -jar "$WAR" \——httpPort=$HTTP_PORT \——ajp13Port=$AJP_PORT \——prefix=/jen必威国际有限公司kins >> "$LOG" 2>&1 &
然后设置Apache,以便它知道这个前缀/必威国际有限公司詹金斯
在httpd.conf文件中由AJP提供:
LoadModule jk_module libexec / httpd / mod_jk。所以AddModule mod_jk. c# == AJP hooks == JkWorkersFile /etc/httpd/workers.JkLogFile /private/var/log/httpd/mod_jk.log JkLogLevel info JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " JkOptions +ForwardKeySize +ForwardURICompat - forwarddirectories JkRequestLogFormat "%w %V %T" # JkLogFile /private/var/log/httpd/mod_jk.log JkLogLevel info JkLogStampFormat "[%a %b %d %H:%M:%S %Y]JkMo必威国际有限公司unt /friki/* worker1 JkMount /pebble/* worker1 JkMount / Jenkins /* worker2
最后是上面指定的workers.conf文件,它告诉AJP哪个端口该用于哪个web应用:
#使用ajp13 worker定义2个真正的worker。#设置worker1 (ajp13) worker.worker1的属性。类型= ajp13 worker.worker1。主机= localhost worker.worker1。= 8009 worker.worker1港。lbfactor = 50 worker.worker1。cachesize worker.worker1 = 10。cache_timeout = 600 worker.worker1。socket_keepalive=1 #设置worker2的属性(ajp13)类型= ajp13 worker.worker2。主机= localhost worker.worker2。= 9009 worker.worker2港。lbfactor = 50 worker.worker2。cachesize worker.worker2 = 10。cache_timeout=600 worker.worker2.socket_keepalive=1 worker.worker2.recycle_timeout=300
对于启用ssl的反向代理,AJP可以说是一种更干净的替代方案,因为Jenkins将不接触所有相关的HTTP头。必威国际有限公司配置也很简单,只需三个简单步骤:
1.为Jenkins配置AJP端口(如上所述)必威国际有限公司
HTTP_PORT = 1 AJP_PORT = 9009…nohup java -jar "$WAR" \——httpPort=$HTTP_PORT \——ajp13Port=$AJP_PORT \——prefix=/jen必威国际有限公司kins >> "$LOG" 2>&1 &
2.启用Apache中的mod_proxy_ajp:
# a2enmod proxy_ajp
3.在启用ssl的VirtualHost中包含以下代码片段:
< 443 > VirtualHost *:…SSLEngine……AllowEncodedSlashes NoDecode ProxyRequests Off ProxyPass /必威国际有限公司jenkins ajp://localhost:9009/jenkins nocanon . AllowEncodedSlashes NoDecode ProxyRequests Off ProxyPass /jenkins ajp://localhost:9009/jenkins nocanon
注意AllowEncodedSlashes
和ProxyPass…nocanon
说服Apache不要干涉PATH_INFO。
Apache mod_rewrite模块可以用来为Jenkins配置一个Apache反向代理。必威国际有限公司
需要安装的Apache模块如下:
重写A2enmod代理A2enmod proxy_http
典型的mod_rewrite配置如下:
#使用最后的国旗,因为不再重写后可以应用代理通过RewriteRule ^ /詹金斯(. *)$ http://localhost: 8081 / jenkins 1美元[必威国际有限公司P L] ProxyPassReverse / jenkins http://localhost: 8081 / jenkins ProxyRequests #当地反向代理授权覆盖#大多数unix分布否认代理默认#看到/etc/apache2/mods-enabled / proxy.confUbuntu Order deny,allow allow from all
这假设您在端口8081上运行Jenkins。必威国际有限公司为了使这个设置生效,在Apache和Jenkins之间Jenkins的上下文路径必须相同(必威国际有限公司也就是说,您不能在Jenkins上运行http://localhost:8081/ci让它暴露在http://localhost:80/必威国际有限公司jenkins)
的ProxyRequests掉阻止Apache作为转发代理服务器(除了ProxyPass),除非服务器应该充当代理,否则建议包含它。
使用普通的CLI协议和HTTP(S)传输通过Apache反向代理访问Jenkins是不起作用的。必威国际有限公司看到必威国际有限公司JENKINS-47279 -使用普通CLI协议的全双工HTTP(S)传输不能与Apache反向代理一起工作为更多的细节。作为一个变通方法,您可以使用CLI / SSH.
如果使用Apache,请检查nocanon被设置在ProxyPass这AllowEncodedSlashes是集。
AllowEncodedSlashes不是继承在Apache配置,所以这个指令必须放在虚拟主机定义。