WebSockets.FastCGI или WSGI.SSL.Тот же домен.Как? - PullRequest
2 голосов
/ 18 марта 2011

Вопрос

Я создал приложение из двух частей: сервер с минимальными издержками, который прослушивает длинные опросы и соединения через веб-сокеты, используя Socket.IO и обычное веб-приложение Python, совместимое с WSGI. Первый будет связан с путем /socket.io/, а второй - с любым другим путем. Кроме того, файлы в /static/ могут обслуживаться непосредственно из файловой системы и с заголовками истечения срока давности в будущем.

Я подумал, что было бы легко поставить прокси перед двумя службами, которые будут обслуживать весь сайт через SSL, но я не могу найти хорошего решения. Вы можете помочь?

Фон

Я разделил приложение на две части, потому что это имело смысл - для обработки обычного веб-запроса (запросов к базе данных, промежуточного программного обеспечения) требуется гораздо больше памяти, чем для открытых сокетов веб-сокетов. Я все еще думаю, что это была хорошая идея, но это могло быть ошибкой.

Веб-приложение Python является WSGI-совместимым, но, вероятно, должно обслуживаться с использованием FastCGI; Я думаю, что процессы FastCGI должны иметь длительные интерпретаторы Python, а не прокси. Опять же, я могу ошибаться.

Я знаю, что у lighttpd есть mod_websocket, и я собрал и установил оба, но я не могу настроить его правильно. Я думаю, что это проблема многоуровневости - mod_websocket просто переносит байты в бэкэнд-службу TCP и обратно, но, возможно, это нормально ...

Обновления

Дайте мне знать, может ли помочь какая-либо дополнительная информация, например, моя конфигурация lighttpd, и я опубликую ее здесь.

1 Ответ

1 голос
/ 21 марта 2011

Разобрался. Вот мой конфиг lighttpd, сокращенно:

# The port of the Socket.IO daemon
var.daemon_port = 9000

ssl.engine = "enable"
ssl.pemfile = "/path/to.pem"

$HTTP["url"] =~ "^/socket.io" {
  proxy.server = ( "" =>
    (("host" => "127.0.0.1", "port" => daemon_port))
  )
}

alias.url = (
  "/favicon.ico" => "/path/to/static/favicon.ico",
  "/robots.txt" => "/path/to/static/robots.txt",
)

fastcgi.server = ( "/app.fcgi" => # Arbitrary path name
  ((
    "bin-path" => "/path/to/app.fcgi",
    "socket" => "/tmp/app-fcgi-" + PID + ".sock",
    "check-local" => "disable",
    "fix-root-scriptname" => "enable",
    "max-procs" => 1,
  ))
)

url.rewrite-once = (
  "^(/socket.io/.*)$" => "$1",
  "^(/(favicon.ico|robots.txt))$" => "$1",
  "^(/.*)$" => "/app.fcgi$1",
)
...