Назад | Перейти на главную страницу

Apache с SSL и socket.io (python) не работает

Я пытаюсь запустить сервер socket.io (python) на другом порту моего веб-сервера Apache, чем обычный трафик 443 https. Я понимаю, что на эту тему уже ведется много дискуссий, но, к сожалению, я не нашел ничего, что помогло бы мне, и я уже потратил на это более 15 часов.

Я использую:

Я включил дополнительные модули:

UFW:

Дополнительная информация (которая не должна влиять на проблему):

В файле конфигурации apache (/etc/apache2/sites-available/000-default-le-ssl.conf): Я пробовал:

    <VirtualHost *:443>

        ... other stuff ...

        RewriteEngine On
        RewriteCond %{REQUEST_URI}  ^/socket.io/           [NC]
        RewriteRule /(.*)           http://localhost:8443/$1 [P,L]

        ProxyPass        /socket.io/ http://localhost:8443/
        ProxyPassReverse /socket.io/ http://localhost:8443/

        ... other stuff ...

    </VirtualHost>
</IfModule>

Я также пробовал:

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ... other stuff ...

        ProxyRequests Off
        ProxyPass /wss/  http://localhost:8443

        ... other stuff ...
    </VirtualHost>
</IfModule>

Я также попытался заменить http на https, ws и wss в каждом из них. Я также попытался заменить localhost на example.com в каждом из них.

Код сокета на стороне сервера (/var/www/html/server.py):

#!/usr/bin/python3
rom aiohttp import web
import socketio, ssl

sio = socketio.AsyncServer()
app = web.Application()
sio.attach(app)

async def index(request):
    with open('index.html') as f:
        return web.Response(text=f.read(), content_type='text/html')

@sio.on('message')
async def print_message(sid, message):
    print("Socket ID: " , sid)
    print(message)
    # await a successful emit of our reversed message
    # back to the client
    await sio.emit('message', message[::-1])

# We bind our aiohttp endpoint to our app router
app.router.add_get('/', index)

def getSslContext():
    SSLCertificateFile = '/etc/letsencrypt/live/example.com/fullchain.pem'
    SSLCertificateKeyFile = '/etc/letsencrypt/live/example.com/privkey.pem'
    sslContext = ssl.SSLContext()
    sslContext.load_cert_chain(certfile=SSLCertificateFile, keyfile=SSLCertificateKeyFile)
    return sslContext

if __name__ == '__main__':
    # Some of the things that I tried:
    web.run_app(app)
    web.run_app(app, port=8080)
    web.run_app(app, port=8443)
    web.run_app(app, host='localhost', port=8443)
    web.run_app(app, host='example.com', port=8443)
    web.run_app(app, host='localhost', ssl_context=getSslContext(), port=8443)
    web.run_app(app, host='example.com', ssl_context=getSslContext(), port=8443)

Код клиентского сокета в браузере:

function socket_start() {
    var array_of_urls = [
        'example.com',
        'example.com:8443',
        'ws://example.com:8443',
        'wss://example.com:8443',
        'http://example.com:8443',
        'https://example.com:8443',
        'example.com',
        'example.com:8443/wss/',
        'ws://example.com:8443/wss/',
        'wss://example.com:8443/wss/',
        'http://example.com:8443/wss/',
        'https://example.com:8443/wss/',
        'example.com/socket.io/',
        'example.com:8443/socket.io/',
        'ws://example.com:8443/socket.io/'
        'wss://example.com:8443/socket.io/',
        'http://example.com:8443/socket.io/',
        'https://example.com:8443/socket.io/',
    ];
    window.socket = io(array_of_urls[pick_an_index]);
    // And each of these also with the secure option:
    // window.socket = io(array_of_urls[pick_an_index], {secure: true});
}
socket_start();

function send_message_to_server() {
    window.socket.emit('message', 'this is a test');
}
setInterval(send_message_to_server, 3000);

Когда я открываю вкладку сетевой активности в моем браузере, я вижу, что каждые 2 секунды socket.io пытается подключиться к URL-адресу. https://example.com/socket.io/?EIO=3&transport=polling&t=N7RAT5C. Значение последнего параметра каждый раз меняется. Очевидно, это дает 404 ответа. Почему socket.io составляет URL-адрес и предполагает, что /socket.io/ существует на моем сервере? Или socket.io предполагает, что каждый устанавливает свои правила ProxyPass следующим образом? Возможно, я что-то упускаю. Мне просто нужно, чтобы он подключался к серверу сокетов. Иногда также было 503 или 500 ошибок, что еще более сбивает с толку, поскольку этот URL-адрес даже не существует. На данный момент я отказался от логики всей системы apache / websocket, последние несколько часов были просто попыткой и ошибкой.

Любая помощь приветствуется.