Apache, PHP, Nodejs, работающие на Fedora, маршрутизация как на php, так и на nodejs в зависимости от выбранного домена
Я использую Digital Ocean droplet (возможно, это может быть полезной информацией для решения моей проблемы).
Моя конфигурация такова:
- Федора 22 [ссылка]
- Apache 2.4 [ссылка]
- PHP 5.6.11 [ссылка]
- MariaDB 10.0.20 [ссылка]
- phpMyAdmin 4.4.12 [ссылка]
- Узел 0.12.7 [ссылка]
Все вышеперечисленные приложения находятся по умолчанию "после установки". государство.
В настоящее время PHP работает на порту 80, nodejs работает на порту 3000. Поэтому я должен ввести:
-
mydomain.com
для php -
mydomain.com:3000
для узлов
Что бы я хотел сделать, так это:
Если я введу someDomainForPhp.com/
Я перехожу в расположение php по умолчанию, которое /var/www/html/
Если я введу otherDomainforNode.com/
Я перехожу в расположение узла по умолчанию, которое /root/
Итак, из того, что я понимаю, apache должен был бы выполнить некоторое перенаправление внутренних портов для достижения этой цели задача.
Я следил за многими руководствами в Интернете, описывающими, как это сделать, но я думаю, что они предназначены для людей, обладающих некоторыми базовыми знаниями по этому вопросу. Я чрезвычайно новичок и "зеленый" в этом, и я борюсь с этим.
Если кто-то готов помочь, я мог бы использовать следующую информацию:
- какие файлы редактировать
- где они находятся
- как их редактировать
- если необходимо установить какие-либо дополнительные модули, каковы их имена
ИЗМЕНИТЬ 03.08.2015
Я погуглил и попробовал следующим образом:
<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. Я также уверен, что все необходимые модули, такие как mod proxy, включены, я просмотрел документацию fedora 20 и проверил сервер статус, они по умолчанию включены и включены. Это действительно кажется странным, что для некоторых людей достаточно просто добавить строки выше. Для меня ничего из этого не сработало, я либо сталкиваюсь с ошибкой 503 и понятия не имею, как ее исправить, либо вообще не имею прокси. Я надеюсь, что кто-нибудь придет и поможет начинающему разработчику в беде;)
ИЗМЕНИТЬ 04.08.2015
Я проводил исследование и обнаружил, что у некоторых людей возникали проблемы, связанные с настройками chmod
, размещенными в каталогах, которые являются корневыми местоположениями для php и nodejs. Мне это показалось не очень логичным, но я все равно попробовал, я изменил (в целях тестирования) chmod, чтобы "разрешить все" настройки для всех каталогов, связанных с обоими приложениями. Это совсем не помогло.
Я также прочитал блог, в котором кто-то утверждал, что проблема может заключаться в том, что я включаю маршрутизацию прокси-сервера только на порт 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.
Прочитав, что я сделал, я думаю, что могу указать, где может быть проблема, но все же я мог бы воспользоваться помощью в отношении точного решения.
- может быть linux брандмауэр блокирует порт, отличный от 80 (в данном случае 3000), и, возможно, после добавления некоторого исключения в брандмауэр проблема будет решена
- может быть, мои узлы server.js сценарий неисправен
Это 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);
});
1 answers
Первые несколько слов объяснения:
Перед объявлением директивы
<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
. (если вы не вошли в систему как корневой тип 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>