SOAP Stinks. There. I said it. The designers were really not paying attention when designing the whole wsdl thing.
It has a nasty habit of exposing the back end server IP addresses and forgetting that it's supposed to be SSL.
I had lousy luck making Pound, HAProxy, UltraMonkey, and NGINX play nice as load balancers, but finally got Apache to work. Now that I got it, the others might work using the same techniques, NGINX is probably the closest to working.
Details: https://public.address.com/ebfUploader.asmx?wsdl or ?DISCO
returns the improper response: <soap:address location="http://10.100.111.40/ebfUploader.asmx"/>
because the server is unaware that the site is being proxied into SSL on another server.
Here's how I made it work:
- Use Apache 2.2 as the load balancer
- **MUST HAVE** valid certificate for the named site you are deploying to! Self signed certs do not work.
- If you visit your site (i.e.: https://public.address.com/ebfuploader.asmx?wsdl) in Internet Explorer, it
MUST NOT give any complaints about the certificate!
- The backend servers are normal http, and state server or cookie backed for session tracking
- The load balancer config must dynamically alter the text/html and replace the http private addresses with https public addresses:
Sample config for Apache:
apacheproxy:/etc/apache2/sites-available# cat lbtest-ssl
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
ProxyPass /balancer-manager !
<Proxy balancer://mycluster>
BalancerMember http://10.100.110.101:80/
BalancerMember http://10.100.110.102:80/
BalancerMember http://10.100.110.103:80/
BalancerMember http://10.100.110.104:80/
#Failed everything, give up, go to lastmanstanding server
BalancerMember http://10.100.110.168:8080/ status=+H
ProxySet lbmethod=bytraffic
Allow from all
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
AddOutputFilterByType SUBSTITUTE text/xml
Substitute "s|http://10.100.110.101|https://public.address.com|in"
Substitute "s|http://10.100.110.102|https://public.address.com|in"
Substitute "s|http://10.100.110.103|https://public.address.com|in"
Substitute "s|http://10.100.110.104|https://public.address.com|in"
SSLEngine on
SSLCertificateFile /etc/ssl/certs/star.address.com.pem
SSLCertificateKeyFile /etc/ssl/private/star.address.com.key
</VirtualHost>
</IfModule>