Azure App Service(Linux-PHP)横向扩展时跨实例复用密钥方案
Azure App Service Linux 环境下跨实例复用JWT公私钥对方案
首先明确:自动扩展时,你通过SSH在单个实例里生成的.pub和.pem文件不会同步到新实例。因为每个扩展出来的实例都是基于你的部署包或基础镜像创建的独立环境,实例本地的文件系统相互隔离,没有自动同步机制。
以下是几种推荐的解决方案:
方案1:利用应用设置(App Settings)存储密钥
把公私钥的内容直接存入Azure App Service的应用配置中,所有实例会自动共享这些配置:
- 在Azure门户的App Service配置页面,添加两个应用设置,比如
JWT_PRIVATE_KEY和JWT_PUBLIC_KEY,分别填入私钥和公钥的完整内容(注意保留密钥文件里的格式,包括-----BEGIN RSA PRIVATE KEY-----这类头信息)。 - 修改代码从环境变量读取密钥,无需再读取本地文件:
// 生成访问令牌 $private_key = getenv('JWT_PRIVATE_KEY'); $access_payload = [...]; $access_token = JWT::encode($access_payload, $private_key, 'RS256'); // 验证访问令牌 $public_key = getenv('JWT_PUBLIC_KEY'); $decoded_token = JWT::decode($access_token, new Key($public_key, 'RS256')); - 优势:配置自动同步所有实例,无需额外文件同步逻辑,密钥存储在Azure安全配置体系中,比实例本地更安全。
方案2:使用Azure存储账户存储密钥文件
将公私钥文件上传到Azure存储的Blob容器(设置为私有访问),通过存储服务实现跨实例共享:
- 在Azure存储账户中创建一个Blob容器,把公私钥文件上传进去,设置容器为私有访问。
- 给App Service分配托管标识,或者配置存储账户连接字符串到应用设置,确保应用有权限读取Blob内容。
- 使用Azure Storage PHP SDK在代码中读取Blob里的密钥文件内容,用于JWT的生成和验证。
- 可以在本地添加内存缓存逻辑,减少重复读取存储的次数,提升性能。
方案3:将密钥打包进部署包
把公私钥文件包含在你的应用部署包中,部署时会自动同步到所有实例:
- 注意:私钥属于敏感信息,绝对不要把它提交到公共代码仓库。建议通过CI/CD流程(比如Azure DevOps)在部署阶段将密钥文件加入部署包,或者使用Azure DevOps的安全文件功能管理密钥,避免泄露。
- 这种方式适合密钥变动频率较低的场景,每次更新密钥都需要重新部署应用。
关键注意事项
- 私钥是核心敏感数据,无论采用哪种方案,都要严格控制访问权限,避免泄露。
- 定期轮换公私钥对,降低密钥泄露带来的安全风险。
内容的提问来源于stack exchange,提问作者smk
相关产品推荐
相关产品推荐

