Mrs4s / go-cqhttp

cqhttp的golang实现,轻量、原生跨平台.
GNU Affero General Public License v3.0
10.38k stars 1.63k forks source link

[Bug]: v1.0.1 上报Event数据 post失败 with 'context deadline exceeded' #2288

Closed Hanabi1688 closed 1 year ago

Hanabi1688 commented 1 year ago

请确保您已阅读以上注意事项,并勾选下方的确认框。

go-cqhttp 版本

v1.0.1

运行环境

Linux

运行架构

AMD64

连接方式

HTTP

使用协议

2 | Android Watch

重现步骤

qq用,windows本地部署成功,且消息正常post到端口,能正常使用。于是把项目部署到云服务器,出现上报Event数据 post失败 with 'context deadline exceeded' 1

期望的结果是什么?

能成功post

实际的结果是什么?

post失败 'context deadline exceeded'

简单的复现代码/链接(可选)

wget https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.1/go-cqhttp_1.0.1_linux_amd64.deb
sudo apt-get install dpkg
sudo dpkg -i go-cqhttp_1.0.1_linux_amd64.deb
go-cqhttp

日志记录(可选)

No response

补充说明(可选)

没找到原因,因此我已经尝试过重装系统,使用虚拟环境等步骤,但无法解决。如果大佬们能分享对这个issue的专业见解,我将不胜感激。

xiarimangguo commented 1 year ago

请打开go-cqhttp的config.yml
找到-server
设置timeout为更大的数值

servers:
    - http: # HTTP 通信设置
      address: 127.0.0.1:8000 # HTTP监听地址
      timeout: 5      # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
      long-polling:   # 长轮询拓展
        enabled: false       # 是否开启
        max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
      middlewares:
        <<: *default # 引用默认中间件
      post:           # 反向HTTP POST地址列表
  # 正向WS设置
  - ws:
      # 正向WS服务器监听地址
      address: 127.0.0.1:5700
      middlewares:
        <<: *default # 引用默认中间件
Hanabi1688 commented 1 year ago

请打开go-cqhttp的config.yml 找到-server 设置timeout为更大的数值

servers:
    - http: # HTTP 通信设置
      address: 127.0.0.1:8000 # HTTP监听地址
      timeout: 5      # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
      long-polling:   # 长轮询拓展
        enabled: false       # 是否开启
        max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
      middlewares:
        <<: *default # 引用默认中间件
      post:           # 反向HTTP POST地址列表
  # 正向WS设置
  - ws:
      # 正向WS服务器监听地址
      address: 127.0.0.1:5700
      middlewares:
        <<: *default # 引用默认中间件

谢谢大佬的回答,我刚去尝试了一下,将timeout设置为50,但是还是没能post成功 123 另外这是我的逻辑端,他没有收到信息: 1234 正常的应该会像这样,这是我的windows本地运行结果: 12345

xiarimangguo commented 1 year ago

看起来应该不是go-cqhttp的配置问题,我感觉可能是逻辑端的后台进程被杀掉了.

Hanabi1688 commented 1 year ago

看起来应该不是go-cqhttp的配置问题,我感觉可能是逻辑端的后台进程被杀掉了.

谢谢大佬,我有试过用netstat -tuln 看了一下我的端口是不是关了,但是端口还是在监听状态,我不知道这个有没有参考价值。 3 我看了我的screen应该也是正常的,所以我不太确定是不是版本的bug。(应该不会是云服务器的问题吧

xiarimangguo commented 1 year ago

首先请检查一下防火墙是否放行相应端口,并设置flask的host为0.0.0.0. 然后请检查在前台运行下本地和公网是否可以正常访问逻辑端服务.

如果同样的配置在Windows运行正常,而在Linux运行不正常,那么说明可能是Linux系统本身的问题.

有一种可能是,逻辑端那个服务要一直保持在前台运行. 一旦ssh连接断开,服务也就停止了. 所以要想办法让他在后台运行.

可尝试以下方法:

  1. 安装uWSGI

    pip install uwsgi
  2. 接下来进行配置,先是在你想存放的任何位置执行下面命令

    touch uconfig.ini #创建一个uconfig.ini配置文件
  3. 写入配置文件 uconfig.ini

    [uwsgi]
    http = 0.0.0.0:5002 #阿里云服务器中,要将5002端口添加到安全组中 # 外部访问地址,可以指定多种协议,此处使用http。
    chdir = /home/pythonproject/my_flask/py3env/myblog/ # 指向项目目录
    wsgi-file = /home/microblogpw/microblog.py #这里是flask启动程序文件,此处切忌填错py文件的名称,或者是app不在if之下,否则报错:no python application found, check your startup logs for errors 无法找到你的app实例
    callable = app # flask的app名
    processes = 4 # 处理器数
    threads = 2 # 线程数
    stats = 127.0.0.1:9191 #状态检测地址
    touch-reload=/home/microblogpw/ #动态监控文件变化,然后重载服务,是跟uWSGI的emperor有关的配置项,当这个路径下面的文件发生变化,服务就会重新加载,这在部署上线之后对项目内容进行修改的时候十分有用
    daemonize = /home/wyz/flask/server.log #daemonize项的出现表示把uwsgi服务器作为后台进程启动,项的值指向一个文件表明后台中的所有输出都重定向到这个日志中去。
  4. 启动uWSGI服务器

    uwsgi --ini /home/uconfig.ini

    另外,停止uWSGI服务器的命令是

    pkill -f -9 uwsgi
  5. 这个时候已经配置好了,即使是关闭了ssh也可以正常访问服务.

其实我是不怎么熟悉Linux的,尽我所能希望上面的方法可以有所帮助,如有问题多多包涵~

Hanabi1688 commented 1 year ago

首先请检查一下防火墙是否放行相应端口,并设置flask的host为0.0.0.0. 然后请检查在前台运行下本地和公网是否可以正常访问逻辑端服务.

如果同样的配置在Windows运行正常,而在Linux运行不正常,那么说明可能是Linux系统本身的问题.

有一种可能是,逻辑端那个服务要一直保持在前台运行. 一旦ssh连接断开,服务也就停止了. 所以要想办法让他在后台运行.

可尝试以下方法:

  1. 安装uWSGI
pip install uwsgi
  1. 接下来进行配置,先是在你想存放的任何位置执行下面命令
touch uconfig.ini #创建一个uconfig.ini配置文件
  1. 写入配置文件 uconfig.ini
[uwsgi]
http = 0.0.0.0:5002 #阿里云服务器中,要将5002端口添加到安全组中 # 外部访问地址,可以指定多种协议,此处使用http。
chdir = /home/pythonproject/my_flask/py3env/myblog/ # 指向项目目录
wsgi-file = /home/microblogpw/microblog.py #这里是flask启动程序文件,此处切忌填错py文件的名称,或者是app不在if之下,否则报错:no python application found, check your startup logs for errors 无法找到你的app实例
callable = app # flask的app名
processes = 4 # 处理器数
threads = 2 # 线程数
stats = 127.0.0.1:9191 #状态检测地址
touch-reload=/home/microblogpw/ #动态监控文件变化,然后重载服务,是跟uWSGI的emperor有关的配置项,当这个路径下面的文件发生变化,服务就会重新加载,这在部署上线之后对项目内容进行修改的时候十分有用
daemonize = /home/wyz/flask/server.log #daemonize项的出现表示把uwsgi服务器作为后台进程启动,项的值指向一个文件表明后台中的所有输出都重定向到这个日志中去。
  1. 启动uWSGI服务器
uwsgi --ini /home/uconfig.ini

另外,停止uWSGI服务器的命令是

pkill -f -9 uwsgi
  1. 这个时候已经配置好了,即使是关闭了ssh也可以正常访问服务.

其实我是不怎么熟悉Linux的,尽我所能希望上面的方法可以有所帮助,如有问题多多包涵~

谢谢大佬!我尝试了你所说的办法,本地使用go-cq,可以post到云服务器。所以我怀疑要么是1.0.1的版本问题,要么是我的系统问题。于是换了Ubuntu系统,顺便用了1.1.0版本,已经一切正常了。