Azure Linux App Service PHP7.4不同客户端重复Session ID问题修复咨询
Azure Linux App Service PHP7.4 ARR Affinity下多客户端同Session ID问题修复方案
问题现象
在Azure Linux App Service环境使用PHP7.4且启用ARR Affinity时,出现不同客户端(不同IP)获取到相同Session ID的异常,相关日志如下:
| 时间 | session id | IP |
|---|---|---|
| 2023/02/17 09:21:00 | c3afe305bd82d13d532d18a1e29c0ab0fbfe51365c7fbf6 | 1.163.94.12 |
| 2023/02/17 09:21:14 | c3afe305bd82d13d532d18a1e29c0ab0fbfe51365c7fbf6 | 1.163.94.12 |
| 2023/02/17 09:21:19 | c3afe305bd82d13d532d18a1e29c0ab0fbfe51365c7fbf6 | 1.163.94.12 |
| 2023/02/17 09:21:25 | c3afe305bd82d13d532d18a1e29c0ab0fbfe51365c7fbf6 | 1.163.94.12 |
| 2023/02/17 09:28:10 | c3afe305bd82d13d532d18a1e29c0ab0fbfe51365c7fbf6 | 106.64.41.90 |
| 2023/02/17 09:28:11 | c3afe305bd82d13d532d18a1e29c0ab0fbfe51365c7fbf6 | 106.64.41.90 |
| 2023/02/17 09:28:13 | c3afe305bd82d13d532d18a1e29c0ab0fbfe51365c7fbf6 | 1.163.94.12 |
问题原因
- PHP7.4默认Session ID生成依赖服务器端共享资源(如进程随机数种子),在多实例/容器环境下易出现重复
- 若使用默认文件系统存储Session,当多个App Service实例挂载同一路径时,Session数据会被共享,导致不同客户端复用同一ID
- ARR Affinity启用后,若实例重启或状态异常,可能导致Session ID生成逻辑出现复用问题
修复方案
1. 强化Session ID生成唯一性
修改PHP配置或自定义生成逻辑,提升Session ID的唯一性:
- 在
php.ini中调整参数:session.sid_length = 32 session.entropy_file = /dev/urandom session.entropy_length = 32 - 在代码初始化阶段自定义Session ID生成函数:
if (!session_id()) { $uniqueId = bin2hex(random_bytes(16)); // 生成32位加密安全的唯一ID session_id($uniqueId); session_start(); }
2. 配置分布式Session存储
替换默认文件存储为Azure分布式存储,避免实例间Session共享:
- 使用Azure Redis Cache作为Session存储,在
php.ini中配置:session.save_handler = redis session.save_path = "tcp://<your-redis-host>:6380,password=<your-redis-key>,ssl=1" - 也可使用Azure Blob Storage配合第三方Session handler,确保Session数据全局隔离且唯一
3. 调整ARR Affinity配置
- 若业务无需粘性会话,可在Azure门户的App Service「配置」->「常规设置」中关闭ARR Affinity,观察问题是否缓解
- 若必须启用ARR Affinity,确认App Service实例的资源隔离配置正常,避免实例间共享进程状态
4. 升级PHP版本
PHP7.4已停止安全维护,升级至PHP8.0及以上版本,新版本优化了Session生成逻辑,降低重复ID概率,同时提升整体安全性与性能
5. 临时应急修复
重启所有App Service实例,清除可能存在的共享进程状态或缓存的随机数种子,临时解决当前异常
内容的提问来源于stack exchange,提问作者WenJing
相关产品推荐
相关产品推荐

