因为入职新单位,想要将之前写的接口测试服务布到云环境上,需要配置 nginx 代理,
在此之前测试环境已有一个应用布在了云环境,所以运维同学建议用路径区分,
但是本人没什么 nginx 使用经验,于是一路踩坑
应用:spring boot 2.0 + spring security + thmyleaf,后端渲染的
启动方式:java -jar xx.jar
代码服务平台:gitlab
原想法是一个端口后面,布多个应用的方式,就是说使用子域名的方式,就是说配置多个 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 了
前面一步配置完成后,解决了入口页面的问题,但是 resource 下面的 jquery, bootstrap 等静态资源文件在浏览器 web 页面中访问时,是不带 apitest 目录的,全部 404
修改方法,就是所有资源文件使用相对路径:
<link th:href="@{/bootstrap/dist/css/bootstrap.min.css}" rel="stylesheet">
在发 ajax 请求时,拼的地址前面需要加上 apitest
这算个意外坑,解决前面的坑时,发现一些 build 目录,gist 目录被滤掉了,直接打个压缩包,在目录机器上解压一下,这个几乎没什么改动,暂时先这么解决
这里因为使用的是 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");
}
至此,该应用就可以正常布署成功,可以正常访问,可正常增删改查了
spring security 配置:https://www.jianshu.com/p/62a0a9a78530
nginx 配置:https://www.cnblogs.com/richard1015/p/9487129.html