首页 > 解决方案 > Spring Boot swagger UI 在 nginx 代理后面不起作用

问题描述

我在作为 kubernetes pod 运行的 docker 容器中运行 spring boot 微服务。

在本地运行 spring boot 应用程序时,swagger UI 运行良好。

当部署到我们的 kubernetes 集群时,我们在它前面使用 nginx,它将请求代理到 pod。

我正在努力弄清楚如何让 swagger UI 与 nginx 一起工作。

到目前为止我尝试过的事情

在我的“ssl.conf”中,我尝试添加以下内容;

location ~ ^/(webjars.*) {
    rewrite ^/(.*)$ /$1 break;
    proxy_pass https://gw-test-request:443;
}
 location ~ ^/(gw.*) {
    rewrite ^/(.*)$ /swagger-ui.html break;
    proxy_pass https://$1:443;
}

请注意,第二个位置的前缀表示我们如何使用前缀 gw 命名微服务模块。

有了这个,它会在我输入 https:///gw-test 时尝试加载 swagger,然后默默地失败。当我观察到通过的网络请求时,它不会加载我在本地尝试时所做的一切。

我在本地工作时看到的网络调用;

在此处输入图像描述

我在 nginx 后面看到的网络调用;

在此处输入图像描述

任何帮助将不胜感激。

** 编辑 **

最后一个屏幕截图显示的 404s 原来是 200s,但它仍然没有加载 swagger UI。

** 编辑 **

正在使用的招摇配置;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

@Bean
public Docket api() {
ApiInfo apiInfo = new ApiInfo(
    "<>",
    "<>",
    "<>",
    "<>",
    new Contact("<>", "<>", "<>"),
    "N/A",
    "N/A",
    new ArrayList<>());

return new Docket(DocumentationType.SWAGGER_2)
    .select()
    .apis(RequestHandlerSelectors.basePackage("<rest controller base package>"))
    .paths(PathSelectors.any())
    .build()
    .apiInfo(apiInfo);
}
}

标签: spring-bootnginxswagger-ui

解决方案


这通常发生在您的 swagger 配置中的安全协议未配置为允许 https 时,默认协议仅允许 http 连接,因此您必须明确设置协议以包含 https

在您的招摇配置中,添加以下行

.protocols(newHashSet("http", "https"));

这应该可以解决您的问题。


推荐阅读