68 votes

Servir deux sites à partir d'un seul serveur avec Nginx

J'ai une application Rails qui fonctionne sur mon serveur et j'aimerais maintenant en ajouter une autre.

Je veux que Nginx vérifie l'objet de la demande et répartisse le trafic en fonction du nom de domaine.

Les deux sites ont leur propre nginx.conf lié symétriquement à sites-enabled, mais je reçois une erreur lors du démarrage de nginx. Starting nginx: nginx: [emerg] duplicate listen options for 0.0.0.0:80 in /etc/nginx/sites-enabled/bubbles:6

Ils sont tous deux à l'écoute sur 80 mais pour des choses différentes.

Site n° 1

upstream blog_unicorn {
  server unix:/tmp/unicorn.blog.sock fail_timeout=0;
}

server {
  listen 80 default deferred;
  server_name walrus.com www.walrus.com;
  root /home/deployer/apps/blog/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @blog_unicorn;
  location @blog_unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://blog_unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

Site 2 :

upstream bubbles_unicorn {
  server unix:/tmp/unicorn.bubbles.sock fail_timeout=0;
}

server {
  listen 80 default deferred;
  server_name bubbles.com www.bubbles.com;
  root /home/deployer/apps/bubbles/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @bubbles_unicorn;
  location @bubbles_unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://bubbles_unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

1 votes

Pour information, la syntaxe "default" a été remplacée par "default_server" dans la version 0.8.21. nginx.org/fr/docs/http/request_processing.html

0 votes

@spuder Merci, cela a soudainement corrigé mon "default_server" parameter can be specified for the default "listen" directive only erreur

113voto

VBart Points 5960

La documentation dit :

Le paramètre default_server, s'il est présent, fera en sorte que le serveur devienne le serveur par défaut pour la paire adresse:port spécifiée.

C'est aussi évident, il ne peut y avoir qu'un seul par défaut serveur.

Et il est aussi dit :

Une directive listen peut avoir plusieurs paramètres supplémentaires spécifiques aux appels système liés aux sockets. Ils peuvent être spécifiés dans toute directive listen, mais une seule fois pour la paire adresse:port donnée.

Donc, vous devriez enlever default y deferred de l'un des listen 80 des directives. Et il en va de même pour ipv6only=on également.

0 votes

Ok j'ai fait ça et j'ai passé la vérification d'erreur sur le démarrage de nginx. Le site 2 fonctionne comme prévu, le site 1 renvoie des 400 de nginx. Des suggestions ?

0 votes

Comme ceci : stackoverflow.com/questions/7334193/ Aucune erreur mais "-" 400 0 "-" "-" dans le journal d'accès

0 votes

Si vous n'avez pas d'erreur dans le journal des erreurs de nginx, alors l'erreur a été renvoyée par la licorne. Vérifiez-le. Pour confirmer cette hypothèse, vous pouvez essayer de demander un fichier statique à partir de votre site Web. /assets/ emplacement.

17voto

Guy Points 5465

Je viens de rencontrer le même problème, mais le doublon default_server n'était pas la seule cause de ce message.

Vous ne pouvez utiliser que le backlog sur l'une des server_name des directives.

Exemple

site 1 :

server {
    listen 80 default_server backlog=2048;
    server_name www.example.com;
    location / {
        proxy_pass http://www_server;
    }

site 2 :

server {
    listen 80;    ## NOT NOT DUPLICATE THESE SETTINGS 'default_server backlog=2048;'
    server_name blogs.example.com;
    location / {
        proxy_pass http://blog_server;
    }

0voto

logandihel Points 1

J'avais le même problème. Je l'ai résolu en modifiant mon fichier /etc/nginx/sites-available/exemple2.com. J'ai changé le bloc serveur en

server {
        listen 443 ssl; # modified: was listen 80;
        listen [::]:443; #modified: was listen [::]:80;
        . . .
}

Et dans /etc/nginx/sites-available/example1.com j'ai commenté listen 80 y listen [::]:80 parce que le bloc serveur avait déjà été configuré pour 443.

3 votes

Cela ne résout pas le problème. Maintenant, un serveur écoute le port 80 et l'autre le port 443. La question portait sur l'utilisation de deux serveurs pour le même port mais pour des domaines différents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X