Проблема развертывания: socket.io -- Apache2 Server на linux ubuntu 20.04
Мой проект создан с помощью React (create-react-app), React router (без webpack), -- Django (rest) и Socketio с eventlet на backend.
У меня есть 3 проблемы с развертыванием с apache2 - Все прекрасно работало на разработке:
Создал 2 conf файла, один для frontend порта 80 и один для backend порта 8000 - по отдельности они работают относительно нормально.
Проблема, с которой я столкнулся при развертывании:
- Socket.io
дает
[wsgi:error]
eventlet.wsgi.server(eventlet.listen(("", 8000)), application, log_output=False)
sock.bind(addr)
Address already in use
- проверил, что использует порт --> только apache2 и это дает тот же результат с любым другим портом .
- попробовал создать отдельный conf файл для сокета с портом 5000 (изменив порт в строке wsgi eventlet), тот же результат
. в socketFile.conf:
Listen 5000
<VirtualHost *:5000>
ServerName www.yawp.live
ServerAlias yawp.live
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /home/path/to/main/folder>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess exampleSocket python-home=/home/path/to/venv python-path=/home/path/to/main/folder
WSGIProcessGroup exampleSocket
WSGIScriptAlias / /path/to/wsgi.py
</VirtualHost>
- Не уверен, как создать эквивалент для
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socketio_app/views.py
async_mode = None
import os
import socketio
basedir = os.path.dirname(os.path.realpath(__file__))
sio = socketio.Server(
async_mode=async_mode,
logger=False,
cors_allowed_origins='http://localhost:3000'
)
thread = None
...
wsgi.py
import os
from django.core.wsgi import get_wsgi_application
from socketio_app.views import sio
import socketio
import eventlet
import eventlet.wsgi
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")
application = get_wsgi_application()
application = socketio.WSGIApp(sio, application)
eventlet.wsgi.server(eventlet.listen(("", 8000)), application, log_output=False)
У меня есть еще 2 проблемы с фронтендом: прокси и react router
Я ценю вашу помощь! :)
Фундаментальная ошибка заключается в том, что вы пытаетесь связать два процесса на одном порту tcp на одном ip-адресе, это невозможно. 'Address already in use' - это сообщение об ошибке, которое вы получите при запуске другой программы, которая собирается использовать сокет, который уже прослушивается.
Используйте эту команду, чтобы узнать, используется ли уже порт 5000:
ss -tln|grep 5000
Я бы ожидал, что Apache слушает на порту 80 (http), а REST API на порту 5000.