Можно всю жизнь проклинать темноту, а можно зажечь маленькую свечку.
Конфуций

Меню навигации для мобильных

Как повесить 2 веб сервера на один порт?

Автор Shaman, 15 Сен., 2020, 16:46

« предыдущая - следующая »

Shaman

Уважаемые, есть один IP наружу, на нём один URL, а сервера два (или больше), один Apache, другой qBittorrent - надо, чтобы на одном порту торчали и по одному URL ходили. Есть предложения как это можно организовать?

Slabovik

#1
Ситуёвина интересная. Обычно их на разные IP, или как минимум на разные порты. Потому как входящий поток на один порт сразу на оба сервера даст "ответку" от обоих серверов сразу, что будет совсем плохо (вы просто получите ответку от системы, что так делать нельзя. Ну, по крайней мере, в винде так). Тут походу надо proxy настраивать, который, глядя на url будет по нему разруливать, какому серверу его посылать и соответственно, пересылать ответку от сервера запрашивающему.

На входе ведь наверняка рутер стоит (тот,на котором один IP)? У него прокся есть? Если нет (у бытовых рутеров его обычно нет), то сам апач умеет проксей работать. У него есть mod_proxy (http://httpd.apache.org/docs/current/ru/mod/mod_proxy.html), который надо будет включить, раскомментировав соответствующую строку. Если я правильно помню, то ещё раскомментировать mod_proxy_http (а может ещё чего, но для http вроде больше ничего не надо, ну может ещё mod_proxy_connect понадобится).

Дальше надо настроить хосты (или виртуал-хосты, если настроены они). Самое простое - это настроить "постронний" (т.е. qBittorrent) как какую-нибудь папку на сайте, который обслуживает Apache.
Приблизительный пример, оформлен на Virtualhost (http://httpd.apache.org/docs/current/ru/vhosts/) (но в общем может быть и центральной конфигурацией)
<VirtualHost *:80>

# формальности и папка с основным сайтом на жестком диске
# (точнее, путь до хранилища, где лежат файлы сайта, а на чём оно - вопрос десятый)
        ServerAdmin admin@mysite.com
        DocumentRoot "/var/www/mysite"

# объявление url и его алиасов, если они есть
        ServerName      mysite.com
        ServerAlias     www.mysite.com

# здесь включаем обратный прокси
        ProxyRequests Off
        ProxyPreserveHost On
        ProxyVia full

# общие правила доступа. Вполне нормально т.к. далее .htaccess рулит
        <Proxy *>
        Order deny,allow
        Allow from all
        </Proxy>
# а вот здесь правила просмотра для Proxy
# правила такие: ProxyPass и proxyPassReverse - ключевые слова
# за ними маска - если запрос подходит под маску, то производится перенаправление
        ProxyPass         /qBitTorrent   http://192.168.10.21:80/
        ProxyPassReverse  /qBitTorrent   http://192.168.10.21:80/
# здесь прописали папку, которую пользователь, зашедший на сайт,
# будет видеть как "http://www.mysite/qBitTorrent/"
# а "заполнением" этой папки будет заниматься http-сервер,
# отвечающий по IP 192.168.10.21 на 80-м порту

</VirtualHost>

Да, необходимо убедиться, что все внутренние ссылки внутри файлов qBitTorrent являются относительными. Если это не так, то придётся отредактировать файлы, поправив эти ссылки, чтобы они не зависели от того, в какой папке сайта с точки зрения пользователя они бы ни находились.

Если это сделать невозможно (ну не в курсе я, что там у этого qBT), то тогда выходом будет оформление ещё одной доменной записи. Проще всего организовать домен более низкого уровня, например qBitTorrent.mysite.com
В этом случае у Апача в конфиге надо прописать два виртуалхоста, один виртуалхост будет обычным сайтом, а второй при помощи mod_proxy полностью переправить на внутренний адрес, по которому работает qBitTorrent (почти те же самые настройки, что и выше).

и несколько ссылок
http://geckich.blogspot.com/2011/11/modproxy-apache.html
https://qna.habr.com/q/76878
https://habr.com/ru/post/330670/
http://прокся.рф/как настроить прокси (http://xn--j1ahceh8f.xn--p1ai/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0/93/160)
Apache в качестве прокси сервера (http://wiki.elnit.org/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0_Apache_%D0%B2_%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5_%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0)
https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Slabovik

#2
гм, закрылось редактирование... ну, значит, добавлю.

Я о том, что правила ProxyPass можно добавить и чуть другим способом, в некоторых случаях это может быть удобнее. Для определения шаблона можно использовать LocationMatch. Пример
<VirtualHost *:80>

[... ... ...]
<LocationMatch "/qBitTorrent">
  ProxyPass        http://192.168.10.21:80/
  ProxyPassReverse http://192.168.10.21:80/
</LocationMatch>
</VirtualHost>

Просто в этом случае в LocationMatch гораздо легче прописывать всякие условия, если они нужны (типа замены http на https и наоборот, файлы-исключения и т.п.).

Пример: https://coderoad.ru/40938148/ (https://coderoad.ru/40938148/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9-%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%B4%D0%BB%D1%8F-%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D1%85-URL-Apache)

Ну, и для разнообразия, простенький пример, как это делается для https (https://coderoad.ru/10335329/%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-http-%D0%BD%D0%B0-https-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D0%B2-conf-%D1%84%D0%B0%D0%B9%D0%BB-apache) (в общем-то, просто прописывается правило для одного и для другого порта). Возможно, нужно будет включить
 SSLProxyEngine on (пример (https://coderoad.ru/16130303/%D0%9A%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8-http-%D0%BA-https-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-Apache-httpd-v2-2) без виртуалхостов)
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.