Настройте Apache Vhost, работающий с несколькими серверами

681
Xorifelse

Я хочу запустить сервер Python 3. * и PHP 7. *, работающий рядом друг с другом, используя следующее:

php.localhost py.localhost 

Мой /etc/httpd/conf/httpd.conf:

# Dynamic Shared Object (DSO) Support LoadModule wsgi_module modules/mod_wsgi.so LoadModule php7_module modules/libphp7.so AddHandler php7-script php Include conf/extra/php7_module.conf WSGIScriptAlias / /var/www/python/app.py  ServerName localhost  # Virtual hosts Include conf/extra/httpd-vhosts.conf 

Полный httpd.confфайл здесь .

Мой /etc/httpd/conf/extra/httpd-vhosts.conf:

<VirtualHost *:80> ServerAdmin yesididuse@google.com DocumentRoot "/var/www/php" ServerName php ServerAlias php.localhost ErrorLog "/var/log/httpd/php-error.log" CustomLog "/var/log/httpd/php-access.log" common </VirtualHost>  <VirtualHost *:80> ServerAdmin yesididuse@google.com DocumentRoot "/var/www/python" ServerName python ServerAlias py.localhost ErrorLog "/var/log/httpd/py-error.log" CustomLog "/var/log/httpd/py-access.log" common </VirtualHost> 

Мой /etc/hosts:

# Static table lookup for hostnames. # See hosts(5) for details. 127.0.0.1 php.localhost 127.0.0.1 py.localhost 

И мое имя хоста есть L702X.

Я в недоумении, я искал поисковые системы, следуя инструкциям, и здесь, похоже, ничего не имеет смысла, например, как можно перейти к 127.0.0.1 по двум разным адресам?

Если мне не хватает файлов конфигурации, прокомментируйте и я добавлю. Любая помощь приветствуется.

1

2 ответа на вопрос

2
grawity

как можно по маршруту к 127.0.0.1 перейти на 2 разных адреса

Нет, hostsфайл следует интерпретировать с другой стороны: два разных имени переводятся на один и тот же адрес 127.0.0.1 («если вы хотите связаться с py.localhost, свяжитесь с 127.0.0.1») - как два человека, имеющие общий номер телефона.

Это никак не влияет на маршрутизацию IP-уровня; это все тот же 127.0.0.1, независимо от того, как он был получен, и пакеты к нему идут одинаково.

(То же самое очень часто делается в Интернете, когда сотни доменов DNS преобразуются в один и тот же IP-адрес веб-сервера.)

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

Не могу поверить, что это заняло у меня так много времени, чтобы отметить это, я прочитал и проголосовал, когда увидел, потому что с вашим последним абзацем я знал, где искать. Потребовалось некоторое усилие, но оно получилось частично так, как я хотел. Затем я решил удалить apache и перейти на nginx, и теперь он работает намного проще. Я просто забыл отметить это, мои извинения. Xorifelse 6 лет назад 0
1
Anaksunaman

В дополнение к уже превосходному ответу @ grawity, вы должны помнить, что DNS (или в этом случае ваш hostsфайл, который служит той же цели) только отображает имя на IP-адрес - но в этих именах нет никакого ограничения IP-адресов. сопоставления to-ip. Пример @ grawity о том, что телефонный номер (IP) может быть доступен для разных людей (имена / программы), является хорошим примером.

Если бы существовало правило сопоставления, в котором один IP-адрес мог использоваться только один раз, вы не могли бы запускать несколько служб (даже разных видов) с одного и того же IP-адреса, что было бы серьезным техническим ограничением. Вам понадобятся отдельные IP-адреса (и, вероятно, серверы) для HTTP, DNS, электронной почты и т. Д. И всех поддоменов (например, www.example.com является поддоменом example.com и для него потребуется отдельный IP-адрес от example.com ) ,

Поскольку в этих сопоставлениях такого ограничения нет, программы обычно связываются с сервером на разных портах для разделения трафика. Обратите внимание, что порты не включены в записи DNS (или ваш hostsфайл) - это зависит от отдельных частей программного обеспечения, чтобы решить, какие порты они должны использовать для связи. Если на один получено несколько запросов на разные имена (порт 80 или 443 для обычного веб-трафика), то сервер (который в вашем случае находится на 127.0.0.1) должен решить, что делать, например, если он получает запрос на php.localhostили py.localhost.

Именно здесь вступает в действие виртуальный хостинг на основе имен (технически индикация имени сервера [SNI] для HTTPS). Ваш файл виртуальных хостов содержит инструкции для Apache, в которых говорится: «Если мы получим запрос на это имя хоста, сделайте X». Если имя не совпадает, сервер обычно возвращает код состояния HTTP 404 (не найден). Если есть, запись виртуального хоста сообщает серверу, как действовать (обслуживать страницы из этого каталога и т. Д.).


Обратите внимание, что ваша ServerName localhostзапись в httpd.confявляется хостом по умолчанию. Этот хост иногда обслуживается вместо возврата 404, если в вашем файле виртуальных хостов не найдено подходящего имени хоста.


Спасибо за продуманное и четкое объяснение, оно определенно исправило некоторые вопросы, возникшие во время возни. Я уже проголосовал за этот вопрос, извините, могу отметить только один. Вы знаете, как катится SE;) Xorifelse 6 лет назад 0
Лол, действительно, я делаю. Я ценю все, честно. ;) Правда, я просто рад, что это помогло хотя бы немного. знак равно Anaksunaman 6 лет назад 0
Это определенно помогло, ни один из 2 ответов напрямую не решил проблему. Но я больше программист (активно работаю над этим), поэтому, зная большую часть терминологии, я был разочарован, но сам не смог понять это. В конце концов мне удалось заставить его работать частично (2 недели назад или с помощью этих двух ответов), примерно через 1 минуту я решил вместо этого использовать nginx и удалил apache. Настройте все за 10 минут, практически без проблем. Так что я думаю, что я закончил с Apache (который хорошо служил мне более 9 лет). Xorifelse 6 лет назад 0

Похожие вопросы