Twisted와 Autobahn을 사용하여 포트 80에서 WebSocket 연결을 수신하는 서버가 있습니다. 클라이언트가 WebSocket을 사용하지 않으려 고 할 때 정적 HTML 페이지를 제공하도록하고 싶습니다. Twisted와 Autobahn을 사용하여 동시에 두 가지 작업을 모두 수행 할 수 있습니까?Twisted 웹 서버와 Autobahn WebSocket 동시에 같은 포트
답변
확실히 here 및 here입니다. Twisted Web을 실행하고 경로에 Autobahn 기반 WebSocket Twisted Web 리소스를 추가 할 수 있습니다. Twisted Web 자원을 원하는만큼 추가하여 자원 트리에 추가 할 수 있습니다.
간단히이 기술은 WebSocketServerFactory
수동으로 startFactory()
를 호출하여, 당신은 다음 트위스트 웹 계층 내 어디서든 putChild에 등록 할 수있는 autobahn.twisted.resource.WebSocketResource
자원 내에서 포장하여 시작하는 것입니다.
당신은 믹스에 haproxy를 추가해야한다고 생각합니다. 당신이 단지 트위스티드와 아우토반을 사용하고 싶다면 나는 당신이 항구를 공유 할 수 있다고 생각하지 않는다. 그런 말로, 나는 내 웹 소켓과 웹 서버가 동일한 외부 포트에서 수신 대기하고 있습니다. 하지만 haproxy는 인바운드 연결을 처리 한 다음 환경에서 가져온 것들을 기반으로 연결을 분배합니다. 모든 환경이 다릅니다. 기본적으로 haproxy를 실행 한 다음 웹 서비스와 웹 소켓을 개별 포트에서 수신 대기하게 만듭니다. 제 경우에는 웹 소켓 서버를 127.0.0.1:9000에, 웹 서비스를 127.0.0.1:8080에 넣었습니다. 그런 다음,이 예에서, 같은 haproxy의 구성에 대한 haproxy.conf 파일을 만듭니다
global
maxconn 100
mode http
frontend myfrontend
bind *:80
acl is_websocket hdr(Upgrade) -i WebSocket
use_backend ws if is_websocket
default_backend mybackend
backend mybackend
server s3 127.0.0.1:8080
backend ws
timeout server 600s
reqrep ^Host:\ .* \0:9000
server ws1 127.0.0.1:9000
나는 haproxy.conf 파일에서 관련이없는 물건의 무리를 제거했다, 그러나 이것은에서 아이디어를 가져옵니다. 2 개를 관리하는 대신 하나의 포트 만 외부에서 볼 수있게하는 것이 중요했습니다.
haproxy은 최고입니다! -g
당신은 확실히 이것을 위해 haproxy가 필요하지 않습니다. 이것은 Asker가 두 개의 개별 프로세스를 실행하는 데 만족스럽지 만 합리적인 해결책 일 수 있지만 Autobahn은 Twisted에 통합되어 있기 때문에 두 프로세스가 필요하지 않습니다. – Glyph
@ 글리프 - 그럼 .. 좋은 해결책은 무엇입니까? –
@ 글리프가 말했듯이, haproxy 필요가 없습니다. Autobahn에는 Twisted Web 리소스로 WebSocket을 제공하는 래퍼가 있습니다. – oberstet