может apache обрабатывать сообщения не http - PullRequest
0 голосов
/ 20 июня 2010

У меня есть веб-сервер apache, и нам нужно разработать в нем модуль (используя mod_python или mod_wsgi).Он будет обрабатывать запросы, отправленные как http GET / POST.Однако мы бы хотели, чтобы этот модуль ТАКЖЕ обрабатывал сообщения, отправленные другими удаленными приложениями, НЕ основанные на http.То есть тело этих пакетов tcp может быть просто отформатированным сообщением в формате json или xml.Это удаленное приложение просто время от времени выдает уведомления и не ожидает никаких ответов от модуля apache.

Мне было интересно, смогу ли я создать два потока в моем модуле (один получает сообщения от apache при получении сообщений http на порт 80, другой поток прослушивает другой порт ... скажем, 2000 ... и мой удаленныймашина настроена на отправку на порт 2000).Другая возможность состоит в том, что я запускаю отдельное приложение на своей машине apache, прослушивающей порт 2000. Когда оно получает уведомление, я помещаю его в сообщение http и отправляю обратно себе на порт 80.

Я предполагаю, что вопрос: Мой модуль ограничен получением сообщений только через apache (из порта 80) или мой модуль apache также может прослушивать другие порты?Если есть более простое решение, пожалуйста, дайте мне знать.Благодарю.

Ответы [ 2 ]

0 голосов
/ 21 июня 2010

Поскольку Apache в большинстве конфигураций является многопроцессорным веб-сервером, вы не можете просто прослушивать отдельный сокет из вашего кода Python, так как несколько процессов будут пытаться сделать то же самое, и поэтому они будут конфликтовать.

Технически, вы можете использовать режим демона mod_wsgi для своего приложения WSGI и запускать его с помощью одного процесса, чтобы избежать проблемы с многопроцессорностью, но все равно задаетесь вопросом, является ли это хорошей идеей и, вероятно, лучше будет совершенно отдельный процесс, отличный от Apache.

0 голосов
/ 20 июня 2010

Вы можете настроить apache для прослушивания на разных портах, используя директиву VirtualHost:

Listen 80
Listen 2000

<VirtualHost *:80>
    ServerName www.example.com
    WSGIScriptAlias / /path/to/script.wsgi

    <Location /my/location>
    ...
    </Location>
</VirtualHost>

<VirtualHost *:2000>
    ServerName www.example.com
    WSGIScriptAlias / /path/to/script.wsgi

    <Location /my/location>
    ...
    </Location>
</VirtualHost>

Подробнее здесь .

Однако может быть проще прослушивать порт 80 и различать, используя разные пути, например так:

<VirtualHost *:80>
    WSGIScriptAlias /normal /path/to/script.wsgi
    WSGIScriptAlias /notifications /path/to/script.wsgi
    WSGIApplicationGroup %{GLOBAL}
    ...
</VirtualHost>
...