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