SonarQube-HAProxy HTTPs无效标头

SonarQube-HAProxy HTTPs无效标头,http,https,sonarqube,reverse-proxy,haproxy,Http,Https,Sonarqube,Reverse Proxy,Haproxy,我所有的开发系统都支持haproxy(一切都已对接),我可以访问Jenkins/Gitlab/和Sonar,但不能访问Nexus。在查看nexus容器的docker日志之后,我可以看到它正在获取请求,但是它说forward头无效。我的目标是让haproxy使用https,而haproxy背后的应用程序只使用http。通过这种方式,应用程序可以通过代理使用https,但不需要配置本身 以下是日志消息: nexus_1 | 2018-03-23 17:35:08,874-0500 WARN

我所有的开发系统都支持haproxy(一切都已对接),我可以访问Jenkins/Gitlab/和Sonar,但不能访问Nexus。在查看nexus容器的docker日志之后,我可以看到它正在获取请求,但是它说forward头无效。我的目标是让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'
与haproxy合作时,nexus是否有特殊要求

编辑:我已经确认,如果“docker compose exec haproxy sh”,我可以卷曲“nexus:8081”,它会给我index.html。因此,我知道容器可以正确地与nexus容器通信

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请求集头
完成的,因为这在操作上优于
req*
操作

但不管怎么说,这一行并没有明显的意义,因为您的前端使用
bind*:443 ssl
,所以
ssl_fc
在这个前端总是正确的。因此,前端可以简单地设置正确的标题

http-request set-header X-Forwarded-Proto https
在大多数情况下,这基本上是错误的。无论您在哪里使用它,您都可能需要更改它,因为您不想添加此标题--您想设置它。您需要您的版本来覆盖传入请求中可能存在的任何内容

http-request set-header X-Forwarded-Proto https if { ssl_fc }
添加标题将保留以前的值,包括您在此行中错误添加的值:

reqadd X-Forwarded-Proto:\http
您需要在
\
之后加一个空格,或者需要完全删除
\
。。。但实际上,这最好是通过
http请求集头
完成的,因为这在操作上优于
req*
操作

但不管怎么说,这一行并没有明显的意义,因为您的前端使用
bind*:443 ssl
,所以
ssl_fc
在这个前端总是正确的。因此,前端可以简单地设置正确的标题

http-request set-header X-Forwarded-Proto https

嗯,这解决了一些问题。但现在nexus不会初始化它;'s的主页。它被困在这种情况下最好的猜测是,服务器可能有自己的URL的内部概念,导致它返回HTML、JS等,这些引用使用的URL不是它应该使用的URL。检查浏览器的开发工具,例如网络选项卡和控制台窗口,以查看引擎盖下发生了什么。是的,我认为可能是在这些行下,我可能必须将HTTPS传递给nexus,然后将私钥和公钥提供给容器。在性能上会花费一点,但不会花费太多。谢谢,这解决了一些问题。但现在nexus不会初始化它;'s的主页。它被困在这种情况下最好的猜测是,服务器可能有自己的URL的内部概念,导致它返回HTML、JS等,这些引用使用的URL不是它应该使用的URL。检查浏览器的开发工具,例如网络选项卡和控制台窗口,以查看引擎盖下发生了什么。是的,我认为可能是在这些行下,我可能必须将HTTPS传递给nexus,然后将私钥和公钥提供给容器。在性能上会花费一点,但不会花费太多。谢谢你,伙计