下面的配置主要解决两个问题:
- 通过请求的不同域名分发到不同的服务
- 在后台服务中获取真实的远程ip
nginx配置
server {
listen 80;
proxy_set_header X-Real-IP $remote_addr; #记录远程访问ip,方便应用中获取
server_name m.baidu.com;
location / {
proxy_pass http://127.0.0.1:81; #将域名为m.baidu.com的请求分发到本地81端口的服务
}
}
server {
listen 80;
proxy_set_header X-Real-IP $remote_addr; #记录远程访问ip,方便应用中获取
server_name admin.baidu.com; #将域名为m.baidu.com的请求分发到本地86端口的服务
location / {
proxy_pass http://127.0.0.1:86;
}
}
由于前置了nginx作为代理,在后台应用服务中直接采用request.getRemoteAddr()
,无法获取到请求所处的真实ip,需要通过下面的代码获取:
private String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("x-forwarded-for");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
亲测可用,手动微笑?