[우분투 18.04 데스크톱] LEMP : 엔진엑스(Nginx) 설치 과정 정리

에 이어...


서버 하나에 도메인 여러개를 연결하는 과정을 적어보겠습니다. 웹서버 프로그램(Apache, Nginx)에서는 서브도메인도 하나의 도메인으로 취급된다는 점을 알아둘 필요가 있겠습니다. 그리고 Nginx에서는 VirtualHost(가상호스트)라는 용어와 함께 서버 블록(Server Block)이라는 용어도 공식 문서에 보인다는 점도 알아둡시다(구글링할 때 유용함).


공식 문서인

http://nginx.org/en/docs/

https://www.nginx.com/resources/wiki/start/topics/examples/full/#nginx-conf

의 내용을 뼈대로 할 거고요,


예시 차원에서 www.jimnongtest1.top, blog.jimnongtest1.top(서브도메인), www.jimnongtest2.top, www.jimnongtest3.top 이렇게 네 개의 도메인을 확보하고, 각각의 도메인으로 접근했을 때 /var/www/html/jimnongtest1/ , /var/www/html/jimnongtest1_blog/ , /var/www/html/jimnongtest2/ , /var/www/html/jimnongtest3/ 디렉토리로 분기되어 연결되도록 하겠습니다. 해당 위치에 있는 html 파일이 불려져 표시되겠죠!



※ 준비물 1 - 도메인들


▼ (본인의 IP에 연결된) 도메인 여러 개


또는

▼ 다수의 서브도메인을 할당한 하나의 도메인(역시 본인의 IP에 연결되어 있어야 함)

(아파치에선 멀티도메인이든 서브도메인이든 설정 방법이 같습니다! 그래서 서브도메인 여러개를 준비해도 됩니다.)

(붉은 네모처럼 와일드카드 형식으로 서브도메인 지정을 한방에 끝내면 편하겠고, 초록 네모처럼 하나씩 지정해도 되겠죠.)


※ 참고 링크

  - 저렴한 도메인 : NameSilo 회원 가입, 도메인 구입 방법(1달러 할인 쿠폰)

  - 도메인에 DDNS주소 연결하기, 이메일 포워딩 설정하기(NameSilo)


또는 (도메인 구입할 여건이 안된다면)


▼ 터미널 창(Ctrl+Alt+T)에서 sudo gedit /etc/hosts 처럼 쳐서 호스트파일을 에디터로 연 다음 가상의 도메인을/서브도메인을 추가하고 저장&빠져나오는 식으로 환경을 마련해 주세요. => 실제로 선점되지 않은 도메인 이름으로 정하면 나중에 도매인 구해서 연결하면 되니까 좋겠죠?

(붉은 네모/초록 네모 방식 중 한가지만 택하세요. 붉은 네모처럼 스페이스바로 공백 하나씩 줘가면서 가상 도메인들을 추가해도 되고, 초록 네모처럼 한 줄에 도메인 하나씩 적어서 추가해도 됩니다.)



※ 준비물 2 - 도메인 수 만큼의 디렉토리(웹문서 경로)+index.html


/var/www/html/ 가 기본 웹문서 디렉토리죠? 저는 이 경로 하위에 디렉토리들을 만들고, 디렉토리마다 index.html 파일을 넣을 겁니다.


▲ GUI로 진행하려면 파일관리자 프로그램을 통해 /var/www/html/ 디렉토리로 접근해서 폴더를 만들면 되고,


▲ 터미널 창에서 진행하려면 "mkdir /var/www/html/원하는 디렉토리명" 형식으로 폴더를 생성합니다. /var/www/html/ 디렉토리가 root 권한으로 되어 있어서 진행이 안된다면 이전 글의 마지막 부분을 참고해주세요.


디렉토리 생성을 마쳤다면 각 디렉토리마다 index.html 파일을 만들어 줍니다.


▲ 터미널 창(Ctrl+Alt+T)에서 지에디트(gedit)로 index.html 생성 명령을 넣고, gedit가 뜨면 (해당 디렉토리임을 구분할 수 있는) HTML 내용을 입력 후 저장버튼을 누르면 됩니다(아니면 지에디트 먼저 실행시키고 내용 입력한 다음 경로+파일을 정해서 저장해도 됨).

만약 디렉토리를 루트 권한으로 생성했었다면 당연히 sudo gedit 블라블라~~ 식으로 쳐야 하겠고,

head에 UTF-8이라고 명시하지 않으면 웹브라우저에서 높은 확률로 한글이 깨져 보일 수 있으니까 주의하세요.

웹브라우저에서 file:///var/www/html/경로/index.html 처럼 쳐서 들어갔을 때 위 스샷처럼 경로 내의 index.html 파일 내용이 보인다면 잘 된 겁니다.


준비 과정은 이것으로 끝.



※ 사전 지식

: 데비안 계열용(우분투 포함) Nginx(1.X 버전)가 웹루트 경로의 html 파일(기본값 /var/www/html/index.nginx-debian.html )을 불러오는 매커니즘을 알아봅시다.


첫번째.

파일관리자 프로그램으로 /etc/nginx/ 에 들어가 보면 nginx.conf 파일이 보일 겁니다. 이 파일은 메인 설정파일로, Global configuration 설정들도 담고 있습니다. 더블클릭해서 내용을 봅니다. VirtualHost 관련 설정이 있는지 확인하는 것이 포인트입니다.


▲ 어려울까봐 겁을 많이 먹었었는데, 아파치의 apache2.conf 파일보다 직관적이네요. 웹루트 경로에 대한 설정값이 따로 없고, Virtual Host Config 설정이 바로 보이네요(붉은 화살표로 표시). /etc/nginx/sites/enabled/ 경로에 있는 사이트 정보 파일들을 불러오는 식으로 멀티사이트(멀티도메인)가 작동하는 것이군요.


두번째.

그렇다면 /etc/nginx/sites/enabled/ 경로에 어떤 파일들이 있고, 그것들의 내용은 어떤지도 살펴봅시다.


▲ default라는 기본 파일이 있군요. 심볼릭링크로 되어 있는데, 원본 파일 경로는 /etc/nginx/sites-abailable/default 네요. 아파치와 굉장히 비슷합니다.

/etc/nginx/sites/enabled/default 파일을 열어서 내용을 살펴보죠.


/etc/nginx/sites/enabled/default

▲ 아파치 급으로 주석이 자세하진 않지만 구조가 깔끔하게 파악되게끔 되어 있네요.


listen 80

listen [::]:80

(ipv4든 ipv6든 80포트의 신호를 받아서...)

root /var/www/html;

(웹문서 루트 경로는 /var/www/html 로.)

server_name _;

(도메인은 일단 아무거나 다 받음.ㅋ)

location / {

# First attempt to serve request as file, then

# as directory, then fall back to displaying a 404.

try_files $uri $uri/ =404;

}

(일단 경로 내의 파일에 접근하고, 없으면 디렉토리가 있는지 보고 접근하고, 디렉토리도 없으면 404에러를 뿜어라.)


▲ 대충 이렇게 파악이 되는군요.

Apache의 <VirtualHost>에 해당하는 것이 server{}인 것 같고, Apache의 DocumentRoot에 해당하는 것이 root인 것 같고, Apache의 <Directory ~~>에 해당하는 것이 location / {}인 것 같고...

(아파치 섹션 지시어에 대한 문서는 https://httpd.apache.org/docs/2.4/ko/sections.html 에 나온 <Directory>, <Files>, <Location>들을 location 지시어 하나로 퉁치는 듯하네요. 단순해서 좋은데요? )


각설하고,

https://www.nginx.com/resources/wiki/start/

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/

https://wiki.debian.org/Nginx/DirectoryStructure

▲ 문서에 있는 위 링크들은 정말 도움이 많이 되었고,


https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks/

▲ 저는 위 링크의 내용에서 구조 파악을 쉽게 할 수 있었습니다. "Two Server Blocks, Serving Static Files" 항목에서 서버 블록을 아래처럼 구성하면 된다고 설명하네요.


http {

  index index.html;


  server {

    server_name www.domain1.com;

    access_log logs/domain1.access.log main;

    root /var/www/domain1.com/htdocs;

  }


  server {

    server_name www.domain2.com;

    access_log  logs/domain2.access.log main;

    root /var/www/domain2.com/htdocs;

  }

}


제일 바깥쪽을 감싸고 있는 html { } 은 /etc/nginx/nginx.conf 에 있으니까 우리가 신경쓸 필요 없고, server { } 부분만 도메인 별로 구성하면 되겠네요.

그리고 server_name somename alias another.alias; 처럼 한칸씩 띄워가며 도메인을 나열하면 뒤에 적은 도메인들은 Apache(아파치)의 ServerAlias처럼 작동합니다. 예를 들어 server_name aaa.com www.aaa.com; 처럼 적으면 웹브라우저 주소창에 www.aaa.com를 치더라도 aaa.com의 내용이 보이게 됩니다.



※ 주의할 점


다만 Nginx는 sudo apt-get update && sudo apt-get upgrade 명령어를 쳤을 때 주기적으로 업데이트됩니다.

이 때 기본 설정파일들도 업데이트 버전의 것으로 대체하겠냐고 묻기도 하는데, /etc/nginx/sites-abailable/default 파일을 수정해서 사이트를 구축한 경우 No를 선택해서 설정파일을 보존해야 사이트 연결이 망가지지 않겠지만... 실수로 Yes를 누를 수도 있겠죠?

그렇기 때문에 처음부터 /etc/nginx/sites-abailable/default 파일은 수정하지 말고 별도의 사이트 설정 파일을 추가하는 식으로 처리하면 추후 엔진엑스 업데이트시 기본 설정파일을 갱신하더라도 구축한 사이트는 영향을 받지 않습니다.




※ 멀티도메인(or 서브도메인) Nginx에 할당하기


이제 본격적인 작업을 시작하겠습니다.

/etc/nginx/sites-enailable/default 심볼릭링크는 앞으로 쓰지 않을 거니까 지울게요. 터미널 창을 띄우고(Ctrl+Alt+T),


nginx subdomain setting

▲ sudo rm /etc/nginx/sites-enailable/default

위 명령어를 입력합니다.

(Nginx에는 아파치의 a2dissite에 해당하는 명령어가 없습니다. 리눅스 기본 명령어로 지워야 해요.)


▲ 설정 내용들을 일일이 치는 게 힘드니까, default 파일을 복사하고 복사한 파일을 에디터로 열어서 수정하는 식으로 진행하겠습니다.

cd /etc/nginx/sites-available/

sudo cp default 원하는파일명

sudo gedit 복사한파일명


ubuntu multi domain setting

▲ 파일의 내용은 주석(#)을 지워가면서 이런 식으로 구성합니다. 밑줄 친 부분을 여러분의 환경에 맞게 적어주면 되겠죠. 다 적었으면 저장하고 빠져나옵니다. 파일 하나에 서버블록(사이트 정보) 하나씩만 할당할 겁니다.


▲ sudo ln -s /etc/nginx/sites-available/jimnongtest1 /etc/nginx/sites-enabled/jimnongtest1

(sudo ln -s 원본경로/원본파일명 대상경로/대상파일명)

형식으로 쳐서 /etc/nginx/sites-enabled/ 경로에 원본파일의 심볼릭링크를 생성해주고

sudo systemctl restart nginx.service

라고 입력하여 엔진엑스 서비스를 재시작합니다. 설정 파일들을 다시 불러오도록.

(sudo service nginx restart 처럼 입력해도 서비스가 재시작되긴 하는데, 리눅스 버전이 올라갈수록 service를 없애고 systemctl을 쓰는 방향으로 가는 것 같더군요. 대비하는 차원에서 systemctl 명령어를 쓰는 습관을 들이는 것이 좋겠습니다..)


▲ 웹브라우저로 접속 테스트를 해봅니다.


▲ ll /var/log/nginx/

라고 쳐서, 서버 블록 설정파일에 정한대로 로그파일이 생성되었는지도 확인합니다.

로그파일 이름이 마음에 안 들면 서버블록 설정파일을 다시 열어 수정한 다음 Nginx 서비스를 재시작해 줍니다.

(기존의 로그 파일은 sudo rm 명령어로 삭제.)


첫번째 도메인 연결 작업이 끝났습니다.

두번째 도메인 연결 작업부터는 첫번째 서버 블록 설정 파일을 복사해서 내용을 조금만 수정하는 식으로 대응하면 되기 때문에 상대적으로 수월할 겁니다. 예시 차원에서 blog.jimnongtest.top 서브도메인을 연결해보겠습니다.


▲ sudo cp /etc/nginx/sites-available/jimnongtest1 /etc/nginx/sites-available/jimnongtest1_blog

라고 입력해서 jimnongtest1_blog 라는 두번째 서버 블록 설정 파일을 복사하여 생성한 다음

sudo gedit /etc/nginx/sites-available/jimnongtest1_blog

라고 입력하여 에디터(gedit든 nano든 무방)로 해당 파일을 엽니다.

(위 스샷처럼 cd 명령어로 경로에 들어갔다면 명령어 입력할 때마다 경로 입력하지 않아도 되니까 편하겠죠.)


▲ 이런 식으로 구성했습니다. 그리고 저장+빠져나왔습니다.


▲ 심볼릭링크 만들어 주고, 엔진엑스 서비스 재시작.


▲ 웹브라우저로 테스트 성공.


▲ blog.jimnongtest1.top 에 대한 로그도 정상적으로 쌓이고 있습니다.


두번째 (서브)도메인 연결도 끝났습니다.


▲ 같은 방식으로 www.jimnongtest2.top, www.jimnongtest3.top 도메인들도 연결했고요.




※ 팁 : IP주소를 쳐서 서버에 접근하는 것을 차단하기(+매칭되지 않은 도메인의 최상위 서버블록 웹문서 접근 차단)


Virtual Host 설정을 통해 서버 하나에 도메인 여러 개를 할당하는 경우, 고려해야 할 것들이 있습니다. ①도메인 주소를 적지 않고 IP주소만으로 접근하는 사람들을 막는 것과, ②서버 블록 설정 파일에 없는 도메인 주소들이 서버의 IP에 매칭되어 있을 때 사람들이 이 도메인을 쳐서 들어오면 어떻게 막을 것인가.


▲ ②번 상황을 재현해봤습니다. 서버 블록 설정 파일에 없는 www.jimnongtest4.top 도메인을 쳐보면 /etc/nginx/sites-enabled/ 에 있는 가장 앞선 설정파일에 적혀 있는 도메인에 연결됩니다.ㅋ


①, ②번을 (저처럼) 이상 증상이라고 생각한다면 이렇게 하면 막을 수 있을 겁니다.


▲ default 설정파일 안에 길이 있더군요. default 파일을 noip-block 파일로 복사한 다음, 에디터로 noip-block 파일을 열어서 아래 스샷처럼 구성해 줍니다.

(noip-block 파일을 만들기 싫다면 아래의 내용을 /etc/nginx/sites-enabled/ 경로에 있는 설정파일들 중 가장 먼저 조회되는 파일을 열어서 가장 위쪽에 삽입합니다.)


▲ 단, https 연결(SSL)을 설정했을 때에는 위의 내용에 인증서 경로를 추가로 적어줘야 합니다.


▲ 그리고 /etc/nginx/sites-enabled/ 경로에 심볼릭링크를 생성 후 엔진엑스 서비스를 재시작합니다.

(위 스샷의 심볼릭링크 생성 명령어가 잘못된 것 같습니다. sudo ln -s /etc/nginx/sites-available/noip-block /etc/nginx/sites-enabled/0_noip-block 이라고 적어주세요. 숫자로 된 설정파일을 알파벳으로 된 설정보다 먼저 읽어들이는 것 같습니다. ll /etc/nginx/sites-enabled/ 라고 쳐봤을 때 설정파일들 중에서 가장 위에 보이도록 하는 게 포인트입니다.)

(/etc/nginx/sites-available/noip-block 파일을 만들지 않았었다면 심볼릭링크도 만들지 말아야 합니다. nginx 서비스만 재시작하면 됩니다.)


조치 끝. 웹브라우저에서 ①과 ②의 케이스를 테스트해봅니다.


▲ 두 케이스 모두 잘 차단되네요.



※ 팁 - server { } 블록의 server_name 항목이 길어져서 에러가 발생하는 경우


could not build the server_names_hash,

you should increase server_names_hash_bucket_size: 32

또는

could not build the server_names_hash,

you should increase either server_names_hash_max_size: 512

or server_names_hash_bucket_size: 32

이런 식의 에러가 뜨는 경우가 있을 수 있습니다. 서버 블록의 server_name 항목의 내용이 길어져서 생기는 문제인데요,


http://nginx.org/en/docs/http/server_names.html

위 공식 문서의 내용을 참고해서 해결하면 될 것 같습니다. 에러 메세지에서 제시하는 해결책들(you should~~ 부분)만 골라서 반영해주면 되는데요,


예를 들어

could not build the server_names_hash,

you should increase server_names_hash_bucket_size: 32

오류를 해결하려면...


▲ /etc/nginx/nginx.con 파일을 에디터로 연 다음 # server_names_hash_bucket_size 64; 부분을 찾습니다. 그리고 주석을 해제하고(# 삭제) 값을 2의 제곱 형태의 값으로 정하고 저장+빠져나온 다음 nginx 서비스를 재시작합니다(sudo systemctl restart nginx.service).

잘 모르겠으면 구글링했을 때 Nginx 공식 문서가 나올 거예요. 그것을 참고하는 게 가장 정확합니다.


VirtualHost와 다수 도메인 연결에 대한 설명은 이것으로 마무리하겠습니다. 긴 글 읽어주셔서 감사하고,

다음 글에서는 제가 적용한 나머지 엔진엑스(Nginx) 설정들을 정리해 보겠습니다.

반응형