httpd.conf를 사용하여 도메인 목록 만들기

httpd.conf를 사용하여 도메인 목록 만들기

웹 서버가 호스팅하는 Apache 구성 파일의 전체 도메인 목록이 포함된 파일을 생성할 수 있는 bash 스크립트를 생성하려고 합니다.

실제로는 꽤 쉬운 것 같습니다. 내가 보기에 ServerName과 ServerAlias는 이 목록을 생성하는 데 필요한 핵심 지시문입니다.

나를 혼란스럽게 하는 것은 여러 개의 별칭을 가질 가능성이 있다는 것입니다.

예시 항목입니다.

<VirtualHost IP_ADDR:PORT>
    ServerName domain-1.tld
    ServerAlias www.domain-1.tld
    DocumentRoot /home/domain-1.tld/public_html
    ServerAdmin [email protected]
    UseCanonicalName Off
    CustomLog /usr/local/apache/domlogs/domain-1.tld combined
    CustomLog /usr/local/apache/domlogs/domain-1.tld-bytes_log "%{%s}t %I .\n%{%s}t %O ."
</VirtualHost>

두 번째 항목입니다.

<VirtualHost IP_ADDR:PORT>
    ServerName domain-2.tld
    ServerAlias www.domain-2.tld some-other-domain.tld another-domain.tld
    DocumentRoot /home/domain-2.tld/public_html
    ServerAdmin [email protected]
    UseCanonicalName Off
    CustomLog /usr/local/apache/domlogs/domain-2.tld combined
    CustomLog /usr/local/apache/domlogs/domain-2.tld-bytes_log "%{%s}t %I .\n%{%s}t %O ."
</VirtualHost>

bash에서 이 목록을 생성하는 가장 좋은 접근 방식은 무엇입니까?

답변1

나는 당신이 그것에 대해 잘못된 길로 가고 있다고 생각합니다. VirtualHost의 파일(BTW는 어디에나 있을 수 있음)을 구문 분석하는 쉘 스크립트 대신 이를 수행하려면 Apache 자체 도구를 사용해야 합니다. 그 중 하나는apache2ctl status.

답변2

펄 모듈Config::GeneralApache conf 파일을 구문 분석할 수 있으므로 그렇게 할 수도 있습니다.

#!/usr/bin/perl
use strict;
use warnings;
use Config::General;

my %conf = Config::General->new('/path/to/config.conf')->getall();

for my $ip_port (keys %{$conf{VirtualHost}}) { 
    for my $vh (@{$conf{VirtualHost}{$ip_port}}) {
        if (exists $vh->{ServerName} and exists $vh->{ServerAlias}) {
            my $aliases = ref $vh->{ServerAlias} eq 'ARRAY'
                              ? join(",", @{$vh->{ServerAlias}}) 
                              : $vh->{ServerAlias};
            print $ip_port, "\t", $vh->{ServerName}, "\t", $aliases, "\n";
        }
    }
}

답변3

이 코드는 좀 보기 흉합니다. sed및 을 결합하면 한 줄에 하나의 도메인을 사용하여 한 줄의 도메인을 여러 줄로 awk추출할 수 있습니다.ServerAlias

# echo '                         ServerAlias         www.domain-2.tld         some-other-domain.tld  another-domain.tld' | awk '{print substr($0, index($0, $2))}'  | sed -e 's/\s\+/\n/g'
www.domain-2.tld
some-other-domain.tld
another-domain.tld

관련 정보