Apache с SSL и socket.io (python) не работает - PullRequest
0 голосов
/ 03 мая 2020

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

Я использую:

  • Ubuntu 16.04
  • Apache 2.4 с сертификатами SSL от LetsEnctypt
  • Python 3.7 для запуска серверных сценариев, а также для запуска socket.io

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

  • sudo a2enmod rewrite
  • sudo a2enmod proxy
  • sudo a2enmod proxy_http
  • sudo a2enmod proxy_connect
  • sudo a2enmod proxy_wstunnel
  • и перезапустил сервер: sudo service apache2 restart
  • Я открыл порты 22, 80, 443, 8080, 8443.

Дополнительные сведения (это не должно влиять на проблему):

  • Сервер настроен на перенаправление всех траффиков c на https.
  • Сервер перенаправляет www.example.com к примеру. com с помощью перенаправления из другой записи VirtualHost в файле conf, который имеет имя сервера с www.

в файле apache conf (/ etc / apache2 / sites-av ailable / 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 даже не существует. На данный момент я отказался от логики c всей системы apache / websocket, последние несколько часов были просто попыткой и ошибкой.

Любая помощь с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...