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. Возможно ли это?
Нет, это невозможно. Два приложения не могут прослушивать один и тот же порт. Вы можете решить это двумя способами:
- Пусть Apache прослушивает порт 80, и прокси-сервер запрашивает app2.mydomain.com для nginx, прослушивает другой порт и обслуживает app1.mydomain.com.
- Напротив. Иметь прокси 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 по умолчанию используется первый виртуальный хост, если не указано иное.