[Docker] Nginx 설정 파일인 nginx.conf 이해하기
실습 목표 : Nginx가 HTTP 요청을 어떻게 처리할지 결정하는 프로그램인지 이해하기
Step 1. 실습 폴더 내부에 nginx.conf 파일 생성
mkdir nginx && touch nginx/nginx.conf
실습 폴더인 nginx-lab 폴더 내부에 nginx 폴더를 만들고 그 폴더 내부에 nginx.conf 파일 생성

Step 2. 작은 설정의 nginx.conf 작성
events {}
http {
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
events {} : 이 블록은 연결(Connection) 처리와 관련된 설정을 담는 곳으로 현재 실습에서는 비워둔다.
http {} : HTTP 서버와 관련된 설정은 이 안에 작성한다.
server{} : 하나의 웹 서버를 의미한다. 예를 들어, 여러 사이트를 운영할 경우 server 블록을 여러 개 둘 수 있다.
listen : Nginx가 몇 번 포트로부터 요청을 받을 것인지를 의미한다.
location : 웹 브라우저가 요청한 URL 경로에 따라, 서버가 어떤 방식으로 요청을 처리할지를 다루는 블록이다.
예를 들어,
location /
의 경우 / 로 시작하는 모든 요청을 해당 블록에서 처리한다는 것을 의미한다.
즉,
/
도
/index.html
도
/images/image.png
등도 해당 블록에서 처리됨을 의미한다.
root : 서버가 요청받은 파일을 찾을 폴더 경로를 지정하는 블록이다.
예를 들어, location / 블록 내의
root /usr/share/nginx/html;
에 대하여
브라우저가
GET /
를 보내면
Nginx는
/usr/share/nginx/html
에서 파일을 찾기 시작한다.
index :
브라우저가 /를 요청했을 때, 서버가 그 폴더 안에서 가장 먼저 찾아 보여줄 기본 파일을 지정하는 설정으로 파일 이름을 적지 않아도 보여줄 대상을 뜻한다.
예를 들어, location / 블록 내의
index index.html;
에 대하여 브라우저가
/
를 요청했을 때 Nginx는
/
파일이 존재하지 않으므로 우선적으로
index.html
파일을 찾는다.
Step 3. Nginx 설정 파일인 nginx.conf도 Mount하기
docker run -d \
--name my-nginx \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html \
-v $(pwd)/nginx/nginx.conf:/etc/nginx/nginx.conf \
nginx
nginx-lab 폴더에 있는 HTML 뿐만 아니라 설정 파일도 연결한다.

이제 컨테이너는 기본 설정이 아니라, 내가 작성한 설정 파일을 사용하게 된다.
+ 정상적으로 nginx 컨테이너가 실행되고 있는지 브라우저를 통해 확인

step 4. 설정 변경해보기
nginx.conf 에서
root /usr/share/nginx/html;
을
root /abcd;
로 수정한 다음 저장한다.
이때, Nginx가 자동으로 변경된 설정을 재적용하지는 않기 때문에 다음 exec 도커 명령어를 입력하여 컨테이너 내에 실행될 설정을 재적용하는 명령어를 전달한다.
docker exec my-nginx nginx -s reload
또는 다음과 같이 명령어를 입력하여 컨테이너를 재시작하여도 변경된 설정이 적용된다.
docker restart my-nginx
이제 브라우저를 새로고침하면

와 같이 나타난다.
그 이유는 nginx는 변경된 설정에 의해
/abcd/index.html
을 찾지만 찾고자하는 폴더와 파일 자체가 존재하지 않기 때문이다.
Step 5. 원래대로 복구하기
다시 nginx.conf 파일을
root /usr/share/nginx/html;
로 수정하고 저장한 다음
docker exec my-nginx nginx -s reload
설정을 재적용한다.
브라우저를 통해 확인해보면

정상적으로 복구된 것을 확인할 수 있다.