Привязать ко всем интерфейсам для IPv4 и IPv6 в haproxy

Я хочу настроить haproxy для привязки к tcp , а также ] tcp6 сокет на всех интерфейсах (например, 0.0.0.0:80 и ::: 80 ).

Мне удалось достичь этой цели со следующими настройками :

listen web
  bind :80 v4v6
  bind :::80 v6only

Есть ли более короткий способ, чем этот?

Хотя я ожидаю, что он будет вести себя иначе, ключевое слово v4v6 заставляет haproxy связываться только с сокетом v4. У меня два домена, скажем siteA.com и siteB.com. В default.conf of ...

У меня есть сервер Digitalocean с ubuntu linux, nginx 1.4.6 (работает на порту 80), varnish 3.0.5 (работает на порту 8080 вместе) У меня два домена, скажем siteA.com и siteB.com. В default.conf nginx я настроил так, чтобы входная дверь (80) использовала папку siteA как root, код:

server {
    listen *:8080 default_server;

    root /home/sitea;
    index index.html index.htm index.php;

    server_name IP_domain_siteA;

    location / {
    autoindex on;
        autoindex_exact_size off;
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
    # Uncomment to enable naxsi on this location
    # include /etc/nginx/naxsi.rules
     }    

     location ~ \.php$ {
        try_files $uri =404;
        expires off;
        fastcgi_read_timeout 900s;
        fastcgi_index index.php;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

}

, но я хочу, чтобы SiteB использовал один и тот же порт для доступа с использованием двух доменов к одному и тому же серверу. поэтому, когда я получаю доступ:

siteA.com => carry my server folder:
/home/siteA/index.php
siteB.com => carry the same server folder (same ip as well):
/home/siteB/index.html

Как мне это делать? Я уже пробовал все, даже включая эти бэкэнд-строки в default.VCL (конфигурация лака).

backend siteA{
     .host = "sitea.com";
     .port = "8080";
 }
 backend siteB{
      .host = "siteb.com";
      .port = "8080";
 }
 sub vcl_recv {
    if (req.http.host == "sitea.com") {
        #You will need the following line only if your backend has multiple virtual host names
        set req.http.host = "sitea.com";
        set req.backend = siteA;
        return (lookup);
    }
    if (req.http.host == "siteb.com") {
        #You will need the following line only if your backend has multiple virtual host names
        set req.http.host = "siteb.com";
        set req.backend = siteB;
        return (lookup);
    }
 }

Это не решено, оно возвращает мне ошибку:

BACKEND HOST "siteB.com": разрешает несколько адресов IPv4. Только разрешен один адрес.

Я уже использую виртуальных хостов , для других папок с nginx, но это возможно только для изменения ПОРТОВ, строка server_name, направленная на domainA или domainB, не работает .... потому что такой же IP

Что можно у кого-нибудь есть предложения? спасибо

РЕДАКТИРОВАТЬ 1:

Конфигурация nginx для обоих сайтов находится здесь (siteA):

server {
  listen *:8080 default_server;
  root /var/www/public/sitea;
  try_files $uri $uri/ @handler;
  index index.php index.html index.htm;

  # Make site accessible from http://localhost/
##domain address 1 of server...
server_name www.sitea.com.br sitea.com.br;  
  #location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    #try_files $uri $uri/ =404;
    # Uncomment to enable naxsi on this location
    # include /etc/nginx/naxsi.rules
  #}

  ## These locations would be hidden by .htaccess normally
      location ^~ /app/                { deny all; }
    location ^~ /includes/           { deny all; }
    location ^~ /lib/                { deny all; }
      location ^~ /media/downloadable/ { deny all; }
      location ^~ /pkginfo/            { deny all; }
      location ^~ /report/config.xml   { deny all; }
      location ^~ /var/                { deny all; }

      location /var/export/ { ## Allow admins only to view export folder
          auth_basic           "Restricted"; ## Message shown in login window
          auth_basic_user_file htpasswd; ## See /etc/nginx/htpassword
          autoindex            on;
      proxy_read_timeout 150;
    }

  error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/html;
  }

  location @handler { ## Magento uses a common front handler
         rewrite / /index.php;
      }

      location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
           rewrite ^(.*.php)/ $1 last;
      }


  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  #
  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_read_timeout 120;
    include fastcgi_params;
  }


}

другой сайт (siteB):

server {
    listen 8090;

    client_max_body_size 20M;
    root /var/www/public/siteb;
    index index.html index.htm index.php;

    ##domain address 2 of server...
    server_name www.siteb.com.br siteb.com.br;

    location / {
        autoindex on;
        try_files $uri $uri/ /index.php?q=$request_uri;
        autoindex_exact_size off;
        proxy_pass http://localhost:8080;
     }

     location ~ \.php$ {
        #try_files $uri =404;
        expires off;
        fastcgi_read_timeout 900s;
        fastcgi_index index.php;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

}
1
задан 11 January 2016 в 11:03
2 ответа

Если вы используете Varnish, вы можете настроить очистку на дополнительном веб-сайте, например, в default.vcl:

acl purge {
  "localhost";
  "127.0.0.1";
  "siteb.com";
}

и в конфигурации nginx:

server {
  listen 8080 default_server;
  server_name sitea.com;

  ...
}

server {
  listen 8080;
  server_name siteb.com;

  ...
}

Если вы кешируете оба веб-сайта в лаке, nginx не может правильно различать. Может быть, есть способ получше, но он тоже работает.

1
ответ дан 3 December 2019 в 20:43

Полученная вами ошибка предполагает, что siteB.com имеет несколько адресов IPv4. Вместо того, чтобы указывать серверные хосты с использованием имени DNS, просто используйте localhost или 127.0.0.1. Это может успокоить лак и исключает поиск DNS, который может вызвать задержки или (по-видимому, как в этом случае) пойти не так. Я сам не слишком знаком с лаком, но я бы дополнительно подумал, что вам нужно указать только один бэкэнд (поскольку это фактически тот же самый блок здесь) и просто убедиться, что правильные заголовки хоста проходят через nginx . Кстати, о том ...

Больше не нужно настраивать прокси. Nginx с радостью позволит вам указать два виртуальных хоста, прослушивающих один и тот же порт, и будет использовать директиву server_name для сопоставления с заголовком хоста входящих запросов. Любые запросы, которые не соответствуют известному server_name, будут перехвачены серверным блоком по умолчанию, обычно тем, который указан первым, если вы не переопределите это с помощью опции default_server в директиве listen. См. Следующий пример:

server {
  listen 8080;
  server_name siteA.com;

  ...
}

server {
  listen 8080 default_server;
  server_name siteB.com;

  ...
}

Здесь оба серверных блока прослушивают порт 8080, и nginx знает, какие запросы относятся к какому сайту, путем сопоставления заголовка хоста. Если он получает запрос, для которого нет совпадения с хостом, он обычно передает его в блок для siteA.com в качестве первого определенного блока, но мы специально переопределяем это поведение, объявляя блок для siteB.com по умолчанию. сервер для запросов на этот порт.

Поскольку ваша конфигурация varnish гарантирует, что вы устанавливаете соответствующие заголовки хоста, прежде чем он будет передавать запросы на бэкэнд, это должно быть все, что вам нужно сделать для обслуживания нескольких сайтов с него. Я не должен был думать, что вам даже нужно будет делать это вручную в лаке в этом случае, так как иначе вы не перезаписываете заголовки; в основном это, похоже, делается для нормализации (т. е. собирает вместе www.site.com и site.com, чтобы не кэшировать две копии одного и того же). Мое чтение подсказывает, что вам не нужно указывать несколько бэкэндов,поскольку это тот же сервер на том же порту, на который вы смотрите. Varnish должен быть достаточно умным, чтобы разделять кеши на разных хостах.

1
ответ дан 3 December 2019 в 20:43

Теги

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