缘由

因为入职新单位,想要将之前写的接口测试服务布到云环境上,需要配置 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


↙↙↙阅读原文可查看相关链接,并与作者交流