Mehrere Websites auf Nginx, eine IP

14

Also benutze ich Digital Ocean und Nginx. Ich möchte mehrere Websites (meine Projekte) hosten, aber keine Domain für jede kaufen.

Gibt es eine Möglichkeit, mehrere Websites auf Nginx und Digital Ocean zu hosten, während Sie mit dieser einen IP auf sie zugreifen?

Bros.-Code
quelle
Host sie in verschiedenen Ordnern ( X.Y.Z.W/foo, X.Y.Z.W/bar)? Warum können Sie keine Domains für sie bekommen? (Sie können dieselbe IP mehreren Domains zuweisen)?
muru
Sie benötigen dazu mehrere Domains. Es gibt jedoch einen kostenlosen Domain-Service: freenom.com bietet Ihnen kostenlose .tk-, .ml-, .ga-, .cf- und .gq-Domains.
TheWanderer
@muru Ich denke, sie wollen kein Geld für mehrere Domains ausgeben. Sie möchten auf irgendeine Weise mehrere Websites auf einer URL haben.
TheWanderer
@ Zacharee1 sie brauchen nur die eine domain und können subdomains machen. Wenn sie sich weigern, müssen sie die böse IP-basierte Methode anwenden, die je nach Art der von ihnen verwendeten Anwendung / des verwendeten Projekts möglicherweise die Methoden zum Auffinden von Unterordnern nicht unterstützt.
Thomas Ward
@ThomasW. Ich dachte, Sub-Domains wären keine Option
TheWanderer

Antworten:

17

Es gibt zwei Möglichkeiten, dies zu erreichen. Entweder machen Sie alles nach IP-Adresse mit Unterordnern oder Sie müssen eine Domain kaufen und dann mehrere Subdomains auf dieser Domain haben (Subdomains sollten nichts kosten, wenn Sie die Domain kaufen, aber fragen Sie Ihren Registrar).

Ich rate von der IP-Adressmethode ab, nur weil es sehr böse ist, sich IP-Adressen merken zu müssen, und wenn Sie versuchen, Informationen an andere weiterzugeben, haben Sie auch das gleiche Problem, dass sich andere die IP-Adresse merken müssen.


Die One-IP-Methode für viele Unterordner ohne Domain-Namen

BEACHTEN! Wir haben keine Informationen über Ihre Projekte, an denen Sie arbeiten. Wir müssen mehr darüber wissen, ob Sie diesen Ansatz anwenden können, da viele Web-Frameworks ohne einen damit verbundenen echten Domain-Namen nicht funktionieren.


WARNUNG : Beim fortlaufenden Testen dieser Beispiele wurde festgestellt, dass der Ansatz "Eine Domäne, viele Unterverzeichnisse" das Reverse-Proxying von Daten an das Backend nicht zulässt, da der angeforderte URI die Unterverzeichnisse innerhalb des URI enthält. Dies kann dazu führen, dass Back-End-Server Probleme haben, sich richtig zu verhalten.

Auf der anderen nginxSeite müssen wir diesbezüglich einen "bösen" Ansatz verfolgen - eine IP-Adresse, viele Dokumentenspeicherorte und Unterordner. Dies ist ein sehr, sehr böser Ansatz und kann bei einigen Web-Frameworks zu vielen Problemen führen.

Angenommen, eine Standardinstallation wird nginxals Basis für die Repositorys verwendet, dann müssen wir eine Standortkonfiguration erstellen, um jede Anforderung eines Projekt-Unterverzeichnisses zu verarbeiten. Dann müssen wir es an der richtigen Stelle symbolisieren.

Erstellen Sie /etc/nginx/sites-available/my-projectsmit folgendem Befehl (verwenden Sie diesen Befehl als Vorlage / Leitfaden): Es werden drei Projekte mit statischem HTML und keinen dynamischen Webanwendungen in PHP oder Python oder ähnlichem vorausgesetzt. Sie können die einzelnen Standortblöcke kopieren und neue Standorte entsprechend erstellen Server-IP ist 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
    }
}

Jetzt ersetzen wir die Standardkonfiguration (entfernen sie) und fügen unsere hinzu:

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

Und dann starte den nginxDienst neu:

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

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

Der Ansatz mit einer Domäne und mehreren Unterdomänen.

In diesem Antwortabschnitt wird davon ausgegangen, dass Sie über eine Domain und mehrere Subdomains verfügen. Wenn Sie dies nicht haben, klären Sie dies bitte in Ihrer Frage

Für jeden nginx server {}Block in der Konfiguration müssen Sie den Servernamen definieren und wahrscheinlich einen vierten Serverblock als "catch all" für andere Anforderungen festlegen.

Beispiel: Ich habe drei Projekte proj1, proj2, proj3. Ich habe eine Domain mit dem Namen evil-projects.net(HINWEIS: Gibt es nicht wirklich). Ich möchte drei verschiedene Subdomains, eine für jede nginxKonfiguration, die auf jeweils ein Projekt verweist. Mein Server befindet sich unter 1.2.3.4 und wird alle Websites bedienen.

Mit dem obigen Szenario haben wir zwei Teile: Domänen und Unterdomänen und die Serverkonfiguration.

(1): DNS-Konfiguration

Richten Sie Ihren DNS auf Ihrem Host so ein, dass für die DNS-Einträge Folgendes zutrifft:

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): NGINX-Konfiguration auf dem Server (1.2.3.4)

Nun zu Ihren nginxKonfigurationen. Ich gehe davon aus, dass Sie die Standard-Nginx-Setups und die Pakete aus den Repositorys haben werden (ich werde 14.04 als Basisbeispiel verwenden). /etc/nginx/sites-availableZuerst werden vier Konfigurationsdateien angelegt . Möglicherweise müssen Sie sudobeim Erstellen dieser Dateien verwenden, da der betreffende Ordner im Besitz von ist root.

/etc/nginx/sites-available/catch-all- Dies ist der Haken für alle nicht gültigen Domains. Ich mag es, den http-Fehlercode 410 (GONE) zurückzugeben.

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

Als nächstes richten wir die Konfiguration für Ihre Standorte / Projekte ein. Ich gehe jedoch davon aus, dass alle Dateien statisch sind. Jedes dieser Verfahren setzt voraus, dass Sie für jedes Projekt auch auf dem Server unterschiedliche Webverzeichnisse haben (unterschiedliche "Dokumentenstammverzeichnisse").

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

Wir müssen dann die 'Standard'-Konfiguration entfernen /etc/nginx/sites-enabledund unsere eigene hinzufügen. Auch sudohier wird gebraucht.

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/

Und dann starten wir den nginxProzess neu:

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

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

Sobald sich DNS verbreitet, funktionieren die Sites wie sie sollten.

Thomas Ward
quelle
Wo würden Sie in dieser Konfiguration Blöcke für proxy_cache platzieren? Angenommen, proj1, proj2, proj3 haben alle dieselben Endpunkte mit unterschiedlichen Wurzeln und möchten die Antwort in verschiedenen Ordnern zwischenspeichern.
user305883
@ user305883 Klingt so, als wäre das eine neue Frage.
Thomas Ward