Apache, PHP, Nodejs, работающие на Fedora, маршрутизация как на php, так и на nodejs в зависимости от выбранного домена


Я использую Digital Ocean droplet (возможно, это может быть полезной информацией для решения моей проблемы).

Моя конфигурация такова:

Все вышеперечисленные приложения находятся по умолчанию "после установки". государство.

В настоящее время 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);
});
Author: Cœur, 2015-08-02

1 answers

Первые несколько слов объяснения:

  1. Перед объявлением директивы <VirtualHost> вам необходимо добавить NameVirtualHost *. Вместо * вы можете точно определить, на какой домен/ip вы ссылаетесь. *, конечно, будет работать, но считается, что это менее безопасно и медленнее.

  2. Чтобы разрешить передачу прокси-сервера - вам нужно определить директиву <Proxy>, и единственная проблема с вашим определением - Allow from all. Этот синтаксис предназначен для apache 2.2, вы используете apache 2.4, поэтому в соответствии с расширяющимися документами это следует использовать вместо Require all granted.

  3. <Location> теги в вашем случае должны быть такими же, как и в начале, только с одной косой чертой <Location />. Причина в том, что вы not получаете доступ к своему приложению через дополнительное пространство имен, вы получаете к нему доступ, введя прямое доменное имя.

  4. Если вы хотите получить доступ к файлам 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>
 0
Author: , 2015-08-05 09:05:58