反向代理- Apache

在你的服务器上有现有网站的情况下,你可能会发现在Apache后面运行Jenkins(或Jenkins运行的servlet容器)很有用,这样你就可以将Jenkins绑定到你可能拥有的更大网站必威国际有限公司的一部分。本节讨论实现此目的的一些方法。

请确保您将Jenkins httpListenAddress必威国际有限公司从默认的0.0.0.0更改为127.0.0.1,否则任何apache级别的限制都可以通过直接访问Jenkins端口轻松绕过。

使用Apache配置Jenkins有几种不同的替代方案。必威国际有限公司选择最能满足你需要的方法:

mod_proxy

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配置文件,并在条目中添加——prefix=/jenkins必威国际有限公司(或类似的)。
在使用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选项ProxyPassAllowEncodedSlashes 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上

mod_proxy与HTTPS

你可以添加一个额外的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”< /虚拟主机>

mod_ajp或mod_proxy_ajp

必威国际有限公司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

mod_proxy_ajp与SSL

对于启用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 

注意AllowEncodedSlashesProxyPass…nocanon说服Apache不要干涉PATH_INFO。

mod_rewrite

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),除非服务器应该充当代理,否则建议包含它。

使用HTTP(S)传输代理CLI命令

使用普通的CLI协议和HTTP(S)传输通过Apache反向代理访问Jenkins是不起作用的。必威国际有限公司看到必威国际有限公司JENKINS-47279 -使用普通CLI协议的全双工HTTP(S)传输不能与Apache反向代理一起工作为更多的细节。作为一个变通方法,您可以使用CLI / SSH

如果使用Apache,请检查nocanon被设置在ProxyPassAllowEncodedSlashes是集。

AllowEncodedSlashes不是继承在Apache配置,所以这个指令必须放在虚拟主机定义。



这个页面有用吗?

请通过这个提交你对这个页面的反馈快速形成

或者,如果您不希望完成快速表单,您可以简单地指出,如果您觉得这个页面有帮助?


看到现有的反馈在这里