Skip to content

测试部署

Bluefissure edited this page Jan 3, 2020 · 4 revisions

配置环境后进行的测试与部署。

测试

Web测试环境

python manage.py runserver 0.0.0.0:8080

即为监听了任意IP发送到8080端口的web(测试)服务

参考coolq-http-api的对应文档,下载酷Q机器人与对应插件,修改插件配置如下:

{
    "host": "0.0.0.0",
    "port": 5700,
    "use_http": false,
    "ws_host": "0.0.0.0",
    "ws_port": 6700,
    "use_ws": false,
    "ws_reverse_url": "ws://服务器IP:8080/ws/",
    "ws_reverse_use_universal_client": true,
    "enable_heartbeat": true,
    "use_ws_reverse": "yes",
    "ws_reverse_reconnect_interval": 5000,
    "ws_reverse_reconnect_on_code_1000": "yes",
    "post_url": "",
    "access_token": "SECRET",
    "secret": "",
    "post_message_format": "string",
    "serve_data_files": false,
    "update_source": "github",
    "update_channel": "stable",
    "auto_check_update": false,
    "auto_perform_update": false,
    "thread_pool_size": 4,
    "server_thread_pool_size": 1,
    "show_log_console": false,
    "enable_backward_compatibility": true
}

对应参数的含义参考coolq-http-api的文档

请注意,Web和机器人都启动后,正常的话应该是还不能正确处理消息,因为在大规模机器人接入的情况下,有必要对机器人发送来的消息使用消息队列管理,本项目推荐RabbitMQ实现的消息队列,以及Python的RabbitMQ客户端Pika

运行Pika Consumer

Pika的publisher对应代码在ffxivbot/consumers.py中实现(此处的consumers.py指django-channels的consumer),而Pika的consumer需要单独运行,脚本名为pika_rabbit.py

python pika_rabbit.py

如果web服务和rabbitmq服务均没有问题,会在处理消息后返回如下消息:

INFO:__main__:pid:11018 Acknowledging message 1
INFO:__main__:pid:11018 Acknowledging message 2

则应该能够正常的返回消息了。

部署

生产环境坑也比较多,主要包含了下面几个部分:

Nginx

用来管理一些静态资源与请求转发,配置的例子如下:

server
{
    listen 80;
    server_name your.domain_or_ip.com;
    charset UTF-8;
    access_log      /var/log/nginx/uWSGI_access.log;
    error_log       /var/log/nginx/uWSGI_error.log;

    client_max_body_size 75M;
    location / { 
        proxy_pass http://127.0.0.1:8001;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_connect_timeout 30s; 
        proxy_read_timeout 600s; 
        proxy_send_timeout 30s; 
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }   
    location /static {
        expires 30d;
        autoindex on; 
        add_header Cache-Control private;
        alias /home/ubuntu/FFXIVBOT/static;
    }
}

该配置将对于/的请求转发到了http://127.0.0.1:8001处理,也就意味着我们需要在8001端口通过channels的asgi服务器监听nginx的转发请求。

Django Channels ASGI

ASGI服务器有很多种:

我使用的是官方维护的daphne,大家可以多多折腾其他的服务器。

使用supervisor进行进程控制,配置如下:

[fcgi-program:daphne]
socket=tcp://localhost:8001
command=/home/ubuntu/.pyenv/shims/daphne -u /tmp/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers FFXIV.asgi:application
numprocs=2
process_name=daphne-%(process_num)d
directory=/home/ubuntu/FFXIVBOT/
user = ubuntu
autostart = true
autorestart = true
stdout_logfile=/var/log/supervisor/daphne.out
stderr_logfile=/var/log/supervisor/daphne.err

对应目录请自行修改。

Pika Consumer

也通过supervisor管理:

[program:pika]
command=/home/ubuntu/.pyenv/shims/python3.6 /home/ubuntu/FFXIVBOT/ffxivbot/pika_rabbit.py
numprocs=8
process_name=pika-rabbit-%(process_num)d
directory=/home/ubuntu/FFXIVBOT/
user = ubuntu
autostart = true
autorestart = true
stdout_logfile=/var/log/supervisor/pika-rabbit.out
stderr_logfile=/var/log/supervisor/pika-rabbit.err

请注意指定python所在路径,并根据服务器牛逼程度负载能力调整numprocs的大小。

然后通过sudo supervisorctl reload重载supervisor的配置即可。

请注意,生产环境监听80/443端口,需要在插件对应配置中修改端口(默认就是80/443)。

其他的坑

  • Nginx的连接可能会超时,因此如果ws连接一段时间没有通信会被自动断掉,建议如果机器人的群不活跃通过配置coolq-http-api插件的客户端心跳来进行保持连接。
  • Pika Consumer长时间运行可能会阻塞,初步怀疑是没有设置pika connection的heartbeat造成的,建议定时查看或重启。
  • 开启了SSL的话要将HTTPAPI插件的ws://改为wss://