SSL을 사용하는 Apache2 VirtualHost 블록을 복사해야합니까? 80에 대해 SSLEngine을 켜고 있습니다. 하나의 VirtualHost

우분투의 Apache2에서는 80을 청취하는 사이트가 있으며 이제 SSL을 추가하려고합니다. 전체 VirtualHost 블록을 복사 할 필요가 없도록 포트 443에 대해 SSLEngine을 활성화하는 방법이 있습니까?

내가 이것을 할 때 :

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

포트 80에 대해 SSLEngine을 켜고 있습니다. 하나의 VirtualHost 블록 만 사용하고 포트 443에 대해서만 SSLEngine을 켜는 방법이 있습니까? 그래서 이런 식으로 할 수 있습니까?

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 및 비 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 : //.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>. 그러면 모든 가상 호스트에 적용되지만 지정된 경로 내부에만 적용됩니다.