Apache2 с SSL я должен копировать блоки VirtualHost?

18

В Apache2 на Ubuntu мой сайт слушает 80, и теперь я хочу добавить SSL. Есть ли способ включить SSLEngine для порта 443, чтобы мне не нужно было копировать весь блок VirtualHost?

Когда я делаю это:

Listen 80
Listen 443
NameVirtualHost *
<VirtualHost *>
  SSLEngine On
  ... a bunch more lines...
</VirtualHost>

Он включает SSLEngine для порта 80. Есть ли способ использовать только один блок VirtualHost и включить только SSLEngine для порта 443? Так что я могу сделать что-то подобное?

Listen 80
Listen 443
NameVirtualHost *
<VirtualHost *>
   <IfPort 443>
      SSLEngine On
   </IfPort>
   ... a bunch of lines I don't want to copy into another VirutalHost block...
</VirtualHost>
Дар
источник

Ответы:

14

Вы не можете заставить один vhost выполнять оба HTTP и HTTPS, потому что они являются отдельными vhosts, обслуживающими отдельные протоколы. Вместо этого вы должны поместить всю общую конфигурацию в отдельный файл, а затем включить этот файл в файлы SSL и не-SSL для домена.

Минимальный пример:

# /etc/apache2/sites-available/example.com
<VirtualHost *:80>
  Include /etc/apache2/domains/example.com
</VirtualHost>

<VirtualHost 192.0.2.1:443>
  SSLEngine On
  SSLCertificateFile /etc/ssl/example.com_crt
  SSLCertificateKeyFile /etc/ssh/example.com_key

  Include /etc/apache2/domains/example.com
</VirtualHost>

# /etc/apache2/domains/example.com
ServerName example.com
ServerAlias www.example.com

ServerAdmin webmaster@example.com
DocumentRoot /home/example/public_html
ErrorLog /home/example/apache/error.log
romble
источник
Можете ли вы дать мне краткий пример того, как файл должен выглядеть? Нужна ли ему оболочка VirtualHost или я должен просто переместить все строки в нее без какой-либо оболочки?
Дар
1
Я добавил пример к своему ответу.
womble
1

Как я уже упоминал в другом вопросе о stackoverflow ( /programming/679383/do-i-have-to-duplicate-the-virtualhost-directives-for-port-80-and-443/52375167# 52375167 ):

Вместо использования Includeиспользуется другая опция Macro(так что вы можете хранить все это в одном файле).

Сначала включите модуль макроса:

a2enmod macro

Затем поместите ваши общие вещи в макрос и useэто из ваших виртуальных хостов:

<Macro SharedStuff>
   ServerName example.com
   ServerAdmin example@example.com
   <DocumentRoot /var/www/example>
      ...
   </DocumentRoot>
</Macro>

<VirtualHost *:80>
  Use SharedStuff
</VirtualHost>

<VirtualHost *:443>
  Use SharedStuff

  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3
  ...
</VirtualHost>

Макросы также могут принимать параметры и быть определены в других включенных файлах; так что вы можете использовать их немного как функции и сохранить много дубликатов в ваших конфигурационных файлах Apache.

Смотрите здесь для более подробной информации:

https://httpd.apache.org/docs/2.4/mod/mod_macro.html

Себ
источник
0

Вы можете поместить настройки каталога в <Directory>блок вне любых <VirtualHost>блоков. Это будет применять их ко всем виртуальным хостам, но только внутри указанного пути.

DanMan
источник