nginx의 여러 웹 사이트, 하나의 IP


14

그래서 저는 디지털 오션과 nginx를 사용하고 있습니다. 여러 웹 사이트 (내 프로젝트)를 호스팅하고 싶지만 각 웹 사이트에 도메인을 구매하고 싶지 않습니다.

하나의 IP를 사용하여 웹 사이트에 액세스하면서 nginx 및 디지털 오션에서 여러 웹 사이트를 호스팅하는 방법이 있습니까?


다른 폴더 ( X.Y.Z.W/foo, X.Y.Z.W/bar) 에 호스팅 하시겠습니까? 왜 도메인을 얻을 수 없습니까? (동일한 IP를 여러 도메인에 할당 할 수 있습니까?)
muru

그렇게하려면 여러 도메인이 필요합니다. 그러나 무료 도메인 서비스가 있습니다 : freenom.com은 무료 .tk, .ml, .ga, .cf 및 .gq 도메인을 제공합니다.
TheWanderer

@muru 나는 ​​여러 도메인에 돈을 쓰고 싶지 않다고 생각합니다. 그들은 하나의 URL에 여러 웹 사이트를 가질 수있는 방법을 원합니다.
TheWanderer

@ Zacharee1은 하나의 도메인 만 필요하며 하위 도메인을 수행 할 수 있습니다. 그들이 거부하면 사악한 IP 기반 방법을 사용해야합니다. 사용중인 응용 프로그램 / 프로젝트 유형에 따라 '하위 폴더'위치 방법을 지원하지 못할 수 있습니다.
토마스 워드

@ThomasW. 나는 하위 도메인이 옵션이 아닐 것이라고 생각했다
TheWanderer

답변:


17

이를 달성하는 데는 두 가지 방법이 있습니다. 하위 폴더 위치를 사용하여 IP 주소별로 모든 작업을 수행하거나 하나의 도메인 을 구입 다음 해당 도메인에 여러 개의 하위 도메인이 있어야합니다 (도메인을 구매하는 경우 하위 도메인은 비용이 들지 않지만 등록 기관에 확인).

IP 주소를 기억해야하는 것이 매우 악의적 인 경우에만 IP 주소 방법을 권하지 않으며, 다른 사람과 정보를 공유하려고하면 다른 사람이 IP 주소를 기억해야하는 것과 같은 문제가 있습니다.


도메인 이름이없는 one-IP, 많은 하위 폴더 접근

주의! 현재 진행중인 프로젝트에 대한 정보가 없습니다. 많은 웹 프레임 워크가 실제 도메인 이름과 연결되어 있지 않으면 작동하지 않기때문에이 방법을 사용할 수 있는지 여부를 결정하기 위해 더 많은 정보가 필요합니다.


경고 : 이러한 예제를 지속적으로 테스트 할 때 요청 된 URI에 URI 내의 하위 디렉토리가 포함되므로 "하나의 도메인, 많은 하위 디렉토리"접근 방식이 백엔드로 데이터를 역 프록시하는 데 친절하지 않은 것으로 나타났습니다. 이로 인해 백엔드 서버가 올바르게 동작하는 데 문제가 발생할 수 있습니다.

한편, nginx하나의 IP 주소, 많은 docroot 및 하위 폴더 위치에 대해 '악한'접근 방식을 수행해야합니다. 이것은 매우 사악한 접근 방식이며 일부 웹 프레임 워크에서 많은 문제를 일으킬 수 있습니다.

nginx저장소에서 기본 설치를 기본으로 가정하면 각 프로젝트 서브 디렉토리 요청을 처리 할 사이트 구성을 작성해야합니다. 그런 다음 올바른 위치에 심볼릭 링크를 연결해야합니다.

다음 /etc/nginx/sites-available/my-projects과 같이 생성하십시오 (템플릿 / 가이드로 사용하십시오-정적 HTML을 사용하고 PHP 또는 Python 또는 이와 유사한 동적 웹 응용 프로그램을 사용하지 않는 세 개의 프로젝트를 가정하고 개별 위치 블록을 복사하고 그에 따라 새 위치를 만들 수 있음) 서버 IP는 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
    }
}

이제 우리는 기본 설정을 바꾸고 제거하고 다음을 추가합니다 :

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

그런 다음 nginx서비스 를 다시 시작하십시오 .

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

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

단일 도메인, 여러 하위 도메인이 접근합니다.

이 답변 섹션에는 하나의 도메인과 여러 개의 하위 도메인이 있다고 가정합니다. 당신이 이것을 가지고 있지 않다면, 당신의 질문에 이것을 명확히하십시오

nginx server {}구성의 각 블록 마다 서버 이름을 정의하고 다른 요청에 대한 네 번째 서버 블록을 '모두 포획'으로 설정해야합니다.

예 : 나는 세 가지 프로젝트를 가지고, proj1, proj2, proj3. 도메인이 있습니다 evil-projects.net(참고 : 실제로 존재하지 않습니다). 각각 nginx하나의 프로젝트를 가리키는 각 구성 마다 하나씩 세 개의 다른 하위 도메인을 원합니다 . 내 서버는 1.2.3.4에 있으며 모든 사이트에 서비스를 제공합니다.

위 시나리오에서 도메인과 하위 도메인, 서버 구성의 두 부분이 있습니다.

(1) : DNS 구성

호스트에서 DNS 레코드를 설정하여 DNS 레코드가 다음과 일치하도록 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) : 서버의 NGINX 구성 (1.2.3.4)

이제 nginx구성하십시오. 기본 nginx 설정과 리포지토리의 패키지가 있다고 가정합니다 (기본 예제로 14.04를 사용하겠습니다). /etc/nginx/sites-available먼저 네 개의 구성 파일을 넣습니다 . 해당 폴더가의 소유이므로이 파일을 만들 때 사용해야 sudo할 수도 있습니다 root.

/etc/nginx/sites-available/catch-all-유효하지 않은 도메인의 경우 '모두 잡기'가됩니다. http 오류 코드 410 (GONE)을 반환하는 것이 좋습니다.

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

다음으로 사이트 / 프로젝트에 대한 구성을 설정합니다. 그래도 모두 정적 파일이라고 가정하겠습니다. 이들 각각은 서버의 각 프로젝트마다 다른 웹 디렉토리가 있음을 의미합니다 (서로 다른 '문서 루트').

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

그런 다음에서 '기본'구성을 제거 /etc/nginx/sites-enabled하고 자체 구성을 추가해야합니다. 다시 sudo여기에 필요합니다.

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/

그런 다음 nginx프로세스를 다시 시작하십시오 .

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

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

DNS가 전파되면 사이트가 정상적으로 작동합니다.


이 구성에서 proxy_cache에 대한 블록을 어디에 배치 하시겠습니까? proj1, proj2, proj3에 루트가 다른 모든 엔드 포인트가 있고 별도의 폴더에 응답을 캐시하려고한다고 가정하십시오.
user305883

@ user305883 새로운 질문 인 것 같습니다.
토마스 워드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.