Я хочу обслуживать несколько различных приложений ruby on rails, используя Apache и Пассажир через единый домен. Все приложения должны использовать один и тот же сертификат и Я хочу доставлять приложения, использующие HTTPS по умолчанию.
# single domain
domain.example.com
# applications accessible via branches
domain.example.com/app_one
domain.example.com/app_two
У меня есть следующая конфигурация для каждого из приложений, которая отлично работает однако только для обслуживания одного приложения. Когда я включаю несколько конфигураций сайта Apache, первое приложение в алфавитном порядке ответит, а остальные не работают.
#app_one.conf
<VirtualHost *:80>
ServerName domain.example.com/app_one
Alias /app_one /var/www/app_one/public
DocumentRoot /var/www/app_one/public
PassengerRuby /usr/local/rvm/gems/ruby-2.3.8/wrappers/ruby
<Directory /var/www/app_one/public>
Allow from all
Options -MultiViews
Require all granted
</Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain.example.com/app_one
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
#app_one-secure.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName domain.example.com/app_one
Alias /app_one /var/www/app_one/public
DocumentRoot /var/www/app_one/public
PassengerRuby /usr/local/rvm/gems/ruby-2.3.8/wrappers/ruby
<Directory /var/www/app_one/public>
Allow from all
Options -MultiViews
Require all granted
</Directory>
SSLCertificateFile /etc/encrypt/cert.pem
SSLCertificateKeyFile /etc/encrypt/key.pem
SSLCertificateChainFile /etc/encrypt/keychain.pem
Include /etc/encrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Я также заставил приложения rails реагировать на отдельные подветвления:
# rails app config.ru
map '/app_one' do
run AppName::Application
end
Я думаю, мне нужно сделать подветвь конфигурации зависимой. Однако я понятия не имею, как это сделать. Я также попытался упаковать конфигурацию в блок Location
. Однако это ограничительно и не принимает всю мою конфигурацию. В конце концов я снова вернул это, так как моя конфигурация была недействительной. Было бы здорово, если бы вы помогли мне разобраться в этом.
Наконец-то я нашел практически работающее решение. Для всех, кто преследует ту же цель. Сейчас я использую только два файла конфигурации. Один для http по умолчанию и один для https. Однако остается одна проблема. Apache всегда обслуживает из той же папки ресурсов, поскольку пассажир выбирает их из корневой информации документа. Я понятия не имею, как предотвратить это.
# 000-default.conf
<VirtualHost *:80>
# general setup
# name of the server
ServerName my.server.com
# ruby for passenger
PassengerRuby /usr/local/rvm/gems/ruby-2.3.8/wrappers/ruby
# the default document root which is delivered for the server name
DocumentRoot /var/www/apps/app_one/public
# instance setup
## app_one
Alias /app_one /var/www/apps/app_one/public
<Location /app_one>
PassengerBaseURI /app_one
PassengerAppRoot /var/www/apps/app_one
</Location>
<Directory /var/www/apps/app_one/public>
Allow from all
Options -MultiViews
Require all granted
</Directory>
## app_two
Alias /app_one /var/www/apps/app_two/public
<Location /app_two>
PassengerBaseURI /app_two
PassengerAppRoot /var/www/apps/app_two
</Location>
<Directory /var/www/apps/app_two/public>
Allow from all
Options -MultiViews
Require all granted
</Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =my.server.com/app_one
RewriteCond %{SERVER_NAME} =my.server.com/app_two
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
# 000-defaults-https.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
<VirtualHost *:80>
# general setup
# name of the server
ServerName my.server.com
# ruby for passenger
PassengerRuby /usr/local/rvm/gems/ruby-2.3.8/wrappers/ruby
# the default document root which is delivered for the server name
DocumentRoot /var/www/apps/app_one/public
# instance setup
## app_one
Alias /app_one /var/www/apps/app_one/public
<Location /app_one>
PassengerBaseURI /app_one
PassengerAppRoot /var/www/apps/app_one
</Location>
<Directory /var/www/apps/app_one/public>
Allow from all
Options -MultiViews
Require all granted
</Directory>
## app_two
Alias /app_one /var/www/apps/app_two/public
<Location /app_two>
PassengerBaseURI /app_two
PassengerAppRoot /var/www/apps/app_two
</Location>
<Directory /var/www/apps/app_two/public>
Allow from all
Options -MultiViews
Require all granted
</Directory>
SSLCertificateFile /etc/encrypt/cert.pem
SSLCertificateKeyFile /etc/encrypt/key.pem
SSLCertificateChainFile /etc/encrypt/keychain.pem
Include /etc/encrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>