Назад | Перейти на главную страницу

Как сделать два домена для доступа к серверу и использовать две разные домашние страницы?

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

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 (varnish configuration).

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);
    }
 }

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

ОБРАТНЫЙ ХОСТ "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;
    }

}

Ошибка, которую вы получаете, предполагает, что 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 должен быть достаточно умным, чтобы разделять кеши по разным хостам.

Если вы используете 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 не сможет правильно различить. Может быть, есть способ получше, но это тоже работает.