Я использую дроплет Digital Ocean (возможно, это может быть полезной информацией для решения моей проблемы).
Мой конфиг это:
Все вышеперечисленные приложения находятся в состоянии по умолчанию «после установки».
В настоящее время PHP работает на порте 80, nodejs работает на порте 3000. Поэтому мне нужно набрать:
mydomain.com
для phpmydomain.com:3000
для nodejsТо, что я хотел бы сделать, это:
если я войду someDomainForPhp.com/
Я захожу в php местоположение по умолчанию, которое /var/www/html/
если я войду otherDomainforNode.com/
Я иду в узел по умолчанию, который является /root/
Итак, насколько я понимаю, Apache должен был бы выполнить перенаправление внутреннего порта для выполнения этой задачи.
Я следил за многими руководствами в Интернете, описывающими, как это сделать, но я думаю, что они предназначены для людей, которые имеют некоторые базовые знания по этому вопросу. Я чрезвычайно нов и «зелен» к этому, и я борюсь с этим.
Если кто-то готов помочь, я мог бы использовать следующую информацию:
Я погуглил и попробовал следующий способ:
<VirtualHost 109.74.199.47:80> # server ip address or *
ServerAdmin [email protected] # any email address
ServerName thatextramile.be # domain name
ServerAlias www.thatextramile.be # any domain alias
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
</VirtualHost>
Я положил это в этот файл /etc/httpd/conf/httpd.conf
в самом низу. Многие люди сообщили, что этот метод работал для них, однако, если я попробовал это, я получил 503 error
при доступе к домену. Так что я погуглил эту ошибку 503 и обнаружил, что у какого-то парня была похожая проблема, и он утверждал, что заставил ее работать, модифицировав Location
теги следующим образом:
<Location /path/of/my/project> # for me it would be /root/
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
Когда я попробовал это, сервер действовал так, как будто не было никакой директивы виртуального хоста, при доступе к домену, который мне обслуживался с моим обычным /var/www/html/index.php
файл из apache, без прокси, без изменения порта.
Я также читал, что localhost это плохой путь, он должен быть 127.0.0.1
Однако это ничего не меняет.
Я не изменил никакой конфигурации по умолчанию, я только добавил директиву virtualhost в httpd conf. Я также уверен, что все необходимые модули, такие как мод-прокси, включены, я искал документацию по fedora 20 и проверил состояние сервера, они по умолчанию включены и включены. Это действительно кажется странным, что для некоторых людей достаточно просто добавить вышеуказанные строки. У меня ничего не получалось, я либо сталкиваюсь с ошибкой 503 и не знаю, как это исправить, либо не имею прокси-сервера вообще. Я надеюсь, что кто-нибудь придет и поможет начинающему разработчику в беде;)
Я проводил исследования и обнаружил, что у некоторых людей возникают проблемы, связанные с chmod
Настройки размещены в каталогах, которые являются корневыми каталогами для php и nodejs. Это не показалось мне очень логичным, но я все равно попробовал, я изменил (для целей тестирования) chmods, чтобы «разрешить все» конфигурации для всех каталогов, связанных с обоими приложениями. Это не помогло вообще.
Я также читал блог, где кто-то утверждал, что проблема может заключаться в том, что я включаю только прокси-маршрутизацию на порт 3000, и я не создал правило для отображения обычного php. Учебник показал, что помимо правила, созданного для nodejs, оно также должно содержать следующее:
<VirtualHost 109.74.199.47:80> # server ip address or *
ServerAdmin [email protected] # any email address
ServerName thatextramile.be # domain name
ServerAlias www.thatextramile.be # any domain alias
DocumentRoot /var/www/html/
</VirtualHost>
Итак, первое правило для маршрутизации на порт 3000 для nodejs, а это работает для php. Проблема в том, что когда я реализовал это правило, у меня был бесконечный цикл, и сервер никогда не загружался. Так что у меня ошибка 503, когда я вхожу в домен, подготовленный для nodejs, и у меня ошибка 502, когда я пытаюсь получить доступ к домену для php.
После прочтения я думаю, что могу указать, где может быть проблема, но все же я мог бы использовать помощь относительно точного решения.
Это файл server.js для тестирования. Он запускается бесконечно с использованием модуля node forever:
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
Первые несколько слов объяснения:
Перед объявлением <VirtualHost>
директива, которую вы должны добавить NameVirtualHost *
, Вместо *
Вы можете точно определить, на какой домен / IP вы ссылаетесь. *
Конечно, будет работать, но он считается менее безопасным и медленным.
Чтобы разрешить передачу прокси — вам нужно определить директиву <Proxy>
и единственная проблема с вашим определением Allow from all
, Этот синтаксис для Apache 2.2, вы используете Apache 2.4, так что в соответствии с перечитывание документов это следует использовать вместо Require all granted
,
<Location>
теги в вашем случае должны быть такими же, как в начале, только с одной косой чертой <Location />
, Причина в том, что вы not
получая доступ к вашему приложению через дополнительное пространство имен, вы получаете доступ к нему, вводя прямое доменное имя.
Если вы хотите получить доступ к файлам php через порт 80
с phpdomain.com
и сервер node.js на порт 3000
с nodejsdomain.com
тогда вы должны not
создать 2 виртуальных хоста. Вы создаете только один, в случае если вы вводите nodejsdomain.com
откроет порт 3000. Вам понадобятся вторые и более виртуальные хосты, только если вы будете использовать больше серверов node.js или других платформ. Из-за того, что вы его создали, вы оказались в бесконечном цикле.
main
причина, по которой ваш прокси не работает, из-за порта 3000, который по умолчанию заблокирован на SELinux
, Итак, сначала запустите эту команду semanage port -a -t http_port_t -p tcp 3000
, (если вы не вошли как root-тип sudo
перед синтаксисом выше).
и затем используйте директиву виртуального хоста:
NameVirtualHost *
<VirtualHost *:80>
ServerName nodejsdomain.com
ProxyRequests off
<Proxy *>
Require all granted
</Proxy>
<Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
</VirtualHost>
Других решений пока нет …