Назад | Перейти на главную страницу

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

В 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>

Вы не можете заставить один виртуальный хост одновременно использовать HTTP и HTTPS, потому что это отдельные виртуальные хосты, обслуживающие разные протоколы. Вместо этого вы должны поместить всю общую конфигурацию в отдельный файл, а затем включить этот файл как в SSL, так и в vhosts без 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

Как я уже упоминал по другому вопросу о stackoverflow (https://stackoverflow.com/questions/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

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