tomcat知道haproxy是一个代理服务器吗?

tomcat知道haproxy是一个代理服务器吗?,tomcat,https,proxy,haproxy,Tomcat,Https,Proxy,Haproxy,关于HAProxy(1.5.2)和Tomcat(7.0.54),我有几个问题。我俩都是新来的 在Tomcat中,我有一个应用程序在登录时(https://my.tomcat.host:8080/access)将用户重定向(通过303代码)到另一个网页(http://my.tomcat.host:8080/access/sessionId=1234567). 设置HAProxy我将前端引擎(我的前端https)设置为接收https请求,并将它们发送到后端(我的后端https),然后后端将其作为ht

关于HAProxy(1.5.2)和Tomcat(7.0.54),我有几个问题。我俩都是新来的

在Tomcat中,我有一个应用程序在登录时(https://my.tomcat.host:8080/access)将用户重定向(通过303代码)到另一个网页(http://my.tomcat.host:8080/access/sessionId=1234567). 设置HAProxy我将前端引擎(我的前端https)设置为接收https请求,并将它们发送到后端(我的后端https),然后后端将其作为http请求发送到tomcat服务器

这是haproxy.cfg(用于my.haproxy.host)的外观:

frontend my-frontend-https
   bind *:8443 ssl crt /my/certs/server.pem
   mode http
   option httplog
   default_backend my-backend-https

backend my-backend-https
  balance roundrobin
  mode http
  option httplog
  option forwardfor
  server my-tomcat-srv my.tomcat.host:8080 check
在发送以下查询时(https://my.haproxy.host:8443/access)我发现从tomcat返回的位置标志的形式如下:http://my.haproxy.host:80/access/sessionId=1234567. 查看tomcat服务器,我发现我必须在server.xml中启用RemoteIPValve类,并将httpsServerPort设置为8443(作为protocolHeaderHttpsValue-可能不需要这样做,因为这是默认设置)。这似乎可行,我将向后端添加更多服务器

看起来不错,但我有几个问题:

  • 我注意到,当前端引擎是http而不是https时,问题似乎并不存在。也就是说,位置字段返回到我期望的状态。有什么不一致的地方吗
  • 如果没有server.xml文件中的设置,tomcat似乎知道我在web浏览器和tomcat之间使用代理。它是怎么知道的?是否有一个指令被传递给tomcat,告诉它是一个代理,或者它比这个更简单
  • 如果我希望在同一个haproxy.cfg文件中有另一个前端/后端引擎指向同一个tomcat实例(也就是说,上面提到的是跨多个服务器的负载平衡,包括这台服务器,我只希望这台服务器有一个入口点),可以这样做吗? i、 e.haproxy中有以下几行。 前端my-frontend-https1 绑定*:9443 ssl crt/my/certs/server.pem 模式http 选项httplog 默认_后端my-backend-https1

    后端my-backend-https1 平衡循环赛 模式http 选项httplog 选择转发 服务器my tomcat srv my.tomcat.host:8080检查

    位置字段是否返回为,因为这是在server.xml中定义的。谢谢


  • 哈罗德。

    这不是Tomcat特有的,但除非haproxy告诉你,否则你的Tomcat后端不会知道haproxy是前端

    如果您正在运行nginx,以下是直接从我的配置:

    proxy_set_header X-Forwarded-Proto https; # Obviously, differentiate based on whether you're serving an HTTP or HTTPS endpoint.
    proxy_set_header Host $host; # Or hardcode a value.
    proxy_set_header X-Real-IP  $remote_addr; # Alternative to X-Forwarded-For.
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    虽然我还没有为haproxy做过这件事,但正如我将nginx放在haproxy前面所说的那样,您将需要做如下操作:

    # defaults section
    option forwardfor
    
    # frontend definition
    frontend www-http
       bind haproxy_www_public_IP:80
       reqadd X-Forwarded-Proto:\ http
       default_backend www-backend
    
    frontend www-https
       bind haproxy_www_public_IP:443 ssl crt /etc/ssl/private/example.com.pem
       reqadd X-Forwarded-Proto:\ https
       default_backend www-backend
    
    # backend definition
    backend www-backend
       redirect scheme https if !{ ssl_fc }
       server www-1 www_1_private_IP:80 check
       server www-2 www_2_private_IP:80 check
    
    这是假设Tomcat将引用标准ish字段
    X-Forwarded-Proto
    X-Forwarded-For