Apache는 "NameVirtualHost" 및 "Listen"에 포트를 설정합니다.

Apache는 "NameVirtualHost" 및 "Listen"에 포트를 설정합니다.

ports.conf아파치 에서는

NameVirtualHost *:80
Listen 80

NameVirtualHost *:80별도의 Listen 80.

무슨 뜻이에요? 그들이 다르다면 어떨까요?

답변1

~에서아파치 웹사이트:

Listen 지시문은 가상 호스트를 구현하지 않습니다. 단지 주 서버에 수신 대기할 주소와 포트를 알려줄 뿐입니다. 지시문을 사용하지 않으면 서버는 허용된 모든 요청을 동일한 방식으로 처리합니다. 그러나 하나 이상의 주소나 포트에 대해 다른 동작을 지정하는 데 사용할 수 있습니다. VirtualHost를 구현하려면 먼저 사용할 주소와 포트를 수신 대기하도록 서버에 지시해야 합니다. 그런 다음 지정된 주소와 포트에 대한 해당 가상 호스트의 동작을 설정하기 위한 섹션을 만들어야 합니다. 서버가 수신하지 않는 주소와 포트를 설정하면 접속할 수 없으니 주의하세요.

Apache는 매우 유연합니다. 가장 기본적인 사용 방법은 가상 호스트를 사용하지 않는 것입니다. 가상 호스트를 사용하지 않는 경우 이 Listen지시어를 사용하여 사용할 네트워크 인터페이스와 포트를 지정할 수 있습니다. 기본적으로 http.conf 파일의 가상 호스트에서 지정할 수 있는 모든 옵션을 지정할 수 있습니다(마지막으로 확인했을 때 Apache.org가 패키지한 방식입니다).

VirtualHost지시문은 이 기본 동작을 재정의합니다. 이는 Apache에게 특정 IP 및 포트 조합을 다르게 처리하도록 지시합니다. Apache에 둘 다 없으면 가상 호스트를 사용해야 합니다. 이는 웹 호스팅이 처음 발명되었을 때 더 큰 문제였습니다. 당시의 브라우저는 이를 처리하는 방법을 몰랐고, 곧 모든 인기 브라우저에 지원이 추가되었지만 당시 많은 사람들은 계속해서 오래된 브라우저를 사용했습니다. 오래전부터 대부분의 Apache 배포판은 이제 더 유연하고 IP, 포트 또는 이름에 따라 다르게 응답할 수 있기 때문에 기본적으로 가상 호스트를 사용합니다.

가상 호스트가 있는 지금도 도메인에 대한 기본 구성을 지정할 수 있다는 사실은 유용합니다. 누군가 잘못된 하위 도메인 이름을 입력한 상황을 생각해 보세요. 기본 웹사이트가 있으므로 누군가가 이에 액세스하려고 할 때 이를 사용하여 사용자 정의 페이지\사이트를 표시할 수 있습니다.

그 반대도 사실일 수 있습니다. 원하는 경우 sites-enabled공유 폴더를 생성하고 서버별로 포트 구성 파일의 내용을 조정하여 여러 서버에 걸쳐 로드 균형을 조정할 수 있습니다.

그렇긴 하지만, Apache가 가상 호스트 구성에 따라 자동으로 설정하는 방법이 없는 것 같다는 것이 이상하다고 생각합니다.

재미삼아 이 작업을 자동으로 수행하는 스크립트를 작성했습니다. 원한다면 시도해 볼 수 있지만 거의 완전히 테스트되지 않았으므로 사용할 때 주의해야 함을 경고합니다. 이는 프로덕션 코드가 아님을 의미합니다.

<?php
$path=dirname(__FILE__); // The current file path. It is used so all other paths can reliably be set relatively.

$cfg=array(
   'output_file'=>"$path/var/ports.conf.out", // This is the file to be generated.
   'template_file'=>"$path/tpl_default.php",
   'glob_patterns'=>array( // This array contains a list of directories to search for virtual hosts in.
      "$path/test-enabled/*", // For now I'd just test some copies which you can play with. Once everything is
   ),   // good then you can change this to /etc/apache/sites-enabled

);

##############
define('IS_CLI', PHP_SAPI==='cli');

echo "Auto Vhost Script\n------------------\n\n";

//echo "Arguments: \n"; print_r(arguments($argv));

echo "Output File:\n\t{$cfg['output_file']}\n";
if(!isset($cfg['output_file'])||!is_writable(dirname($cfg['output_file'])))
   die("ERROR: Cannot write to output file.\n");

echo "Template File:\n\t{$cfg['template_file']}\n";
if(!isset($cfg['template_file'])||!is_readable(dirname($cfg['template_file'])))
   die("ERROR: Cannot read to template file.\n");

echo "Search Paths:\n";
foreach($cfg['glob_patterns'] as $pattern) {
   echo "\t$pattern\n";
}
echo "\nReading configuration files...\n";

$vhosts=array();
foreach($cfg['glob_patterns'] as $pattern) {
   echo ">> $pattern\n";
   $files=glob($pattern);
   foreach($files as $file) {
      echo "\t>> ". basename($file) ."\n";
      $handle=@fopen($file, "r");
      if($handle) {
         while(($buffer=fgets($handle, 4096))!==false) {
            $status=procLine($buffer);
            if(!$status) die("ERROR: Failed reading input line.\n");
            if($status===TRUE) continue;
            $vhosts[]=$status;
         }
         if(!feof($handle)) die("ERROR: Unexpected fgets() fail.\n");
         fclose($handle);
      }
   }
}
echo "\n\nGenerating template data...\n";
$nvhost=array();
$listen=array();
foreach($vhosts as $vhost) {
   // We're just going to assume that if you have multiple VirtualHost for the same port that means you want to use
   // *:port . You could improve this by actually checking to see if multiple hosts have been assigned to this port
   // but you'd need to rearrange the data a little.
   if($vhost['is_name']||isset($nvhost[$vhost['port']])) {
      $nvhost[$vhost['port']]='NameVirtualHost *:'.$vhost['port'];
      $listen[$vhost['port']]='Listen '.$vhost['port'];
   } else {
      $nvhost[$vhost['port']]='NameVirtualHost '.$vhost['host'].':'.$vhost['port'];
      if($vhost['host']=='*')
         $listen[$vhost['port']]='Listen '.$vhost['port'];
      else $listen[$vhost['port']]='Listen '.$vhost['host'].':'.$vhost['port'];
   }
}
echo "\n\nWriting output file...\n";

$tpl=file_get_contents($cfg['template_file']);
if($tpl) {
   $tpl=str_replace('{NAME_VHOST}', implode("\n", $nvhost), $tpl);
   $tpl=str_replace('{LISTEN}', implode("\n", $listen), $tpl);
   file_put_contents($cfg['output_file'], $tpl);
}

echo "\n\nDone.\n";

function procLine($line) {
   if(!preg_match("/^(\w)*<VirtualHost(.)*>(\w)*/", $line)) return true;
   $host=substr($line, strpos($line, 'VirtualHost')+12, strlen($line)-strrpos($line, '>')+2);
   $last_square=strrpos($host, ']'); // This is in case the host is specified in IPv6 format
   $cln=strrpos($host, ':');
   if($cln!==FALSE && $cln+1<strlen($host) && $cln>$last_square) {
      $port=substr($host, $cln+1);
      $host=substr($host, 0, $cln);
   } else $port='80';
   $is_range=strpos($host, '*')!==FALSE;
   $is_ip=$is_range||filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)!==FALSE;
   $is_name=!$is_ip;
   return array('host'=>$host, 'port'=>$port, 'is_name'=>$is_name, 'is_ip'=>$is_ip, 'is_range'=>$is_range);
}

설정해야 할 것은 $cfg스크립트 상단의 변수와 포트 프로필 템플릿뿐입니다. 이를 사용하려면 PHP: 로 실행하십시오 php path/to/auto_vhost.php. 일단 작동하게 되면 상단 근처에 PHP 호출을 추가할 수 있습니다(또는 실제로 약간 더 나은 호출이 있지만 /etc/init.d/apache2실제로 필요한 명령에서는 작동하지 않기 때문입니다). ). service apache2 stop이렇게 하면 Apache가 시작되거나 다시 시작되기 전에 스크립트가 실행되어 스크립트가 로드될 수 있습니다.

다음은 샘플 템플릿 파일입니다.

# This file was generated from a template by auto_vhost.php

{NAME_VHOST}

{LISTEN}

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

답변2

Listen 80이름 지정에 관계없이 실제로 포트 80에 소켓을 설정하도록 Apache에 지시합니다.

NameVirtualHost *:80소켓 설정과 관계없이 이 특정 주소/포트 소켓에 대해 지정된 가상 호스트 구성을 참조하도록 Apache에 지시합니다.

그들이 다르다면 어떨까요?

차이점은 구성이 손상되고 서버가 작동하지 않는다는 것입니다.

답변3

기본적으로 각 프로그램에는 포트가 필요하며 Kernel패킷은 다음을 통해 프로그램으로 전달됩니다.port numbers

Listen 80

내 아파치가 포트 80을 사용하고 싶다고 커널에 알립니다. des-port 80을 사용할 때 다음을 시도해 보세요.

root@debian:/home/mohsen# netstat -anp |egrep apache
tcp6       0      0 :::80                   :::*                    LISTEN      25791/apache2   

행을 변경하면 Listen netstat의 출력이 변경됩니다.

하지만, Virtualhosts:

포트와 충돌하지 않습니다. 자세한 내용은 VirtualHost by name읽고VirtualHost by IP

관련 정보