nginx代理tomcat导致css或js加载失败-国外便宜VPS

Web服务器经常会使用nginx作前置路由,在使用nginx配置Web服务器负载均衡、动静分离,会碰到设置反向代理后导致前端资源无法加载的问题

nginx反向代理的tomcat服务器导致前端资源css或js加载失败大概可以分为:端口丢失、真实ip或端口获取错误、js或者css太大加载失败等情形

端口丢失

之前笔者也有文章单独介绍,可参考%E8%BD%AC%E5%8F%91%E4%B8%A2%E5%A4%B1%E7%AB%AF%E5%8F%A3%E9%97%AE%E9%A2%98/

反向代理获取真实ip(域名)、端口、协议

nginx反向代理后,servlet应用通过request.getRemoteAddr()取到的IP是nginx的IP,并非客户端的真实IP;通过request.getRequestUrl()获取的ip(域名)、端口、协议都是nginx对应的参数。

比如nginx的配置:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 

http{

    upstreambackend{

        server127.0.0.1:8080;

        #server backend1.example.com wight=5;

        #server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;</p>

<p>        #server backup1.example.com backup;

    }</p>

<p>    server{

        listen80;

        server_name your.domain.com;</p>

<p>        location/test{

            proxy_pass http://backend/test;

        }

        &#8230;

    }

}

 

在浏览器打开访问servlet应用,获取客户端IP和URL:

1

2

3

 

log.info(&#8220;RemoteAddr:{}, URL:{}&#8221;, request.getRemoteAddr(), request.getRequestURL());

//输出结果

RemoteAddr:127.0.0.1,URL:http://127.0.0.1:8080/test

 

针对tomcat+nginx的解决方案:

nginx添加如下配置,:

1

2

3

4

 

proxy_set_header Host$http_host;

proxy_set_headerX-Real-IP$remote_addr;

proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;

proxy_set_headerX-Forwarded-Proto$scheme;

 

如果不知道如何添加,可参考nginx转发丢失端口的问题。添加完后,输出结果如下:

1

2

 

//输出结果

RemoteAddr:127.0.0.1,URL:http://浏览器的ip地址/test

 

发现RemoteAddr仍然获取不正确,解决方案如下:

方案一:通过request.getHeader(“X-Forwrad-For”)或request.getHeader(“X-Real-IP”)获取到nginx配置的Header。

方案二: 配置tomcat,通过Servlet API的request.getRemoteAddr()方法获取客户端的IP。Tomcat的server.xml,在Host元素内最后加入:

1

 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。