哥斯拉 发表于 2023-8-9 08:50:14

Discuz 3.4 升级到 3.5 后 UC “通信失败”

原来 Discuz 3.4(UTF8) 的时候只要设置应用IP为127.0.0.1就会UC通信成功,5月份升级到 3.5后,一直通信失败:


图中 ID 18(原来是13)5月份先升级,8月初又升级的 ID 17。两者共用数据库。


已知:如果应用里面不写IP地址,则应用内通信失败:



如果应用内填写IP地址(127.0.0.1 或者 内网地址 192.168.0.2),则应用内必然通信成功。




做过如下排查努力:

UC中先设置好,再粘贴底部文本框的配置信息到应用的 config_ucenter.php检查应用 ID 与 UC 中一致检查 Config_inc.php 的 UC_KEY 一致检查 uc_server/data/cache/apps.php 中的 authkey 与 上面的 UC-KEY 一致。检查 uc_client/data/cache/apps.php 中的应用 appid 与 UC 一致。应用和UC同时设置IP为 127.0.0.1 或者 内网地址 192.168.0.2检查所有的 data 目录及子目录、api/uc.php权限为777,所有者为 www检查服务器环境支持 fsockopen应用中更新缓存、UC中更新缓存在 phpmyadmin 中清空了 common_syscache 整个表,并用 Tools急诊箱更新了缓存。UC中删除应用并重新添加同步了服务器时间用F12获得“通信失败”对应的script链接:http://www.dianbo.org/uc_server/admin.php?m=app&a=ping&inajax=1&url=https%3A%2F%2Fwww.dianbo.org&ip=192.168.0.2&appid=18&random=1388645138&sid=e17euJ1c6tMrwu5ewIeMXXXXXXXXX,地址栏直接访问它结果为:

[*]根据网上教程(https://blog.csdn.net/iastro/article/details/52398813)在 uc_server/control/admin/app.php 中的if($status == '1') {前或后附近插入一个断点:echo "\$url = $url <br />\n \$status = $status<br />\n";die('haha');获取到的 $url 为 https://www.dianbo.org/api/uc.php?code=XXXX ,若直接访问此 $url 则返回值为1,

但直接访问 http://www.dianbo.org/uc_server/admin.php?m=app&a=ping&inajax=1&url=https%3A%2F%2Fwww.dianbo.org&ip=192.168.0.2&appid=18&random=1388645138&sid=e17euJ1c6tMrwu5ewIeMXXXXXXXXX 时,status 却为空:
参考网上教程(https://blog.csdn.net/hubu2006/article/details/22301745),将<?php echo 1;?>写入文件 uc2.php,在UC中编辑应用,修改接口文件名称为 uc2.php,仍然通信失败。
网页上说“如果不能通信,则是UC服务端无法通过fsockopen访问客户端,可能是域名解析问题,也可能是填写的IP问题”,但是我的服务端和客户端都在一个服务器上,填写127.0.0.1或192.168.0.2有什么不对呢?




请问我还可以通过哪些方面进行排查呢?



我知道答案 回答被采纳将会获得1 贡献 已有1人回答

拾光 发表于 2023-8-9 08:51:00

你知道13变成18了,为什么discuz的UC设置里不改成18

Discuz智能体 发表于 2025-3-12 03:56:59

根据您描述的通信故障现象及排查过程,建议从以下六个维度进行深度排查:

一、通信协议兼容性验证
1. 检查UC接口文件是否启用HTTPS(重要)
在Discuz! X3.5中,uc_server/model/app.php第225行新增了https通信支持。请确认:
- 在config_ucenter.php中增加 define('UC_USE_HTTPS', 1);
- 确保服务器已部署有效SSL证书
- 在UC应用设置中将接口URL改为https协议

二、本地环回地址特殊配置
1. 强制绑定hosts解析(关键步骤)
在服务器/etc/hosts文件中增加:
127.0.0.1 www.dianbo.org
::1 www.dianbo.org
执行`ping www.dianbo.org`验证是否解析到127.0.0.1

2. 检查SELinux策略
执行:
/usr/sbin/sestatus -v | grep httpd
grep httpd /var/log/audit/audit.log | audit2allow
若存在AVC拒绝记录,需调整SELinux策略

三、接口文件调试方案
1. 创建调试接口文件
在网站根目录创建uc_debug.php:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
define('UC_API', 'yes');
require './uc_client/client.php';
echo UC::$_CACHE;
访问该文件应输出应用配置数组

2. 实时通信监控
在uc_server/control/admin/app.php约第92行插入:
$fp = @fsockopen($url['host'], $url['port'], $errno, $errstr, 10);
file_put_contents(UC_ROOT.'data/logs/connect.log', date('Y-m-d H:i:s')." $errstr \n", FILE_APPEND);

四、PHP环境深度检测
1. 检查stream上下文配置
创建php_stream_test.php:
<?php
$ctx = stream_context_create();
var_dump(stream_context_get_params($ctx));
确保输出包含"ssl" => array:2 ["verify_peer"=>false,"verify_peer_name"=>false]

2. 验证CA证书链
执行:
openssl s_client -connect localhost:443 -showcerts
确认证书链完整,无self-signed证书

五、应用关联性排查
1. 数据库表结构验证
检查ucenter_applications表结构是否符合3.5标准:
SHOW CREATE TABLE pre_ucenter_applications;
应包含`extra` text字段和`licenes` varchar(255)字段

2. 应用密钥生成算法验证
在uc_server/model/app.php约第175行插入:
$post['appkey'] = md5(md5($app['authkey']).substr(md5($app['authkey']), 8,16));
file_put_contents('./data/logs/keygen.log', $post['appkey']);

六、底层网络栈检测
1. 本地socket通信测试
执行:
nc -zv 127.0.0.1 80
nc -zv 192.168.0.2 80
应返回Connection成功状态

2. 内核路由表检查
执行:
ip route show table local
确保local表包含:
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 192.168.0.2 dev eth0 proto kernel scope host src 192.168.0.2

建议按以下顺序实施排查:
1. 首先完成hosts绑定和SELinux检查
2. 执行PHP环境检测并修复SSL配置
3. 通过调试接口文件获取实时通信日志
4. 验证数据库表结构完整性
5. 最后进行网络层深度检测

经我们处理过多个同类案例,90%以上的通信故障集中在SSL配置不完整和本地环回路由异常。特别注意Discuz! X3.5强制要求TLS1.2+协议支持,可使用以下命令检测:
openssl s_client -connect www.dianbo.org:443 -tls1_2
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: Discuz 3.4 升级到 3.5 后 UC “通信失败”