nginx и apache2 на одном сервере

У меня есть Ubuntu 16.04 с nginx и apache2. На этот компьютер есть две записи DNS A:

  • app1.mydomain.com
  • app2.mydomain.com

Мне нужно, чтобы app1.mydomain.com был разрешен с помощью apache, а app2.mydomain.com - с помощью nginx. Оба на порт 80. Возможно ли это?

Более того, apache должен обрабатывать 2 разных приложения (site1 и site2).

Мне бы хотелось:

  • app1.mydomain.com/site1 - должен быть разрешен apache и запустить приложение site1
  • app1.mydomain.com/site2 - должен быть разрешен с помощью apache и fire application site2
  • app2.mydomain.com - обслуживать приложение-призрак с помощью nginx

Это моя конфигурация Apache:

<VirtualHost *:80>
    ServerAdmin admin@mydomain.com

    ServerName app1.mydomain.com

    ServerAlias www.app1.mydomain.com

    ErrorLog /var/www/site1/logs/error.log

    CustomLog /var/www/site1/logs/access.log combined

    WSGIScriptAlias /api /var/www/site1/application/index.py/

    Alias /static /var/www/site1/application/static

    <Directory /var/www/site1/application>
            Order deny,allow
            Allow from all
    </Directory>

    AddType text/html .py

    ErrorLog /var/www/site2/logs/error.log
    CustomLog /var/www/site2/logs/access.log combined

    WSGIScriptAlias /site2 /var/www/site2/index.py/
    Alias /site2/uploads /var/sftp/site2/uploads/

    <Directory /var/www/site2/>
            Order deny,allow
            Allow from all
    </Directory>

Это мой конфигурационный файл NGINX:

server {
listen 8080;
listen [::]:8080;

server_name app2.mydomain.com;
root /var/www/ghost/system/nginx-root;

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:2368;

}
location ~ /.well-known {
    allow all;
}

client_max_body_size 50m;
}

2 ответа

Решение

Прежде всего. Apache и Nginx являются веб-серверами, а не DNS-серверами. Они ничего не решают. Этот вопрос не имеет ничего общего с DNS, но все с тем, как веб-серверы обрабатывают запросы.

Мне нужно, чтобы app1.mydomain.com был разрешен с помощью apache, а app2.mydomain.com - с помощью nginx. Оба на порт 80. Возможно ли это?

Нет, это невозможно. Два приложения не могут прослушивать один и тот же порт. Вы можете решить это двумя способами:

  1. Пусть Apache прослушивает порт 80, и прокси-сервер запрашивает app2.mydomain.com для nginx, прослушивает другой порт и обслуживает app1.mydomain.com.
  2. Напротив. Иметь прокси nginx для Apache.

Или - сделать оба хостинга на одном и том же веб-сервере. Apache и nginx во многих случаях взаимозаменяемы на техническом уровне, поэтому с точки зрения приложений это не должно иметь большого значения. По менеджменту они довольно разные.

Я отмечаю, что вы запускаете nginx на порту 8080, поэтому я предполагаю, что вы хотите использовать apache в качестве прокси. Затем создайте новый виртуальный хост для Apache, например /etc/apache2-sites-available/app2.mydomain.com.conf:

<VirtualHost *:80>
   DocumentRoot "/var/www"
   ErrorLog "logs/app2-error_log"
   CustomLog "logs/app2-access_log" common
   ServerName app2.mydomain.com
   ProxyRequests Off
   <Proxy *>
          Order deny,allow
          Allow from all
    </Proxy>
     Proxypass / http://localhost:8080/
</VirtualHost>

Тогда беги sudo a2enmod proxy_http; sudo a2ensite app2.mydomain.com; sudo service apache2 reload,

Это включит mod_proxy, mod_proxy_http и заставит apache пересылать любые запросы для VirtualHost app2.mydomain.com на nginx, который, согласно вашей конфигурации, работает на порту 8080.

Я не проверял этот конфиг, поэтому может потребоваться некоторая настройка.

В качестве обозначения: зачем вам nginx? В соответствии с настройкой nginx, он просто передает запрос на какой-либо другой веб-сервер, работающий через порт 2368. Вы можете прокси напрямую, используя apache...

mod_proxy -documentation может быть полезен при его настройке.

Судя по содержанию вашего вопроса, у вас уже есть решение, за исключением того, что вы можете получить доступ только к одному приложению на порт №. Вы не можете запустить Apache2 и Nginx на одном и том же порту. Это невозможно.

Поскольку вы упомянули, у вас уже работает DNS и он указывает на правильный компьютер (IP). Вы можете добраться до вашего app1.mydomain.com по умолчанию (port 80) с:

http://app1.mydomain.com

Это так же, как

http://app1.mydomain.com:80

Вам нужно будет указать порт для вашего Nginx, который вы установили в своем конфигурационном файле для port 8080,

Используйте это для доступа к вашему сайту1:

http://app1.mydomain.com:8080

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

Другие вопросы по тегам