Alex_woland
@Alex_woland

Как задеплоить aiohttp (Nginx+uWSGI)?

Здравствуйте. Помогите разобраться.
Пишу бота для телеграм.
Необязательные подробности

Делал по аналогии с инструкцией на Flask через uWSGI.
Хочу сделать его максимально асинхронным. Для этого взял aiohttp. Но столкнулся с такой проблемой. Все примеры рекомендуют связку Supervisord+Gunicorn. С горем пополам получилось убрать supervisord. А вот без gunicorn никак не получается.


Мой NGINX config:
server {
	listen 443 ssl;	
	listen [::]:443 default_server ipv6only=on;

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	ssl on;
    ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem; # managed by Certbot

	root /var/www/wordpress/$subdomain/;
	server_name domain *.domain;
    keepalive_timeout   60;
	
    index index.php index.html index.htm;
    client_max_body_size 1000M;

    location / {
		try_files $uri $uri/ /index.php?q=$uri&$args;		
    }

	location /1234567890:TOKEN_ToooKen-my-ToooKen {
		include uwsgi_params;
        uwsgi_pass unix:/home/mybot/Mybot/mybot.sock;
    }

	error_page 404 /404.html;

	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root /usr/share/nginx/html;
	}
}


mybot.ini
[uwsgi]
module = mybot:app

; create a bunch of sockets
socket = mybot.sock
chmod-socket = 775
;vacuum = true

; spawn the master
master = true
; spawn 4 processes
processes = 4
; load a python script as the worker code
python-worker-override = mybot.py

die-on-term = true
logto = /var/log/uwsgi-mybot/%n.log
touch-reload = /home/mybot/Mybot/mybot.


mybot.service
[Unit]
Description=Serving our mybot
After=network.target

[Service]
PIDFile=/run/mybot/pid
User=mybot
Group=www-data
WorkingDirectory=/home/mybot/Mybot
Environment="PATH=/home/mybot/Mybot/mybot/bin"
ExecStart=/home/mybot/Mybot/mybot/bin/uwsgi --ini mybot.ini
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
Restart=always

[Install]
WantedBy=multi-user.target


mybot.py по примеру
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
import asyncio
from aiohttp import web

import uwsgi
import socket
import sys
import signal

async def index(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.tp == web.MsgType.text:
            # ws.send_str("Hello, {}".format(msg.data))
            ws.send_str("Welcome home!")
            #return web.Response(text="Welcome home!")

        elif msg.tp == web.MsgType.binary:
            ws.send_bytes(msg.data)
        elif msg.tp == web.MsgType.close:
            break

    return ws

async def handle(request):

    name = request.match_info.get('name', "Anonymous")
    text = "Hello, " + name
    return web.Response(body=text.encode('utf-8'))

async def wshandler(request):

    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.tp == web.MsgType.text:
            ws.send_str("Hello, {}".format(msg.data))
            #return web.Response(text="Welcome home!")

        elif msg.tp == web.MsgType.binary:
            ws.send_bytes(msg.data)
        elif msg.tp == web.MsgType.close:
            break

    return ws

async def init(loop, fd):
    app = web.Application(loop=loop)
    app.router.add_route('GET', '/1234567890:TOKEN_ToooKen-my-ToooKen ', index)
    app.router.add_route('GET', '/echo', wshandler)
    app.router.add_route('GET', '/{name}', handle)

    srv = await loop.create_server(app.make_handler(),
                                   sock=socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM))
    print("asyncio server started on uWSGI {0}".format(uwsgi.version))
    return srv

def destroy():
    print("destroy worker {0}".format(uwsgi.worker_id()))
    sys.exit(0)

def graceful_reload():
    print("graceful reload for worker {0}".format(uwsgi.worker_id()))
    # TODO do somethign meaningful
    sys.exit(0)

loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGINT, destroy)
loop.add_signal_handler(signal.SIGHUP, graceful_reload)
# spawn a handler for every uWSGI socket
for fd in uwsgi.sockets:
    loop.run_until_complete(init(loop, fd))
uwsgi.accepting()
loop.run_forever()


При обращении https://domain/1234567890:TOKEN_ToooKen-my-ToooKen получаю только Bad Request. Нужна конструктивная помощь
  • Вопрос задан
  • 1076 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы