Порты установки Apache и в “NameVirtualHost” и “Слушают”

stat доступно для solaris в gnucore пакете.

3
17.08.2016, 14:27
3 ответа

Listen 80 говорит Apache на самом деле настраивать сокет на порте 80, не имеет никакого отношения к именованию.

NameVirtualHost *:80 говорит Apache относиться к именованным конфигурациям vhost для этого конкретного сокета адреса/порта, не имеет никакого отношения к установке сокета.

Что было бы то, если бы они были differents?

Различием была бы Ваша конфигурация, будет поврежден, и Ваш сервер не работал бы.

2
27.01.2020, 21:16

Каждая программа потребностью по умолчанию к порту и Kernel пакеты отправки к программам через port numbers когда Вы говорите:

Listen 80

Вы говорите ядру, что мой апач хочет использовать порт 80, когда Вы добираетесь с des-портом 80, дают мне..., если Вы пробуете:

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

Когда Вы изменились Listen строка, ouput netstat будет изменен.

Но, Virtualhosts:

Это не конфликтует порт для большего количества чтения деталей о VirtualHost by name и VirtualHost by IP

1
27.01.2020, 21:16

С веб-сайта Apache:

Слушать директива не реализует Виртуальные Хосты - она только говорит основному серверу что адреса и порты слушать на. Если никакие директивы не будут использоваться, то сервер будет вести себя таким же образом для всех принятых запросов. Однако может использоваться для определения другого поведения для одного или нескольких адресов или портов. Для реализации VirtualHost серверу нужно сначала сказать слушать адрес и порт, который будет использоваться. Затем раздел должен быть создан для указанного адреса и порта для установки поведения этого виртуального хоста. Обратите внимание, что, если установлен для адреса и порта, который не слушает сервер, к нему нельзя получить доступ.

Apache очень гибок. Самый основной способ использовать его без виртуальных хостов. Если Вы не используете виртуальные хосты, можно использовать Listen директива для определения, который сетевые интерфейсы и порты для использования. Можно указать в основном каждую опцию, которая может быть указана в виртуальном хосте прямо в http.conf файле (который является, как Apache.org упаковывает его в последний раз, я проверил BTW).

VirtualHost директивы являются переопределениями для этого поведения по умолчанию. Они говорят Apache рассматривать определенный IP и комбинации портов по-другому. Если бы Apache не имел обоих затем, что необходимо было бы использовать виртуальные хосты. Это раньше было большей проблемой, когда виртуальные хосты были сначала изобретены. В то время, когда браузеры не знали, как обработать их и даже при том, что поддержка была добавлена ко всем популярным браузерам вскоре после, многие люди продолжали использовать устаревшие браузеры в то время. Поскольку это было давным-давно, большинство дистрибутивов Apache теперь использует виртуальные хосты по умолчанию, потому что они более гибки и позволяют ответить по-другому в зависимости от IP, порта или имени.

Даже сейчас то, что у нас есть виртуальные хосты, то, что мы можем указать, конфигурация по умолчанию для нашего домена полезна. Рассмотрите случай, где кто-то вводит недопустимое sub доменное имя. Так как у нас есть веб-сайт по умолчанию, мы можем использовать его для показа пользовательского page\site, когда кто-то пытается получить доступ к нему.

Обратный тип ситуации мог также быть верным. Если бы Вы хотели Вам, то мог бы сделать 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
27.01.2020, 21:16

Теги

Похожие вопросы