Le 14/02/2017 à 22:20, Birdwell, Rob a écrit :
Thanks for the quick reply Cyril!
You’re correct on both counts; this is a test config & the large timeout will
definitely not be kept. For the http-server-close, that was a mistake on my part;
thank you for noticing that. I’ve tried the configuration both ways (as far as
http-send-name-header) & receive the same result. Happy to try any additional
suggestions you can provide. (BTW, I just tried removing the http-send-name-header
which gave the same results).
Are you really sure you're making the same request on the application
side (access logs should give you a hint) ?
What happens with a curl request on
/api/account/61447612/data/request.json?v=1 through haproxy ? (to
reproduce the ProxyPass directives in apache). Something like :
curl -i --header "Accept:application/json" --header
"Content-Type:application/json" --header "Authorization:<appname>
appKey=<key>" -X POST
https://<frontend_url>/api/account/61447612/data/request.json?v=1
--verbose --data "{\"data\": { \"data\": \"data\", \"maxWaitTime\":
60000 } }" --cacert /etc/haproxy/ssl/<frontend>.pem
On 2/14/17, 1:58 PM, "Cyril Bonté" <[email protected]> wrote:
Hi Rob,
Le 14/02/2017 à 20:23, Birdwell, Rob a écrit :
> Hello,
>
> I was curious if someone would be able to assist with return codes from
HAProxy. Currently, we are able to receive a 201 for a reverse proxy solution from
Apache HTTP, but when utilzing HAProxy, only a 200 is received utilizing an identical
cURL command. The current HAProxy/Apache HTTP & cURL outputs I have are below:
>
> HAProxy configuration:
>
> global
>
> log 127.0.0.1 local2 debug
>
> chroot /var/lib/haproxy
> pidfile /var/run/haproxy.pid
> maxconn 100000
> group root
> daemon
> tune.ssl.default-dh-param 2048
>
> stats socket /var/lib/haproxy/stats
>
>
> defaults
> mode http
> log global
> option httplog
> option log-separate-errors
> option dontlognull
> option http-keep-alive
> option dontlog-normal
> option http-server-close
Not related to your issue but you have to make a choice : use
"http-server-close" or "http-keep-alive", but not both.
> option redispatch
> option contstats
> option forwardfor
> timeout http-request 45s
> timeout queue 45s
> timeout connect 45s
> timeout client 45s
> timeout server 45s
> timeout http-keep-alive 45s
> timeout check 45s
Those timeouts should be better tuned.
> http-send-name-header host
Here, there's something that can be related to what you observe.
Are you really sure you want to set a "Host" header on the request
between haproxy and your backend server ? Note that it also appears in
www-backend below.
> maxconn 50000
>
> listen globalstats
> mode http
> bind *:1936
> stats enable
> stats show-desc HAProxy for <frontend_url>
> stats uri /stats
> stats show-legends
> stats show-node
> stats refresh 5s
>
> frontend www-http
> bind *:80
> reqadd X-Forwarded-Proto:\ http
> default_backend www-backend
>
> frontend www-frontend
> bind *:443 ssl crt /etc/haproxy/ssl/<frontend>.pem
> mode http
> reqadd X-Forwarded-Proto:\ https
> default_backend www-backend
>
> backend www-backend
> redirect scheme https if !{ ssl_fc }
> http-send-name-header host
Same observation here, I'd recommend to make some tests without those
"http-send-name-header host".
> server lp <backend app>:80 check
>
> Apache config:
>
> NameVirtualHost *:80
> <VirtualHost *:80>
> ServerName <frontend_url>
>
> Redirect / https://<backend_app>/api/account/61447612/
>
>
> </VirtualHost>
>
> NameVirtualHost *:443
> <VirtualHost *:443>
> ServerName <frontend_url>
> LogLevel debug
> CustomLog /etc/httpd/logs/ssl_access_log frontoffice
> ErrorLog /etc/httpd/logs/ssl_access_log
>
> LimitRequestLine 1000000
> LimitRequestFieldSize 1000000
>
> SSLEngine On
> SSLProxyEngine On
>
> SSLProxyCheckPeerCN off
> SSLProxyCheckPeerExpire off
>
> AllowEncodedSlashes On
> ProxyPreserveHost On
>
>
> SSLCertificateFile /etc/httpd/ssl/<frontend_url>.pem
> SSLCertificateChainFile /etc/httpd/ssl/<frontend_url>.pem
>
> RewriteEngine On
>
> ProxyPass /
https://<backend_app>/api/account/61447612/ retry=2 acquire=3000 timeout=600
Keepalive=On
> ProxyPassReverse https://<frontend_url>/
https://<backend_app>/api/account/61447612/
> ProxyPassReverseCookiePath https://<backend_app>/api/account/61447612/
https://<frontend_url>/
>
> </VirtualHost>
>
>
>
>
> Curl command is as follows:
>
> curl -i --header "Accept:application/json" --header "Content-Type:application/json" --header "Authorization:<appname> appKey=<key>" -X
POST https://<frontend_url>/data/request.json?v=1 --verbose --data "{\"data\": { \"data\": \"data\", \"maxWaitTime\": 60000 } }"
--cacert /etc/haproxy/ssl/<frontend>.pem
>
>
>
> Curl output from HAProxy:
>
>
> …
>
>> POST /data/request.json?v=1 HTTP/1.1
>> Host: <frontend_app>
>> User-Agent: curl/7.47.1
>> Accept:application/json
>> Content-Type:application/json
>> Authorization:<appname> appKey=<key>
>> Content-Length: 65
>>
> * upload completely sent off: 65 out of 65 bytes
> < HTTP/1.1 200 OK
> < Server: WS
> < P3P: CP="NON BUS INT NAV COM ADM CON CUR IVA IVD OTP PSA PSD TEL SAM"
> < Date: Tue, 14 Feb 2017 07:49:09 GMT
> < Content-Length: 0
No "Location" header in the response, compared to what a direct request
to the backend server sends. I guess this is not the attended behaviour.
>
>
> Curl output from Apache HTTP:
>
>> POST /data/request.json?v=1 HTTP/1.1
>> Host: <frontend_app>
>> User-Agent: curl/7.47.1
>> Accept:application/json
>> Content-Type:application/json
>> Authorization:LivePerson appKey=<key>
>> Content-Length: 65
>>
> * upload completely sent off: 65 out of 65 bytes
> < HTTP/1.1 201 Created
> < Date: Tue, 14 Feb 2017 19:15:23 GMT
> < Server: WS
> < Content-Length: 0
> < Content-Type: application/json
> < Location: https://<fronend_app>/api/<data>/<data>/data/<key>
> < P3P: CP="NON BUS INT NAV COM ADM CON CUR IVA IVD OTP PSA PSD TEL SAM"
> < Connection: close
>
> Perhaps I need to configure HAProxy differently? I have searched the
forums and the web, but do not believe I specifically understand what is required
in order to receive this code from the remote system as I do from Apache HTTP. Is
this because HAProxy is configured only to return a 200 for any successful
connection? Please advise and thank you very much for a wonderful product!
No, haproxy will send the same status code as the backend.
>
> Rob
> 970.344.5170
>
--
Cyril Bonté
--
Cyril Bonté