【App Service】在Azure环境中如何查看App Service实例当前的网络连接情况呢作为一名经常与Azure打交道的开发者你可能遇到过这样的场景应用突然变慢、API请求超时、或者数据库连接失败这时你第一个想到的就是——我的App Service网络连接到底出了什么问题别急Azure提供了多种方法来透视App Service的网络连接状态今天我们就来聊聊这个话题并附上实操代码。## 为什么需要查看网络连接先打个比方你的App Service就像一家餐厅网络连接就是厨房到客人餐桌的传菜通道。如果通道堵塞比如防火墙规则错误、或者传菜员太少连接池耗尽客人就会饿肚子请求失败。查看网络连接能帮你1.诊断性能瓶颈比如连接到数据库的延迟过高2.排查安全配置确认VNet集成或访问限制是否生效3.监控异常行为是否有大量短连接或未关闭的连接泄漏资源## 方法一通过Azure门户的Kudu控制台Azure App Service内置了一个强大的诊断工具——Kudu也叫高级工具。进入方式很简单在门户中打开你的App Service点击左侧菜单的“高级工具” - “转到”。在Kudu的Debug Console中你可以直接运行Linux命令如果是Linux环境或PowerShell命令。下面我们看一个实际案例### 查看当前网络连接状态Linux环境假设你的App Service是Linux系统可以运行ss命令查看TCP连接bash# 显示所有TCP连接包括监听端口ss -tlnp# 显示所有已建立的连接过滤出ESTABLISHED状态ss -t state established输出示例State Recv-Q Send-Q Local Address:Port Peer Address:Port ProcessESTAB 0 0 10.0.0.4:443 203.0.113.5:54321 users:((dotnet,pid123,fd8))这里能看到App Service通过443端口连接到外部IP 203.0.113.5比如你的数据库。如果发现连接数异常多或者Recv-Q/Send-Q数值很大说明网络拥堵了。### 查看DNS解析情况有时候网络问题是由于DNS解析失败导致的。在Kudu的CMD窗口中运行cmdnslookup your-database-server.database.windows.net如果解析不到IP检查一下你的应用是否配置了自定义DNS服务器。## 方法二编写Python脚本主动探测连接有时候你需要在代码里动态判断网络情况或者想定时记录连接状态。下面是一个用Python写的示例通过psutil库需要安装pip install psutil来监控App Service进程的网络连接。### 示例1获取当前进程的所有TCP连接pythonimport psutilimport timedef monitor_connections(interval5, duration60): 监控App Service进程的TCP连接 :param interval: 采样间隔秒 :param duration: 总监控时长秒 start_time time.time() print(f开始监控连接采样间隔{interval}秒总时长{duration}秒) while time.time() - start_time duration: # 获取所有网络连接 connections psutil.net_connections(kindtcp) # 只关心App Service进程的连接通常PID是当前进程 current_pid psutil.Process().pid app_connections [conn for conn in connections if conn.pid current_pid] print(f\n--- 采样时间: {time.strftime(%Y-%m-%d %H:%M:%S)} ---) print(f当前进程PID: {current_pid}, 活跃连接数: {len(app_connections)}) # 统计连接状态 status_count {} for conn in app_connections: status conn.status status_count[status] status_count.get(status, 0) 1 # 打印详细连接信息只打印前5个 if len(app_connections) 5: print(f {conn.laddr} - {conn.raddr} 状态: {status}) print(f连接状态分布: {status_count}) # 检测异常如果ESTABLISHED连接数超过100发出警告 if status_count.get(ESTABLISHED, 0) 100: print(⚠️ 警告ESTABLISHED连接数超过100可能有连接泄漏风险) time.sleep(interval)if __name__ __main__: monitor_connections(interval10, duration30) # 每10秒采样一次持续30秒运行方式将此脚本上传到App Service的wwwroot目录然后通过Kudu的CMD执行python monitor.py。你会看到类似这样的输出开始监控连接采样间隔10秒总时长30秒--- 采样时间: 2024-03-15 14:30:05 ---当前进程PID: 1234, 活跃连接数: 85连接状态分布: {ESTABLISHED: 80, TIME_WAIT: 5}### 示例2测试到外部服务的连接延迟除了查看已有连接有时我们需要“主动探测”某个服务是否可达。下面的脚本模拟了App Service与数据库的连接测试pythonimport socketimport timedef test_remote_connection(host, port, timeout5): 测试到远程主机的TCP连接 :param host: 主机名或IP :param port: 端口 :param timeout: 超时时间秒 :return: 连接延迟毫秒失败返回None try: start time.time() # 创建socket并设置超时 sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout) # 尝试连接 sock.connect((host, port)) end time.time() latency_ms (end - start) * 1000 print(f✅ 成功连接到 {host}:{port}延迟: {latency_ms:.2f}ms) # 发送简单数据测试HTTP GET请求 sock.sendall(bGET / HTTP/1.1\r\nHost: example.com\r\n\r\n) response sock.recv(1024) print(f 收到响应: {response[:100]}...) # 打印前100字节 sock.close() return latency_ms except socket.timeout: print(f❌ 连接到 {host}:{port} 超时{timeout}秒) return None except socket.error as e: print(f❌ 连接错误: {e}) return None finally: sock.close()# 测试场景假设你的App Service需要连接数据库和Redisif __name__ __main__: # 测试1数据库连接 print( 测试数据库连接 ) test_remote_connection(your-db-server.database.windows.net, 1433) # 测试2Redis缓存 print(\n 测试Redis连接 ) test_remote_connection(your-redis.redis.cache.windows.net, 6380) # 测试3外部API print(\n 测试外部API ) test_remote_connection(api.github.com, 443)运行结果示例 测试数据库连接 ✅ 成功连接到 your-db-server.database.windows.net:1433延迟: 12.34ms 收到响应: bHTTP/1.1 200 OK\r\n...... 测试Redis连接 ❌ 连接到 your-redis.redis.cache.windows.net:6380 超时5秒发现Redis连接失败后你就要检查是不是防火墙规则没开还是VNet集成配置错了## 方法三使用Azure Monitor日志脚本虽然方便但只能实时查看。如果你需要长期监控可以开启App Service的诊断设置把网络连接日志发送到Log Analytics工作区。在门户中App Service - 诊断设置 - 添加诊断设置选择“AppServiceHTTPLogs”和“AppServiceConsoleLogs”。然后你可以用KQL查询kustoAppServiceHTTPLogs| where TimeGenerated ago(1h)| summarize ConnectionCount count() by bin(TimeGenerated, 5m), CsHost| render timechart这样就能看到每5分钟每个域名的连接数变化趋势。## 总结查看Azure App Service的网络连接情况核心思路是“由表及里”1.快速定位用Kudu的ss命令或nslookup查看当前连接和DNS解析2.深度分析编写Python脚本用psutil监控进程级别的连接状态或用socket测试外部服务可达性3.持续监控通过Azure Monitor日志实现长期趋势分析记住网络连接问题往往不是单一原因造成的。比如上面例子中Redis超时可能是- 网络安全组NSG没有放行6380端口- App Service的VNet集成未正确配置- Redis的防火墙规则没有添加App Service的出站IP最后送你一句话“连接是应用的血管监控是医生的听诊器。”掌握了这些工具下次遇到网络问题你就能像老中医一样“望闻问切”了。