Я пытаюсь запустить сервер 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, последние несколько часов были просто попыткой и ошибкой.
Любая помощь приветствуется.