如何让两个域名访问一台服务器并使用两个不同的主页?

如何让两个域名访问一台服务器并使用两个不同的主页?

我有一台 Digitalocean 服务器,上面有 ubuntu linux、nginx 1.4.6(运行在 80 端口)、varnish 3.0.5(运行在 8080 端口),我有两个域名,分别是 siteA.com 和 siteB.com。在 nginx 的 default.conf 中,我配置了前门(80)以 root 身份使用 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 使用相同的端口通过 2 个域访问同一个服务器。所以当我访问时:

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 配置) 中包含了这些后端行。

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 行指向域 A 或域 B,不起作用....因为是同一个 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

如果你正在使用 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;

  ...
}

如果将两个网站都缓存在 varnish 上,nginx 就无法正确区分。也许有更好的方法,但这种方法也行得通。

答案2

您收到的错误表明 siteB.com 有多个 IPv4 地址。不要使用 DNS 名称指定后端主机,只需使用 localhost 或 127.0.0.1。这可能会安抚 varnish,并消除可能导致延迟或(显然在本例中)出错的 DNS 查找。我自己对 varnish 不太熟悉,但我还认为您只需要指定一个后端(因为它实际上是这里的同一个框),并确保正确的主机标头能够传递到 nginx。说到这个……

您不需要设置任何其他代理。Nginx 很乐意让您指定两个监听同一端口的虚拟主机,并使用 server_name 指令匹配传入请求的主机标头。任何与已知 server_name 不匹配的请求都将被默认服务器块捕获,通常是第一个指定的服务器块,除非您使用 listen 指令上的 default_server 选项覆盖它。请参阅以下示例:

server {
  listen 8080;
  server_name siteA.com;

  ...
}

server {
  listen 8080 default_server;
  server_name siteB.com;

  ...
}

这里,两个服务器块都在监听端口 8080,并且 nginx 通过匹配主机标头来了解哪些请求是针对哪个站点的。如果它收到一个没有主机匹配的请求,它通常会将其传递给 siteA.com 的块作为第一个定义的块,但我们明确地通过声明 siteB.com 的块是该端口上请求的默认服务器来覆盖该行为。

由于您的 varnish 配置确保在将请求传递到后端之前设置适当的主机标头,因此这应该是您需要做的全部工作,以便从后端为多个站点提供服务。我本不应该认为在这种情况下您甚至需要在 varnish 中手动执行此操作,因为您不会覆盖标头;这似乎主要是为了规范化(即同时收集 www.site.com 和 site.com,这样您就不会缓存相同内容的两个副本)。我的阅读表明您也不需要指定多个后端,因为它是您正在查看的同一端口上的同一服务器。Varnish 应该足够智能,可以根据不同的主机分离缓存。

相关内容