Dear HAProxy Developer community,

We are seeking your inputs in the following issue we are facing:

We would like to access Product1 via URL: https://coscend.com:14443/Product1/ , wherein 14443 is port forwarded by router to 443 inside the server.

Output URL from the Product1 server should be: https://coscend.com:14443/Product1/signin?xyz

Current set up is giving: http://coscend.com:<APPLICATION_PORT>/Product1/signin?xyz

(1) <APPLICATION_PORT> instead of 14443 (forwarded port).

(2) http, instead of https


@Aleks

Thank you for your insights. It helped make some progress, but are short of conquering the final frontier. Your guidance will be appreciated.


Setup you advised: Client -> haproxy -> Product1 app server (Tomcat), which is talking HTTP in its standard deployment (http://IP:port/appname) and has no custom rewriting or SSL or other proxy (Apache or nginx).

As the content is dynamic (real-time video), we are not using Varnish.

Logs and config deployed for HAProxy 1.5.14 (stable)

We are not getting any errors in the logs, as the right Web page is being displayed.


frontend webapps-frontend
    bind          *:80 name http
    bind          *:443 name https ssl crt /path/to/server.pem

    log           global
    option        forwardfor
    option        httplog clf

    reqadd X-Forwarded-Proto:\ https if { ssl_fc }
    reqadd X-Forwarded-Proto:\ http if !{ ssl_fc }

acl host_https req.hdr(Host) coscend.com:14443 # 14443 is due to port forwarding deployment
    acl path_subdomain_p1 path_beg -i /Product1

    use_backend subdomain_p1-backend if host_https path_subdomain_p1


backend subdomain_p1-backend
    http-request set-header Host <internal_IPxx.yy.zz.ww:APPLICATION_PORT>
    reqirep ^([^\ ]*)\ /Product1/*([^\ ]*)\ (.*)$       \1\ /Product1\2\ \3

    acl hdr_location res.hdr(Location) -m found
rspirep ^Location:\ (https?://)([^/]*)(:[0-9]+)(/.*)$ Location:\ \1coscend.com\3\4 if hdr_location

server Product1.VM0 <internal_IPxx.yy.zz.ww:APPLICATION_PORT> cookie c check


Output of haproxy -f … -db -V
Available polling systems :
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result FAILED
Total: 3 (2 usable), will use epoll.

Thank you.

Sincerely,

--
Susheel Jalali

Coscend Communications Solutions
Web site: www(DOT)Coscend(DOT)com
------------------------------------------------------------------
CONFIDENTIALITY NOTICE: See 'Confidentiality Notice Regarding E-mail Messages from Coscend Communications Solutions' posted at:
www(DOT)Coscend(DOT)com/Terms_and_Conditions.html


On 10/08/15 03:50, Aleksandar Lazic wrote:
Dear Susheel Jalali.

Am 07-10-2015 23:24, schrieb Susheel Jalali:
Dear Igor and Aleks,

Thank you for your insights.  Very useful to us, as we are implementing
HAProxy for the first time.  Below we have described how we have
implemented your advise and the result. Output of "haproxy -vv" is
given at end.

We have also provided the configuration file and relevant logs. We
would appreciate any insights to replace the internal IP address
occurring in server-response URL with the externally valid domain name
either by using the rewriting of Location and Host headers or the
complete URL, using %HP.

We would like to access Product1 via URL:
https://coscend.com:14443/Product1/
Output URL from the Product1 server should be:
https://coscend.com:14443/Product1/signin?xyz

what we are getting: http://Internal_IP:14443/Product1/signin?xyz

----------
Responses to your insights / questions

@ Aleks: Yes, Tomcat has a reverse proxy setting for our Product1. Can we
not have two reverse proxies to Product1?

Sorry I do not understand what you mean.

Have your read and understood the proxy-howto?

https://tomcat.apache.org/tomcat-8.0-doc/proxy-howto.html

I assume your setup is like this.

Client->haproxy->apache-mod_proxy_ajp->tomcat-X

Is this right?

Maybe you can omit apache-mod_proxy_ajp and talk http with tomcat.
Client->haproxy->tomcat-X HTTP Connector

In case that you want to deliver static content you should consider to use such a setup.

Client->haproxy->varnish->tomcat-X HTTP Connector
Client->haproxy->nginx+cache->tomcat-X HTTP Connector

Take care that you setup one of the *NIO* or *Apr* protocol handler
https://tomcat.apache.org/tomcat-8.0-doc/config/http.html


@Igor,

(1) As you rightly pointed out, we are getting http, not https

(2) As you advised, we moved these two lines from backend to frontend,
but did not find any change.

    acl hdr_location res.hdr(Location) -m found
    rspirep ^(Location:)\ (https?://([^/]*))/(.*)$    \1\
http://\3/Product1/\4 if hdr_location


Maybe you can offer (gist,download,...) some debug output from

haproxy -f ... ... -db -V'

(3) Configuration file

global
    log         127.0.0.1 local2
    log-tag     haproxy
    chroot      /var/haproxy/lib
    pidfile     /var/run/haproxy.pid
    user        haproxy
    group       haproxy
    nbproc      1
    maxconn     5000
    spread-checks 5
    daemon
    #debug
    stats socket  /var/haproxy/lib/stats

    ######
    #   SSL section
    ######
    maxsslconn     256
    tune.ssl.default-dh-param 4096
    ca-base /path/to/directory/of/server.pem


#---------------------------------------------------------------------
# Defaults
#---------------------------------------------------------------------
defaults
    mode        http
    log         global
    option      httplog
    option      forwardfor
    option      abortonclose
    option      http-server-close
    option      redispatch
    retries     3
    timeout queue           10s
    timeout client          50000ms
    timeout server          50000ms
    timeout connect         5000ms
    timeout http-keep-alive 10s
    timeout http-request    5s
    timeout check           10s
    maxconn                 50000

frontend webapps-frontend
    bind          *:80 name http
    bind          *:443 name https ssl crt /path/to/server.pem

How about to change to two frontends

###
frontend http-frontend
     bind          *:80 name http
     ... other frontend settings

frontend https-frontend
    bind          *:443 name https ssl crt /path/to/server.pem
    ... other frontend settings
###

Then you can setup the tomcat connector for https to

secure="true"

Please take a look at this howto.
https://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html

I prefer to setup the appserver to work as expected, when it's possible, and not to do some 'magic' with the rewrites on any proxy ;-)

[snipp]

===========================

Output of "haproxy -vv":

HA-Proxy version 1.5.14 2015/07/02
Copyright 2000-2015 Willy Tarreau <wi...@haproxy.org>

Build options :
  TARGET  = linux2628
  CPU     = native
  CC      = gcc
  CFLAGS  = -m64 -march=x86-64 -O2 -march=native -g -fno-strict-aliasing
  OPTIONS = USE_CTTPROXY=1 USE_LIBCRYPT=1 USE_CRYPT_H=1
USE_GETADDRINFO=1 USE_ZLIB=1 USE_REGPARM=1 USE_OPENSSL=1 USE_PCRE=1
USE_PCRE_JIT=1 USE_TFO=1

Default settings :
maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200

Encrypted password support via crypt(3): yes
Built with zlib version : 1.2.7
Compression algorithms supported : identity, deflate, gzip
Built with OpenSSL version : OpenSSL 1.0.1e-fips 11 Feb 2013
Running on OpenSSL version : OpenSSL 1.0.1e-fips 11 Feb 2013
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 8.32 2012-11-30
PCRE library supports JIT : yes
Built with transparent proxy support using: CTTPROXY IP_TRANSPARENT
IPV6_TRANSPARENT IP_FREEBIND

Available polling systems :
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 3 (3 usable), will use epoll.

Thanks.

[snipp]

BR Aleks



-----
No virus found in this message.
Checked by AVG - www.avg.com
Version: 2015.0.6140 / Virus Database: 4435/10778 - Release Date: 10/08/15



Reply via email to