Apache2 VirtualHost IfPort?

Apache2 VirtualHost IfPort?

다음과 같은 가상 호스트를 만들고 싶습니다.

<VirtualHost *:80 *:443>
    <IfPort 443>
        SSLEngine On
        ...
    </IfPort>

    ...
</VirtualHost>

따라서 포트 443을 통해 호스트에 액세스한 경우 몇 가지 추가 기능을 추가하고 싶습니다. 어떻게든 이를 달성할 수 있습니까? 아니면 이를 2개의 가상 호스트로 분리해야 합니까?

답변1

나는 mod_macro수많은 다른 도메인을 호스팅하는 서버에서 이 문제를 해결하는 데 사용합니다... 모듈을 설치하고(OS/Distro에 따라 다름) 다음과 같이 구성합니다.

LoadModule macro_module         libexec/apache22/mod_macro.so

<Macro VHost $host>
        <VirtualHost *:80>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost> 
</Macro>

<Macro VHostSSL $host>
        <VirtualHost *:80>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost>
        <VirtualHost *:443>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                SSLEngine on
                SSLCertificateFile /usr/local/www/$host/ssl/$host.crt
                SSLCertificateKeyFile /usr/local/www/$host/ssl/$host.key

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost> 
</Macro>

Use VHostSSL example.com 
Use VHost    example.net

새 도메인을 추가하는 것은 매우 쉽습니다. 모든 도메인별 구성은 포함 파일에 포함됩니다.

답변2

John의 솔루션을 사용하면 이것을 얻습니다.

Apache 2 is starting ...
AH00526: Syntax error on line 53 of .../httpd-vhosts.conf:
SSLEngine not allowed here

John이 말했듯이 가장 좋은 방법은 2개의 가상 호스트를 갖는 것입니다. 그러나 각 코드 중 2개(및 매우 긴 구성 파일)를 갖고 싶지 않았기 때문에 내 가상 호스트 코드는 150줄이 넘었습니다(많은 역방향 프록시). 나는 결국 작동하는 이 작업을 수행했습니다.

1. SSL이 아닌 가상 호스트에 대한 가상 호스트를 생성합니다.

2. 다른 가상 호스트를 생성하고 첫 번째 가상 호스트에 대한 역방향 프록시를 만듭니다.

<VirtualHost *:443>
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile "...cert.crt"
    SSLCertificateKeyFile "...server.ssl.key"
    ... (any ssl specific config)

    ProxyPreserveHost On
    ProxyPass / http://localhost:80/
    ProxyPassReverse http://localhost:80/ http://yourdomain.com/
</VirtualHost>

이것은 전혀 좋지 않거나 성능 친화적인 솔루션은 아니지만 2개의 가상 호스트를 원하지 않는 이유가 모든 가상 호스트 구성의 2개 버전(무언가를 변경하려고 할 때마다 2줄을 변경하는 것을 의미함)을 방지하기 위한 것이라면 이 방법이 효과적입니다.

답변3

중복을 피하는 또 다른 옵션은 virtualhost 구성을 특정 파일에 유지하고 포함을 사용하여 가져오는 것입니다.

/etc/path/to/config/example.com.conf:

ServerName example.com.conf
DocumentRoot /var/www/something
# Any other config you want to apply to both vhosts

그리고 가상 호스트 파일은 다음과 같습니다.

<VirtualHost *:443>
    SSLEngine on
    # Other SSL directives
    Include /etc/path/to/config/example.com.conf
</VirtualHost>
<VirtualHost *:80>
    Include /etc/path/to/config/example.com.conf
</VirtualHost>

답변4

Apache 구조를 살펴보고 If요청을 조작하십시오. 보다Ifs 의 핵심 문서그리고사용할 수 있는 표현 목록. 다음과 같이 할 수 있습니다.

<If "%{SERVER_PORT} == '443'">
    # Do stuff
</If>

귀하의 VirtualHost태그와 관련하여 Apache2 문서에는 그러한 솔루션이 표시되지 않습니다. 보다http://httpd.apache.org/docs/2.2/en/vhosts/examples.html#port옵션을 시도해 보십시오. Apache2는 다른 포트 대신 다른 IP에 대해 유사한 포트를 사용합니다(http://httpd.apache.org/docs/2.2/en/vhosts/examples.html#intraextra).

나는 훨씬 더 명확하게 2개의 개별 가상 호스트를 사용하는 것을 권장합니다. 어쨌든 파일 에 두 NameVirtualHost개가 필요합니다 .Listenapache2.conf

편집하다

이 솔루션이 실제로 오류를 발생시켰다는 것을 깨닫지 못했지만 개념 자체로 돌아가 보겠습니다. 80 또는 443을 듣는 것은 실제로 문제가 없습니다. 암호화가 아니라면 Apache2는 이를 위한 우아한 솔루션을 기꺼이 제공할 것입니다. Apache2는 C로 개발되었으며 스레드와 포크를 넘어 소켓을 사용합니다. C에서 SSL을 사용하려면 OpenSSL 구성 요소의 초기화가 필요하며 일부는 기본 소켓을 사용하여 전체 SSL을 구현합니다. 쉬운 솔루션을 찾고 있지만 뒤에 있는 전체 메커니즘이 까다롭습니다... 그렇기 때문에 기본 가상 호스트에서는 SSL을 활성화할 수 없습니다. HTTP와 HTTP는 서로 다른 구성 요소이며 Apache2 방식에서는 다음과 같은 문제가 있습니다. 첫 번째와 두 번째 사이에는 상속 개념이 없습니다.

관련 정보