通用技术 [nginx][spring boot] 云环境布署 spring boot 应用踩坑小记

bauul · November 06, 2019 · Last by bauul replied at November 07, 2019 · 498 hits

缘由

因为入职新单位,想要将之前写的接口测试服务布到云环境上,需要配置nginx代理,
在此之前测试环境已有一个应用布在了云环境,所以运维同学建议用路径区分,
但是本人没什么nginx使用经验,于是一路踩坑

前置条件

应用:spring boot 2.0 + spring security + thmyleaf,后端渲染的
启动方式:java -jar xx.jar
代码服务平台:gitlab

坑一:nginx配置 与 spring boot配置

原想法是一个端口后面,布多个应用的方式,就是说使用子域名的方式,就是说配置多个server模块
但是怎么改nginx配置也没达到效果,最后采用的是子路径的方式,就是配置多个location模块

location ^~ /apitest/ {
#proxy_redirect off;
proxy_set_header Host 192.168.2.47:9980; # $host;不能使用$host变量
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.2.47:9980/apitest/;
}

这里要注意proxy_pass要写正确的路径,比如这里需要加上 /apitest,开始时写成http://192.168.2.47:9980/,就没能达到转发的效果

因为要在应用的每个请求上都加上/apitest,这里需要修改spring 配置

server.servlet.context-path=/apitest

配置后,所有的接口请求前面都会加上apitest了,结合nginx配置,接口请求转发就OK了

坑二:前端资源文件路径不包含apitest,导致404

前面一步配置完成后,解决了入口页面的问题,但是resource下面的jquery, bootstrap等静态资源文件在浏览器web页面中访问时,是不带apitest目录的,全部404
修改方法,就是所有资源文件使用相对路径:

<link th:href="@{/bootstrap/dist/css/bootstrap.min.css}" rel="stylesheet">

在发ajax请求时,拼的地址前面需要加上apitest

坑三:推代码到gitlab时,某些静态资源目录被滤掉了,比如dist目录

这算个意外坑,解决前面的坑时,发现一些build目录,gist目录被滤掉了,直接打个压缩包,在目录机器上解压一下,这个几乎没什么改动,暂时先这么解决

坑四:可以正常打开web页面后,登录时发生了响应码:302 的错误,导致未能跳转至登录成功的页面

这里因为使用的是spring security,查了一下,解决方法,就是修改WebSecurityConfig配置

protected void configure(HttpSecurity http) throws Exception {

http.csrf().disable();

http
.authorizeRequests()
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
.antMatchers("/apitest/autotestserver/data/*", "/apitest/autotestserver/task/taskId/*", "/**/*.map", "/**/*.css", "/**/*.js").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("http://qa.全路径.com/apitest/login")
.loginProcessingUrl("/login")
.successForwardUrl("/")
.failureUrl("/login?error")
.permitAll()
.and()
.rememberMe().alwaysRemember(true)
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("http://qa.全路径.com/apitest/login");
}

至此,该应用就可以正常布署成功,可以正常访问,可正常增删改查了

思考:

  1. 如何使用nginx多个server的方式来布署成功?

参考:

spring security配置:https://www.jianshu.com/p/62a0a9a78530
nginx配置:https://www.cnblogs.com/richard1015/p/9487129.html

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞
Author only
花开 回复

这个我也没见过,就是知道这么个功能,目前可以实现我的要求,更多的等以后碰到了再说☺

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up