Plusieurs sites Web sur nginx, une IP

14

J'utilise donc l'océan numérique et nginx. Je souhaite héberger plusieurs sites Web (mes projets) mais je ne veux pas acheter de domaine pour chacun.

Existe-t-il un moyen d'héberger plusieurs sites Web sur Nginx et Digital Ocean tout en y accédant en utilisant cette seule IP?

Code Bros
la source
Les héberger sur différents dossiers ( X.Y.Z.W/foo, X.Y.Z.W/bar)? Pourquoi ne pouvez-vous pas obtenir de domaines pour eux? (Vous pouvez attribuer la même IP à plusieurs domaines)?
muru
Vous auriez besoin de plusieurs domaines pour ce faire. Il existe cependant un service de domaine gratuit: freenom.com vous offre des domaines .tk, .ml, .ga, .cf et .gq gratuits.
TheWanderer
@muru Je pense qu'ils ne veulent pas dépenser d'argent sur plusieurs domaines. Ils veulent un moyen d'avoir plusieurs sites Web sur une seule URL.
TheWanderer
@ Zacharee1, ils n'ont besoin que d'un seul domaine et peuvent faire des sous-domaines. S'ils refusent de le faire, ils devront utiliser la mauvaise méthode basée sur IP, qui, selon le type d'application / projet qu'ils utilisent, peut ne pas être en mesure de prendre en charge les méthodes de localisation des `` sous-dossiers ''.
Thomas Ward
@ThomasW. Je pensais que les sous-domaines ne seraient pas une option
TheWanderer

Réponses:

17

Il y a deux façons d'y parvenir. Soit vous faites tout par adresse IP, avec l'emplacement des sous-dossiers, soit vous devrez acheter un domaine puis avoir plusieurs sous-domaines sur ce domaine (les sous-domaines ne devraient rien coûter, si vous achetez le domaine, mais vérifiez auprès de votre registraire).

Je ne conseille pas la méthode de l'adresse IP, ne serait-ce que parce que c'est très mal de devoir se souvenir des adresses IP, et si vous essayez de partager des informations avec d'autres, vous avez également le même problème que les autres doivent se souvenir de l'adresse IP.


L'approche one-IP, plusieurs sous-dossiers, sans nom de domaine

REMARQUER! Nous n'avons aucune information sur vos projets sur lesquels vous travaillez. Nous devons en savoir plus pour déterminer si vous pouvez faire cette approche, car de nombreux frameworks Web ne fonctionneront pas sans un vrai nom de domaine lié.


AVERTISSEMENT : lors des tests en cours de ces exemples, il a été découvert que l'approche «Un domaine, plusieurs sous-répertoires» ne prend pas la gentillesse de la rétro-procuration des données vers le backend, car l'URI demandé inclura les sous-répertoires dans l'URI; cela peut entraîner des problèmes de comportement des serveurs principaux.

Sur le nginxcôté, nous devons faire une approche «diabolique» à ce sujet - une adresse IP, de nombreux docroots et emplacements de sous-dossiers. C'est une approche très très mauvaise et peut causer beaucoup de problèmes avec certains frameworks web.

En supposant une nginxinstallation par défaut en tant que base à partir des référentiels, nous devons ensuite créer une configuration de site pour gérer chaque demande de sous-répertoire de projet. Ensuite, nous devons le lier symboliquement au bon endroit.

Créez /etc/nginx/sites-available/my-projectsavec ce qui suit (utilisez-le comme modèle / guide - il suppose trois projets avec HTML statique et aucune application Web dynamique en PHP ou python ou similaire, et vous pouvez copier les blocs d'emplacement individuels et créer de nouveaux emplacements en conséquence; il suppose également que votre IP du serveur est 1.2.3.4).

server {
    listen 80 default_server;

    server_name 1.2.3.4;

    location / {
        return 410;  # Default root of site won't exist.
    }

    location /proj1/ {
        alias /var/www/proj1;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }

    location /proj2/ {
        alias /var/www/proj2;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }

    location /proj3/ {
        alias /var/www/proj3;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }
}

Maintenant, nous remplaçons la configuration par défaut (supprimez-la) et ajoutons la nôtre:

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/my-projects /etc/nginx/sites-enabled

Et puis redémarrez le nginxservice:

# If on 14.04, use this:
sudo service nginx restart

# If on 15.10 or newer, use this:
sudo systemctl restart nginx

L'approche à un seul domaine et à plusieurs sous-domaines.

Cette section de réponse suppose que vous avez un domaine et plusieurs sous-domaines. Si vous ne l'avez pas, veuillez clarifier cela dans votre question

Avec chaque nginx server {}bloc dans la configuration, vous devrez définir le nom du serveur et probablement définir un quatrième bloc de serveur comme «tout attraper» pour les autres demandes.

Exemple: J'ai trois projets, proj1, proj2, proj3. J'ai un domaine appelé evil-projects.net(REMARQUE: n'existe pas vraiment). Je veux trois sous-domaines différents, un pour chaque nginxconfiguration qui pointera vers un projet chacun. Mon serveur réside à 1.2.3.4, et il servira tous les sites.

Avec le scénario ci-dessus, nous avons deux parties: les domaines et sous-domaines et la configuration du serveur.

(1): Configuration DNS

Configurez votre DNS sur votre hôte de sorte que ce qui suit soit vrai avec les enregistrements DNS:

evil-projects.net  IN A  1.2.3.4
proj1.evil-projects.net  IN A  1.2.3.4
proj2.evil-projects.net  IN A  1.2.3.4
proj3.evil-projects.net  IN A  1.2.3.4

(2): configuration NGINX sur le serveur (1.2.3.4)

Maintenant pour vos nginxconfigurations. Je suppose que vous allez avoir les configurations par défaut de nginx et les packages des référentiels (je vais utiliser 14.04 comme exemple de base). Nous aurons d'abord quatre fichiers de configuration /etc/nginx/sites-available. Vous devrez peut-être utiliser sudolors de la création de ces fichiers, car le dossier en question appartient à root.

/etc/nginx/sites-available/catch-all- ce sera le «catch all» pour tous les domaines non valides. J'aime retourner le code d'erreur http 410 (GONE).

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

Ensuite, nous configurons la configuration de vos sites / projets. Je suppose que ce sont tous des fichiers statiques, cependant. Chacun de ces éléments implique que vous disposez également de différents répertoires Web pour chaque projet sur le serveur (différentes «racines de document»).

/etc/nginx/sites-available/proj1.evil-projects.net:

server {
    listen 80;

    server_name proj1.evil-projects.net;

    root /var/www/proj1;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

/etc/nginx/sites-available/proj2.evil-projects.net:

server {
    listen 80;

    server_name proj2.evil-projects.net;

    root /var/www/proj2;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

/etc/nginx/sites-available/proj3.evil-projects.net:

server {
    listen 80;

    server_name proj3.evil-projects.net;

    root /var/www/proj3;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Nous devons ensuite supprimer la configuration «par défaut» /etc/nginx/sites-enabledet ajouter la nôtre. Encore une fois, sudoest nécessaire ici.

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/proj1.evil-projects.net /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/proj2.evil-projects.net /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/proj3.evil-projects.net /etc/nginx/sites-enabled/

Et puis nous redémarrons le nginxprocessus:

# If on 14.04, use this:
sudo service nginx restart

# If on 15.04 or newer, use this:
sudo systemctl restart nginx

Une fois le DNS propagé, les sites fonctionneront comme ils le devraient.

Thomas Ward
la source
dans cette configuration où placeriez-vous des blocs pour proxy_cache? Supposons que proj1, proj2, proj3 ont tous les mêmes points de terminaison, avec des racines différentes et souhaitent mettre en cache la réponse sur des dossiers distincts.
user305883
@ user305883 On dirait que c'est une nouvelle question.
Thomas Ward