Múltiples sitios web en nginx, una IP

14

Entonces estoy usando el océano digital y nginx. Quiero alojar varios sitios web (mis proyectos) pero no quiero comprar un dominio para cada uno.

¿Hay alguna manera de alojar múltiples sitios web en nginx y el océano digital mientras se accede a ellos usando esa ip?

Código Bros
fuente
¿Alojarlos en diferentes carpetas ( X.Y.Z.W/foo, X.Y.Z.W/bar)? ¿Por qué no puedes obtener dominios para ellos? (¿Puede asignar la misma IP a múltiples dominios)?
Muru
Necesitaría múltiples dominios para hacer eso. Sin embargo, hay un servicio de dominio gratuito: freenom.com le ofrece dominios .tk, .ml, .ga, .cf y .gq gratuitos.
TheWanderer
@muru Creo que no quieren gastar dinero en múltiples dominios. Quieren alguna forma de tener múltiples sitios web en una URL.
TheWanderer
@ Zacharee1 solo necesitan un dominio y pueden hacer subdominios. Si se niegan a hacer eso, tendrán que hacer el mal método basado en IP, que dependiendo del tipo de aplicación / proyecto que estén utilizando puede no ser compatible con los métodos de ubicación de 'subcarpetas'.
Thomas Ward
@ThomasW. Estaba pensando que los subdominios no serían una opción
TheWanderer

Respuestas:

17

Hay dos formas de lograr esto. O haces todo por dirección IP, con ubicaciones de subcarpetas, o necesitarás comprar un dominio y luego tener múltiples subdominios en ese dominio (los subdominios no deberían costar nada, si compras el dominio, pero consulta con tu registrador).

No aconsejo el método de la dirección IP solo porque es muy malo tener que recordar las direcciones IP, y si intentas compartir información con otros, también tienes el mismo problema de que otros tengan que recordar la dirección IP.


El enfoque de una sola IP, muchas subcarpetas, sin un nombre de dominio

¡DARSE CUENTA! No tenemos ninguna información sobre sus proyectos en los que está trabajando. Necesitamos saber más para determinar si puede hacer este enfoque, ya que muchos marcos web no funcionarán sin un verdadero nombre de dominio vinculado a él.


ADVERTENCIA : En las pruebas en curso de estos ejemplos, se descubrió que el enfoque "Un dominio, muchos subdirectorios" no toma amablemente revertir los datos de proxy al backend, ya que el URI solicitado incluirá los subdirectorios dentro del URI; Esto podría hacer que los servidores de back-end tengan problemas para comportarse correctamente.

Por nginxotro lado, tenemos que hacer un enfoque 'malvado' para esto: una dirección IP, muchas docroots y ubicaciones de subcarpetas. Este es un enfoque muy muy malo y puede causar muchos problemas con algunos marcos web.

Suponiendo una nginxinstalación predeterminada como base de los repositorios, entonces tenemos que crear una configuración de sitio para manejar cada solicitud de subdirectorio del proyecto. Luego tenemos que vincularlo en la ubicación correcta.

Cree /etc/nginx/sites-available/my-projectscon lo siguiente (use esto como una plantilla / guía: asume tres proyectos con HTML estático y sin aplicaciones web dinámicas en PHP o python o similares, y puede copiar los bloques de ubicación individuales y crear nuevas ubicaciones en consecuencia; también asume su IP del servidor es 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
    }
}

Ahora reemplazamos la configuración predeterminada (elimínela) y agregamos la nuestra:

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

Y luego reinicie el nginxservicio:

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

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

El enfoque de un dominio y subdominios múltiples.

Esta sección de respuestas asume que tiene un dominio y múltiples subdominios. Si no tiene esto, aclare esto en su pregunta

Con cada nginx server {}bloque en la configuración, necesitará definir el nombre del servidor y, probablemente, establecer un cuarto bloque de servidor como "capturar todo" para otras solicitudes.

Ejemplo: Tengo tres proyectos, proj1, proj2, proj3. Tengo un dominio llamado evil-projects.net(NOTA: Realmente no existe). Quiero tres subdominios diferentes, uno para cada nginxconfiguración que apuntará a un proyecto cada uno. Mi servidor reside en 1.2.3.4 y servirá a todos los sitios.

Con el escenario anterior, tenemos dos partes: dominios y subdominios, y la configuración del servidor.

(1): Configuración DNS

Configure su DNS en su host de manera que lo siguiente sea cierto con los registros 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): configuración de NGINX en el servidor (1.2.3.4)

Ahora para sus nginxconfiguraciones. Supongo que tendrá las configuraciones predeterminadas de nginx y los paquetes de los repositorios (voy a usar 14.04 como ejemplo base). /etc/nginx/sites-availablePrimero tendremos cuatro archivos de configuración . Es posible que deba usarlo sudoal crear estos archivos, ya que la carpeta en cuestión es propiedad de root.

/etc/nginx/sites-available/catch-all- Este será el 'catch all' para cualquier dominio no válido. Me gusta devolver el código de error http 410 (GONE).

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

A continuación, configuramos la configuración para sus sitios / proyectos. Sin embargo, voy a suponer que todos son archivos estáticos. Cada uno de estos implica que también tiene diferentes directorios web para cada proyecto en el servidor (diferentes 'raíces de documentos').

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

Luego tenemos que eliminar la configuración 'predeterminada' /etc/nginx/sites-enabledy agregar la nuestra. De nuevo, sudose necesita aquí.

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/

Y luego reiniciamos el nginxproceso:

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

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

Una vez que el DNS se propaga, los sitios funcionarán como deberían.

Thomas Ward
fuente
en esta configuración, ¿dónde colocaría bloques para proxy_cache? Suponga que proj1, proj2, proj3 tienen todos los mismos puntos finales, con diferentes raíces, y desean almacenar en caché la respuesta en distintas carpetas.
user305883
@ user305883 Parece que es una pregunta nueva.
Thomas Ward