前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot如何集成Nginx配置代理

Spring Boot如何集成Nginx配置代理

作者头像
我是攻城师
发布2019-06-03 09:15:43
2.6K0
发布2019-06-03 09:15:43
举报
文章被收录于专栏:我是攻城师

配置Nginx统一代理web容器如tomcat,jetty的请求,在日常开发中很常见,那么在配置集成的时候应该注意些什么呢?

下面我们将通过一个例子介绍如何和Nginx配置:

首先,我们先看下一个spring boot项目的结构:

代码语言:javascript
复制
demo   src       main           assemble                 package.xml           filters                 dev.properties                 test.properties                 pro.properties           java              dao              service              controller           resources              static                    js                    css                    img              templates                    index.vm                    error.vm              application.properties              logback.xml
       test          target   logs   pom.xml   README.md

注意上面的是传统的spring boot的标准web格式,这里面包含了前端的页面也在这个项目里面,不是所谓的大前端的严格的前后端分离模式。如果集成了配置管理中心比如携程的阿波罗就可以再精简一点,这个不再细说,感兴趣的朋友可自行去研究一下。

在spring boot里面,默认的静态的资源文件是放在resources目录下一个static的目录下,如果现在在static目录有一个xxx.css文件,那么可以直接使用下面的方式进行访问:

代码语言:javascript
复制
http://localhost:8888/xxx.css

同理js,img,各种静态资源都一样。上面的方式是比较直接,但比较乱,因为在端口号后面的没有再分区路径。

现在看下我们的controller类:

代码语言:javascript
复制
@Controller@RequestMapping("/c1")public class DemoController {
    @RequestMapping("/m1")    public String m1(Map<String, Object> model, HttpServletResponse response, HttpServletRequest request) {        return "index";//返回到templates下面的index.vm模板    }
    @RequestMapping("/m2")    public String m2(Map<String, Object> model, HttpServletResponse response, HttpServletRequest request) {        return "error";//返回到templates下面的error.vm模板    }
}

在运维层面,一般只会为一个微服务项目配置一个域名映射,所以为了方便nginx统一代理映射,我们需要一个一级路径来做nginx的代理转发路径,故在上面的DemoController类里面,在类的注解上加上了一级路径,你也可以在方法级别添加比如直接写

代码语言:javascript
复制
/c1/m1/c1/m2

效果是一样的。

下面我们看下nginx的配置:

代码语言:javascript
复制
  location ^~ /c1/ {    access_log  /data/logs/nginx/c1.log  main;    proxy_set_header   X-Real-IP        $remote_addr;    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;    proxy_set_header Host $host;    proxy_pass http://c1;  }
upstream question-recognition { server 192.168.10.125:8888 max_fails=3;}

在上面的nginx配置中,我们配置了c1作为demo项目访问的一级路径,也就是说任何访问请求,都必须在c1的路径下,否则就可能出现问题,比如此时我访问:

代码语言:javascript
复制
http://192.168.10.125:8888/c1/m1

那么将会转发到index.vm页面,但此时注意,如果index.vm页面里面如下引用了xxx.js文件,那么将会失效:

代码语言:javascript
复制
<script src="xxx.js" > </script>

上面的js文件,在html页面在浏览器加载的时候,会发送请求:

代码语言:javascript
复制
http://192.168.10.125:8888/xxx.js

注意了,如果没有配置nginx代理这一层,上面的这个请求是没问题的,但配置了nginx拦截,必须只能是c1路径下的请求才会放行,所以我们需要在static目录下同样新建一个c1目录,然后把xxx.js文件拷贝到该目录下即可,如下:

代码语言:javascript
复制
static    c1      xxx.js

然后在velocity的模板文件里面,引入js路径改为:

代码语言:javascript
复制
<script src="/c1/xxx.js" > </script>

上面的js文件,在html加载的时候,会发送请求:

代码语言:javascript
复制
http://192.168.10.125:8888/c1/xxx.js

由于其一级路径是c1,所以通过了nginx的拦截,整个页面就加载正常,这样以来与Nginx的集成就算成功了,这一点也是要在开发中注意的,通过了细化路径,也方便了访问权限的拦截控制。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档