soap服务使用nginx做 负载均 衡注意事项
2018-07-02 本文已影响0人
夜月行者
介绍
在使用服务发布的时候,对soap服务进行配置的时候进行nginx进行代理的时候需要注意一些事项
这一部分是搭建完soap 服务后使用nginx进行负载均衡的时候遇到的一些问题。
1. server端发布url的时候应该使用哪个url
最开始我认为server端发布url的时候应该就是本机的ip,这样外部同样用这个ip访问。
刚开始是这样配置的
@Configuration
public class WebserviceConfig {
@Value("${wsdl.uri}")
String uri;
@Autowired
SearchSoapServerService mySoapServerTest;
@Bean
public Endpoint createEndPoint() {
return Endpoint.publish(uri, mySoapServerTest);
}
}
对应的 wsdl.uri的值是
wsdl.uri=http://192.168.1.15:8786/services/policeGkService
访问wsdl的时候也是
http://192.168.1.15:8786/services/policeGkService?wsdl
这个是我在测试环境的时候部署的方式,等我到生产希望部署集群的方式的时候就傻眼了,各个机器的ip是不一样的,怎么办呢,上网查了一下,才明白过来,这个地址实际上就是配置该服务可以接收哪些的ip访问,所以明显配置0.0.0.0
是更合适的方式。
更正后的uri配置
wsdl.uri=http://0.0.0.0:8786/services/policeGkService
2. wsdl中 service.port.address 的location元素的生成规则
通过测试发现 对应location的生成规则 和你访问 wsdl的时候使用的 http header中 host有关系
比如使用localhost
览器输入 http://localhost:8786/services/policeGkService?wsdl
对应的http head 中的 Host属性是
Host: localhost:8786
返回的wsdl对应的location是
<soap:address location="http://localhost:8786/services/policeGkService"/>
如果使用 127.0.0.1
浏览器输入 http://127.0.0.1:8786/services/policeGkService?wsdl
对应的 http head 中的 Host 属性是
Host: 127.0.0.1:8786
返回的wsdl对应的location是
<soap:address location="http://127.0.0.1:8786/services/policeGkService"/>
所以返回的location地址是和你请求的时候使用的ip是有关系的。
3. nginx中配置注意事项
那么nginx当中应该怎么配置呢
从2中得知,返回的location地址是和你请求的时候使用的ip是有关系的。
所以在nginx中进行反向代理的时候记得把 Host 修改 为nginx的 ip:port 即可。
具体配置对应
upstream monitor_soap_servers{
server 100.09.91.159:8786;
server 100.09.168.68:8786;
server 100.09.178.20:8786;
}
server {
listen 80;
server_name 100.09.129.131;
#### nginx_proxy session共享:
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
location / {
access_log /data/nginx/log/third_search.kkmh.com.log api;
# 这个地方的配置十分重要,必须这样配置才可以返回正确的wsdl文档
proxy_set_header Host $host:$server_port;
proxy_pass http://monitor_soap_servers/;
}
}
在这种配置情况下
访问 wsdl文档使用的路径是
http://100.09.129.131/services/policeGkService?wsdl
返回的location是nginx对应的地址,这样的话就真正实现了负载均衡
<service name="SearchSoapServerServiceService">
<port name="SearchSoapServerServicePort" binding="tns:SearchSoapServerServicePortBinding">
<soap:address location="http://100.09.129.131:80/services/policeGkService"/>
</port>
</service>