我的所有开发系统都支持haproxy(一切都是dockerized),我可以访问我的Jenkins / Gitlab /和Sonar,但不能访问Nexus。在查看nexus容器的docker日志之后,我可以看到它正在获取请求,但是它说前向标头无效。我的目标是让haproxy使用https,而haproxy背后的应用只使用http。这样,应用程序可以通过代理进行https,但不需要自己配置。
以下是日志消息:
nexus_1 | 2018-03-23 17:35:08,874-0500 WARN [qtp1790585161-43] *SYSTEM
org.sonatype.nexus.internal.web.HeaderPatternFilter - rejecting request
from 98.192.146.97 due to invalid header 'X-Forwarded-Proto: \http'
这是我对nexus的haproxy配置:
frontend www-https
bind *:443 ssl crt /etc/haproxy/certs/server.pem
reqadd X-Forwarded-Proto:\http
acl jenkins hdr_beg(host) -i jenkins.
acl nexus hdr_beg(host) -i nexus.
acl git hdr_beg(host) -i git.
acl sonar hdr_beg(host) -i sonar.
use_backend jenkins if jenkins
use_backend nexus if nexus
use_backend git if git
use_backend sonar if sonar
backend nexus
mode http
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
server nexus1 nexus:8081 check
我最初的这条线存在于我的所有其他应用中:
http-request add-header X-Forwarded-Proto https if { ssl_fc }
但是当启用时Sonar会抛出此错误:
nexus_1 | 2018-03-23 23:54:38,132-0500 WARN [qtp1790585161-43]
*SYSTEM org.sonatype.nexus.internal.web.HeaderPatternFilter - rejecting
request from 98.192.146.97 due to invalid header 'X-Forwarded-Proto:
\http,https'
是否有一些特殊的nexus需要与haproxy一起使用?
编辑:我已经确认,如果" docker-compose exec haproxy sh"我可以卷曲" nexus:8081"它给了我index.html。所以我知道容器可以正确地与nexus容器通信。
答案 0 :(得分:2)
http-request add-header X-Forwarded-Proto https if { ssl_fc }
在大多数情况下,这基本上是错误的。无论您在何处使用它,都可能需要更改它,因为您不想添加此标题 - 您希望设置它。您需要使用您的版本来覆盖传入请求中可能存在的任何内容。
http-request set-header X-Forwarded-Proto https if { ssl_fc }
添加标题会保留以前的值,包括您在此行中错误添加的值:
reqadd X-Forwarded-Proto:\http
您需要在\
之后需要一个空格,或者您需要完全删除\
...但实际上,最好使用http-request set-header
完成此操作,因为这在操作上优先于req*
行动。
但是,无论如何,拥有那条线并没有明显的意义,因为你的前端使用bind *:443 ssl
,所以ssl_fc
在这个前端总是如此。因此,您的前端可以简单地设置正确的标题。
http-request set-header X-Forwarded-Proto https