Più siti Web su nginx, un IP


14

Quindi sto usando digital ocean e nginx. Voglio ospitare più siti Web (i miei progetti) ma non voglio acquistare un dominio per ognuno.

Esiste un modo per ospitare più siti Web su nginx e digital ocean accedendo ad essi utilizzando quel solo ip?


Ospitarli su cartelle diverse ( X.Y.Z.W/foo, X.Y.Z.W/bar)? Perché non puoi ottenere domini per loro? (Puoi assegnare lo stesso IP a più domini)?
muru,

Avresti bisogno di più domini per farlo. Esiste un servizio di dominio gratuito, tuttavia: freenom.com ti offre domini .tk, .ml, .ga, .cf e .gq gratuiti.
TheWanderer

@muru Penso che non vogliano spendere soldi per più domini. Vogliono in qualche modo avere più siti Web su un solo URL.
TheWanderer

@ Zacharee1 hanno solo bisogno di un dominio e possono fare sottodomini. Se si rifiutano di farlo, dovranno applicare il malvagio metodo basato su IP, che a seconda del tipo di applicazione / progetto che stanno utilizzando potrebbe non essere in grado di supportare i metodi di localizzazione 'sottocartella'.
Thomas Ward

@ThomasW. Pensavo che i sottodomini non sarebbero stati un'opzione
TheWanderer,

Risposte:


17

Ci sono due modi per raggiungere questo obiettivo. O fai tutto per indirizzo IP, con posizioni delle sottocartelle, oppure dovrai acquistare un dominio e quindi avere più sottodomini su quel dominio (i sottodomini non dovrebbero costare nulla, se acquisti il ​​dominio, ma verifica con il tuo registrar).

Non consiglio il metodo dell'indirizzo IP se non altro perché è molto malvagio dover ricordare gli indirizzi IP e se provi a condividere le informazioni con altri, hai anche lo stesso problema che gli altri devono ricordare l'indirizzo IP.


One-IP, molte sottocartelle si avvicinano, senza un nome di dominio

AVVISO! Non abbiamo informazioni sui tuoi progetti a cui stai lavorando. Dobbiamo saperne di più per determinare se è possibile eseguire questo approccio, poiché molti framework Web non funzioneranno senza un vero nome di dominio associato ad esso.


ATTENZIONE : Durante i test in corso di questi esempi, è stato scoperto che l'approccio "Un dominio, molte sottodirectory" non richiede gentilmente di invertire i dati al back-end, poiché l'URI richiesto includerà le sottodirectory all'interno dell'URI; questo potrebbe far sì che i server back-end abbiano problemi a comportarsi correttamente.

Da un nginxlato, dobbiamo adottare un approccio "malvagio" a questo: un indirizzo IP, molti documenti e posizioni delle sottocartelle. Questo è un approccio molto malvagio e può causare molti problemi con alcuni framework web.

Supponendo nginxun'installazione predefinita come base dai repository, allora dobbiamo creare una configurazione del sito per gestire ogni richiesta di sottodirectory del progetto. Quindi dobbiamo ricollegarlo nella posizione giusta.

Crea /etc/nginx/sites-available/my-projectscon quanto segue (usa questo come modello / guida - presuppone tre progetti con HTML statico e nessuna applicazione web dinamica in PHP o Python o simili, e puoi copiare i singoli blocchi di posizione e creare nuove posizioni di conseguenza; presuppone anche che il tuo IP del server è 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
    }
}

Ora sostituiamo la configurazione predefinita (rimuovila) e aggiungiamo la nostra:

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

E quindi riavviare il nginxservizio:

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

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

L'approccio a più domini con più domini.

Questa sezione di risposta presuppone che tu abbia un dominio e più sottodomini. Se non lo possiedi, chiariscilo nella tua domanda

Con ogni nginx server {}blocco nella configurazione, sarà necessario definire il nome del server e probabilmente impostare un quarto blocco del server come "catch all" per altre richieste.

Esempio: Ho tre progetti, proj1, proj2, proj3. Ho un dominio chiamato evil-projects.net(NOTA: non esiste davvero). Voglio tre diversi sottodomini, uno per ogni nginxconfigurazione che punterà a un progetto ciascuno. Il mio server risiede alla 1.2.3.4 e servirà tutti i siti.

Con lo scenario sopra, abbiamo due parti: domini e sottodomini e la configurazione del server.

(1): Configurazione DNS

Imposta il tuo DNS sul tuo host in modo che quanto segue sia vero con i record 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): configurazione NGINX sul server (1.2.3.4)

Ora per le tue nginxconfigurazioni. Suppongo che avrai le impostazioni predefinite di nginx e i pacchetti dai repository (userò 14.04 come esempio di base). In /etc/nginx/sites-availableprimo luogo, verranno inseriti quattro file di configurazione . Potrebbe essere necessario utilizzarlo sudodurante la creazione di questi file, poiché la cartella in questione è di proprietà di root.

/etc/nginx/sites-available/catch-all- questo sarà il "catch all" per tutti i domini non validi. Mi piace restituire il codice di errore http 410 (GONE).

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

Successivamente, impostiamo la configurazione per i tuoi siti / progetti. Presumo che siano tutti file statici, però. Ognuno di questi implica che hai diverse directory web per ogni progetto sul server (differenti 'root del documento').

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

Dobbiamo quindi rimuovere la configurazione "predefinita" /etc/nginx/sites-enablede aggiungere la nostra. Ancora una volta, sudoè necessario qui.

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/

E quindi riavviamo il nginxprocesso:

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

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

Una volta che il DNS si propaga, i siti funzioneranno come dovrebbero.


in questa configurazione dove posizioneresti i blocchi per proxy_cache? Supponiamo che proj1, proj2, proj3 abbiano tutti gli stessi endpoint, con radici diverse e desideri memorizzare nella cache la risposta su cartelle distinte.
user305883

@ user305883 Sembra che questa sia una nuova domanda.
Thomas Ward
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.