1 votes

Comment faire en sorte que deux domaines puissent accéder à un serveur et utiliser deux pages d'accueil différentes ?

J'ai un serveur Digitalocean avec ubuntu linux, nginx 1.4.6 (fonctionnant sur le port 80), varnish 3.0.5 (fonctionnant sur le port 8080, ensemble) J'ai deux domaines, disons siteA.com et siteB.com. Dans default.conf de nginx j'ai configuré pour que la porte d'entrée (80) utilise le dossier siteA comme racine, le code est :

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

}

mais je veux que le SiteB utilise le même port pour l'accès des deux domaines au même serveur. Ainsi, lorsque j'accède au site :

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

Comment je fais ? J'ai déjà tout essayé, même d'inclure ces lignes de backend dans default.VCL (configuration de 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);
    }
 }

Il n'est pas résolu, il me renvoie l'erreur :

BACKEND HOST "siteB.com" : se résout en plusieurs adresses IPv4. Seule une seule adresse est autorisée.

j'utilise déjà hôtes virtuels pour d'autres dossiers avec nginx mais il n'est possible de changer que les PORTS, la ligne server_name dirigée vers le domaineA ou le domaineB, ne fonctionne pas.... car c'est la même IP.

Que puis-je faire ? Quelqu'un a-t-il des suggestions ? Merci.

EDIT 1 :

La configuration de nginx pour les deux sites est ici (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;
  }

}

l'autre site (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;
    }

}

1voto

SpaceMonkey Points 1554

L'erreur que vous obtenez suggère que le siteB.com possède plusieurs adresses IPv4. Plutôt que de spécifier vos hôtes backend en utilisant le nom DNS, utilisez simplement localhost ou 127.0.0.1. Cela pourrait calmer varnish, et cela élimine une recherche DNS qui pourrait causer des retards ou (apparemment comme dans ce cas) se tromper. Je ne suis pas trop familier avec varnish mais j'aurais également pensé que vous n'avez besoin de spécifier qu'un seul backend (puisqu'il s'agit en fait de la même boîte ici) et de vous assurer que les headers d'hôte corrects sont transmis à nginx. En parlant de ça...

Vous n'avez pas besoin de configurer d'autres proxies. Nginx vous laissera volontiers spécifier deux hôtes virtuels écoutant sur le même port, et utilisera la directive server_name pour comparer l'en-tête de l'hôte des requêtes entrantes. Toutes les requêtes qui ne correspondent pas à un nom de serveur connu seront prises en compte par le bloc de serveur par défaut, généralement celui spécifié en premier, à moins que vous ne le remplaciez par l'option default_server de la directive listen. Voir l'exemple suivant :

server {
  listen 8080;
  server_name siteA.com;

  ...
}

server {
  listen 8080 default_server;
  server_name siteB.com;

  ...
}

Ici, les deux blocs de serveurs écoutent le port 8080, et nginx sait quelles demandes sont destinées à quel site en faisant correspondre l'en-tête de l'hôte. S'il reçoit une requête pour laquelle il n'a pas de correspondance d'hôte, il devrait normalement la transmettre au bloc pour le siteA.com en tant que premier bloc défini, mais nous annulons spécifiquement ce comportement en déclarant que le bloc pour le siteB.com est le serveur par défaut pour les requêtes sur ce port.

Comme votre configuration varnish s'assure que vous définissez les en-têtes d'hôte appropriés avant de transmettre les requêtes au backend, cela devrait être tout ce que vous avez à faire pour servir plusieurs sites à partir de lui. Je n'aurais pas dû penser que vous auriez besoin de le faire manuellement dans varnish dans ce cas, puisque vous n'écrasez pas les en-têtes ; cela semble surtout être fait pour la normalisation (c'est-à-dire rassembler à la fois www.site.com et site.com pour ne pas mettre en cache deux copies de la même chose). D'après mes lectures, vous ne devriez pas non plus avoir besoin de spécifier plusieurs backends, puisque c'est le même serveur sur le même port que vous regardez. Varnish devrait être suffisamment intelligent pour séparer les caches en fonction des différents hôtes.

1voto

Eduardo Points 126

Si vous utilisez Varnish, vous pouvez configurer la purge sur le site web supplémentaire, par exemple sur default.vcl :

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

et sur la configuration de nginx :

server {
  listen 8080 default_server;
  server_name sitea.com;

  ...
}

server {
  listen 8080;
  server_name siteb.com;

  ...
}

Si vous mettez les deux sites en cache sur varnish, nginx ne peut pas faire la différence correctement. Il existe peut-être une meilleure solution, mais celle-ci fonctionne également.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X