问题描述

在Azure上创建的数据库,单独通过SQL的连接工具是可以访问,但在Web App却无法访问,错误信息为:

{
"timestamp": "2021-05-20T05:21:04.672+0000",
"status": 500,
"error": "Internal Server Error",
"message": "nested exception is org.apache.ibatis.exceptions.PersistenceException: \n### Error querying database.
Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection;
nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 0, maxActive 100, creating 0\n
### The error may exist in com/digital/dao/SumOrderMapper.java (best guess)\n
### The error may involve com.digital.dao.SumOrderMapper.selectOne\n
### The error occurred while executing a query\n
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection;
nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 0, maxActive 100, creating 0",
"path": "/ba/getGapAndOffset"
}

问题分析&解决

一:分析从Web App到数据库的网络是否相通:使用 PsPing & PaPing 进行 TCP 端口连通性测试

PsPing 是微软 PSTools 工具套件中的其中一个命令。除了ICMP ping 测试,它主要用来测试 TCP 端口的连通性,还可以测试 TCP/UDP 网络时延和带宽。下载地址为:https://technet.microsoft.com/zh-cn/sysinternals/jj729731.aspx

PsPing 进行 TCP 连接测试时所支持的参数说明:

-t 类似于 ICMP 的长 ping 测试,直到按下 Ctrl+C 停止测试,并显示统计结果;
-n 指定测试次数。还可以指定测试的时间长度,以秒为单位,使用时在数字后加上 s,例如“10s”;
-i 每次测试的间隔,默认为 1 秒。还可以指定为 0 来进行快速 ping 测试;
-w 热身次数,默认为 1 次;
-q 测试过程中不输出结果,结束后显示统计结果;
-h 将时延结果统计为直方图打印(默认打印 20行),也可以指定结果行数,比如 -h 10,指定 10 行;另一种使用方法是统计自定义时延,比如 -h "65,70",结果将统计时延分别为 65 和 70 毫秒的次数;
-4 强制使用 IPv4;
-6 强制使用 IPv6;

如果在 Linux 中发起 TCP 端口连通性和网路时延的测试,可以使用 PaPing 。PaPing 是一个跨平台的开源工具。它的功能相对 PsPing 而言更简单,只支持 TCP 端口的相关测试,不支持 UDP 端口的测试。下载地址为:https://code.google.com/archive/p/paping/downloads

安装方式(Linux):

#cd ~
#wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/paping/paping_1.5.5_x86-64_linux.tar.gz
#tar zxvf paping_1.5.5_x86-64_linux.tar.gz

测试结果, 在App Service(Web App)上去paping数据库可以连通的,由此可见网络层面应该是可以通的。

二:在网络层是连通的情况下,进一步就需要查看应用的异常信息

在App Service(Web App)的应用日志中,发现了 “ ssl connection is required ” 的错误消息,这是因为数据库(PostgreSQL) 配置SSL的连接要求,而应用程序时运行在Linux环境Docker中,也是需要开启SSL的。而在Linux中为容器开启SSL,需要以下几步:

注:SSH 实现容器和客户端之间的安全通信。 为了使自定义容器支持 SSH,必须将其添加到 Docker 映像本身。

第一步:将 sshd_config 文件添加到项目文件中,示例内容如下
Port            2222
ListenAddress 0.0.0.0
LoginGraceTime 180
X11Forwarding yes
Ciphers aes128-cbc,3des-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr
MACs hmac-sha1,hmac-sha1-96
StrictModes yes
SyslogFacility DAEMON
PasswordAuthentication yes
PermitEmptyPasswords no
PermitRootLogin yes
Subsystem sftp internal-sftp

此文件配置 OpenSSH 并且必须包括以下项:

  • Port 必须设置为 2222。
  • Ciphers 必须至少包含此列表中的一项:aes128-cbc,3des-cbc,aes256-cbc
  • MACs 必须至少包含此列表中的一项:hmac-sha1,hmac-sha1-96
 
第二步:在 Dockerfile 中,添加以下命令
# Install OpenSSH and set the password for root to "Docker!". In this example, "apk add" is the install instruction for an Alpine Linux-based image.
RUN apk add openssh \
&& echo "root:Docker!" | chpasswd # Copy the sshd_config file to the /etc/ssh/ directory
COPY sshd_config /etc/ssh/ # Open port 2222 for SSH access
EXPOSE 80 2222

此配置不允许从外部建立到容器的连接。 容器的端口 2222 只能在专用虚拟网络的桥网络中访问,Internet 上的攻击者无法访问该端口。

 
第三步:在容器的启动脚本中启动 SSH 服务器

/usr/sbin/sshd

三:App Service(Web App)如何能够解析内网中资源的Endpoint呢?

由于在App Service(Web App)中无法解析Redis的Private Endpoint IP,所以无法连接Redis,由于Redis在开启Private Endpoint时也有创建Azure Private DNS Zone,所以需要在App Service配置使用Azure Private DNS Zone用于解析Redis Private E你的point。

在App Service的配置中添加两项应用程序设置:

WEBSITE_DNS_SERVER= 168.63.129.16 #Azure Private DNS Server IP Address

WEBSITE_VNET_ROUTE_ALL=1 

这些设置会将所有出站调用从应用发送到 VNet,还允许应用访问 Azure DNS 专用区域。配置使用Azure Private DNS Zone的官方文档:https://docs.azure.cn/zh-cn/app-service/web-sites-integrate-with-vnet#azure-dns-private-zones

 

参考资料

配置使用Azure Private DNS Zone: https://docs.azure.cn/zh-cn/app-service/web-sites-integrate-with-vnet#azure-dns-private-zones

App service启用应用程序日志: https://docs.microsoft.com/zh-cn/azure/app-service/troubleshoot-diagnostic-logs#enable-application-logging-linuxcontainer

PostgreSQL配置ssl: https://docs.azure.cn/zh-cn/postgresql/concepts-ssl-connection-security

Paping测试连通性: https://docs.azure.cn/zh-cn/articles/azure-operations-guide/virtual-network/aog-virtual-network-tcp-psping-paping-connectivity#%E4%B8%8B%E8%BD%BD%E5%92%8C%E5%AE%89%E8%A3%85-1

【完】

【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)的更多相关文章

  1. 【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)

    问题描述 如何在一个AppService下同时部署运行多个Java 应用程序呢? 问题解答 因为App Service的默认根目录为 wwwroot.如果需要运行多个Java 应用程序,需要在 www ...

  2. 【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法

    问题描述 在App Service for Windows的环境中,当前只提供了PHP 7.4 版本的选择情况下,如何实现自定义PHP Runtime的版本呢? 如 PHP Version 8.1.9 ...

  3. 使用 Visual Studio 2017 部署 Azure 应用服务的 Web 应用

    本快速入门介绍了如何使用 Visual Studio 2017 创建并部署 Azure Web 应用.在本教程中完成的所有操作均符合1元试用条件. 本快速入门介绍了如何使用 Visual Studio ...

  4. Azure Web App (一)发布你的Net Core Web 项目

    一,引言 今天我们看一下Azure上的一个服务-----Web 应用,我们都知道云计算的三大模式:Iaas(基础设施即服务),Paas(平台即服务),Saas(软件即服务). Iass,其实就是虚拟主 ...

  5. Azure 部署 Asp.NET Core Web App

    在云计算大行其道的时代,当你在部署一个网站时,第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core 的网站呢?Azure 的 Web A ...

  6. 一键将Web应用发布到云-Azure Web App

    我们现在越来越多的传统应用,逐步向云端迁移,原先私有云的部署模式,逐步向云端PaaS IaaS转变.例如: 我们在云端Azure中申请VM虚拟机,将我们的Web应用部署到VM的IIS中,同时做云服务的 ...

  7. 在 Azure 上部署 Asp.NET Core Web App

    在云计算大行其道的时代,当你要部署一个网站时第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core的网站呢?Azure 的 Web App ...

  8. 远程调试 Azure Web App

    当我们将 Web App 部署在 Azure 上时,如果能够实现远程调试,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.易用著称,当然可以实现基于 Azure 应 ...

  9. VS 远程调试 Azure Web App

    如果能够远程调试部署在 Azure 上的 Web App,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.好用著称,当然可以通吃基于 Azure 应用的创建.发布和 ...

  10. 聊聊Web App、Hybrid App与Native App的设计差异

    目前主流应用程序大体分为三类:Web App.Hybrid App. Native App. 一.Web App.Hybrid App.Native App 纵向对比 首先,我们来看看什么是 Web ...

随机推荐

  1. css3只需一招,将网站变成灰色的

    今天大家在浏览B站,腾讯视频,等网站时,有没有发现一个现象,网站变成灰色的了. 是不是跟平常不一样了呢,这是因为今天(2020.4.4)是全国哀悼日, 所以网站这些就变成灰色的呢. 我去看了一下腾讯的 ...

  2. Python 潮流周刊第 19 期摘要

    原文全文:https://pythoncat.top/posts/2023-09-09-weekly 文章&教程 1.Mojo 终于提供下载了! 2.我们能从 PEP-703 中学到什么? 3 ...

  3. docker 推送镜像到harbor

    服务器A的镜像要推送到已安装harbor的服务器B 1.修改服务器A的/etc/docker/daemon.json文件 其中,http://211.131.241.221:8888为你要推送的服务器 ...

  4. PicoPixel贴图查看器

    Pico Pixel Pico Pixel是一款纹理查看器,支持查看以下文件格式:TGA,BMP,JPG,DDS,PNG,OpenEXR, KTX, HDR, GIF, TIF. 此外,Pico Pi ...

  5. 使用三方jar中的@RestControllerAdvice不起作用

    背景 公司封装了自己的基础核心包core-base,里边包含了Validation的异常捕获处理类:同时开发项目有全局异常捕获处理类,经测试发现,core-base里边的不起作用 可能原因: 未扫描外 ...

  6. vue 动态路由刷新页面404

    1.如果你的静态路由最后有如下代码: // 404 page must be placed at the end !!! { path: "*", redirect: " ...

  7. 个人找工作面试准备------以及别人面试心得{待更新中ing}

    参考链接先放: https://blog.csdn.net/u014400934/article/details/102577804?utm_medium=distribute.pc_relevant ...

  8. C# WinForm线程里操作控件

    做winform程序,避免不了的要在线程里控制窗体上的控件,直接在子线程里操作控件会报错"线程间操作无效,从不是创建控件***的线程访问它". 解决方法: private void ...

  9. 疾速7600MT/s!KELVV科赋CRAS V RGB DDR5内存图赏

    12月18日消息,KLEVV科赋日前推出新款大容量DDR5内存套装,满足游戏玩家.内容创作者和高端PC爱好者的需求. 现在,KLEVV科赋CRAS V RGB内存套装已经来到我们评测室,下面为大家带来 ...

  10. 理论与实战:一篇看懂Python词云

    理论与实战:一篇看懂Python词云 后宫王镇贴 前言:本文初编辑于2024年2月2日 该项目代码的仓库地址:https://github.com/A-Piece-Of-Maple/WordCloud ...