Vários sites na nginx, um IP

14

Então, eu estou usando oceano digital e nginx. Quero hospedar vários sites (meus projetos), mas não quero comprar um domínio para cada um.

Existe uma maneira de hospedar vários sites no nginx e oceano digital enquanto os acessa usando esse único ip?

Bros Code
fonte
Hospedá-los em pastas diferentes ( X.Y.Z.W/foo, X.Y.Z.W/bar)? Por que você não pode obter domínios para eles? (Você pode atribuir o mesmo IP a vários domínios)?
muru
Você precisaria de vários domínios para fazer isso. Porém, existe um serviço de domínio gratuito: freenom.com oferece domínios .tk, .ml, .ga, .cf e .gq gratuitos.
TheWanderer
@uru Eu acho que eles não querem gastar dinheiro em vários domínios. Eles querem uma maneira de ter vários sites em um URL.
TheWanderer
@ Zacharee1 eles precisam apenas de um domínio e podem fazer subdomínios. Se eles se recusarem a fazer isso, terão que fazer o mau método baseado em IP, que, dependendo do tipo de aplicativo / projeto que está usando, pode não ser capaz de suportar os métodos de localização da 'subpasta'.
Thomas Ward
@ThomasW. Eu estava pensando sub-domínios não seria uma opção
TheWanderer

Respostas:

17

Existem duas maneiras de conseguir isso. Você faz tudo por endereço IP, com locais de subpastas ou precisará comprar um domínio e, em seguida, terá vários subdomínios nesse domínio (os subdomínios não devem custar nada, se você comprar o domínio, mas verifique com seu registrador).

Eu não aconselho o método de endereço IP, apenas porque é muito ruim ter que lembrar endereços IP, e se você tentar compartilhar informações com outras pessoas, também terá o mesmo problema de outras pessoas terem que se lembrar do endereço IP.


A abordagem de um único IP, muitas subpastas, sem um nome de domínio

AVISO PRÉVIO! Não temos informações sobre seus projetos nos quais você está trabalhando. Precisamos saber mais para determinar se você pode fazer essa abordagem, pois muitas estruturas da Web não funcionarão sem um nome de domínio verdadeiro vinculado a ela.


AVISO : Nos testes em andamento desses exemplos, foi descoberto que a abordagem "Um domínio, muitos subdiretórios" não é recomendada para fazer proxy de dados reversos no back-end, pois o URI solicitado incluirá os subdiretórios no URI; isso pode fazer com que os servidores back-end tenham problemas de comportamento adequado.

Por nginxoutro lado, precisamos fazer uma abordagem "malvada" para isso - um endereço IP, muitos documentos e localizações de subpastas. Essa é uma abordagem muito maléfica e pode causar muitos problemas em algumas estruturas da web.

Assumindo uma nginxinstalação padrão como base a partir dos repositórios, precisamos criar uma configuração de site para lidar com cada solicitação de subdiretório do projeto. Em seguida, precisamos vincular o link no local certo.

Crie /etc/nginx/sites-available/my-projectscom o seguinte (use-o como um modelo / guia - ele assume três projetos com HTML estático e sem aplicativos dinâmicos da web em PHP ou python ou similar, e você pode copiar os blocos de localização individuais e criar novos locais de acordo; IP do servidor é 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
    }
}

Agora substituímos a configuração padrão (remova-a) e adicionamos a nossa:

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

E, em seguida, reinicie o nginxserviço:

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

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

A abordagem de um único domínio e vários subdomínios.

Esta seção de resposta assume que você possui um domínio e vários subdomínios. Se você não possui isso, esclareça isso na sua pergunta

Com cada nginx server {}bloco na configuração, você precisará definir o nome do servidor e provavelmente definir um quarto bloco de servidor como um 'catch all' para outras solicitações.

Exemplo: I têm três projectos, proj1, proj2, proj3. Eu tenho um domínio chamado evil-projects.net(NOTA: Não existe realmente). Eu quero três subdomínios diferentes, um para cada nginxconfiguração que apontará para um projeto cada. Meu servidor reside em 1.2.3.4 e servirá todos os sites.

No cenário acima, temos duas partes: domínios e subdomínios e a configuração do servidor.

(1): Configuração de DNS

Configure seu DNS no seu host de forma que o seguinte seja verdadeiro com os 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): configuração do NGINX no servidor (1.2.3.4)

Agora para suas nginxconfigurações. Estou assumindo que você terá as configurações padrão do nginx e os pacotes dos Repositórios (vou usar o 14.04 como um exemplo básico). /etc/nginx/sites-availablePrimeiro, colocaremos quatro arquivos de configuração . Pode ser necessário usar sudoao criar esses arquivos, pois a pasta em questão pertence root.

/etc/nginx/sites-available/catch-all- este será o 'catch all' para todos os domínios não válidos. Eu gosto de retornar o código de erro http 410 (GONE).

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

Em seguida, definimos a configuração para seus sites / projetos. Eu vou assumir que todos eles são arquivos estáticos. Cada um deles implica que você também possui diretórios da web diferentes para cada projeto no servidor (diferentes 'raízes do 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;
    }
}

Em seguida, precisamos remover a configuração 'padrão' /etc/nginx/sites-enablede adicionar a nossa. Novamente, sudoé necessário aqui.

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 então reiniciaremos o nginxprocesso:

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

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

Depois que o DNS se propagar, os sites funcionarão como deveriam.

Thomas Ward
fonte
nessa configuração, onde você colocaria blocos para proxy_cache? Suponha que proj1, proj2, proj3 tenham todos os mesmos pontos de extremidade, com raízes diferentes e queiram armazenar em cache a resposta em pastas distintas.
User305883
@ user305883 Parece que é uma nova pergunta.
Thomas Ward