책 "nginx 쿡북"을 참고했습니다.
엔진엑스 주요 설정 파일과 디렉터리
/etc/nginx/
엔진엑스 서버가 사용하는 기본 설정이 저장된 루트 디렉터리
- 엔진엑스는 이곳에 저장된 설정 파일의 내용에 따라 동작
/etc/nginx/nginx.conf
엔진엑스의 기본 설정 파일로, 모든 설정에 대한 진입점
- 워커 프로세스 개수, 튜닝, 동적 모듈 적재와 같은 글로벌 설정 항목을 포함
- 다른 엔진엑스 세부 설정 파일에 대한 참조를 지정
- /etc/nginx/conf.d/의 모든 설정 파일을 포함하는 최상위 http 블록을 가짐
/etc/nginx/conf.d/
기본 HTTP 서버 설정 파일을 포함하는 디렉토리
- 디렉터리 내 파일 중 이름이 .conf로 끝나는 파일은 앞서 언급한 /etc/nginx/nginx.conf 파일이 가진 최상위 http 블록에 포함
- 엔진엑스 설정은 include 구문을 활용해 구조화함으로써 각 설정 파일을 간결하게 유지하는 것을 권장
/var/log/nginx/
엔진엑스의 로그가 저장되는 디렉터리로, access.log와 error.log 파일이 존재
- 접근 로그 파일은 엔진엑스 서버가 수신한 개별 요청에 대한 로그를 저장
- 오류 로그 파일은 오류 발생 시 이벤트 내용을 저장
- 엔진엑스 설정을 통해 debug 모듈을 활성화했다면 디버그 정보도 오류 로그 파일에 기록 가능
기본적인 디렉토리 구조에 대해 알아보았으니 본격적으로 nginx 사용법에 대해 하나하나 알아보겠다.
주요 명령어 옵션
설정 테스트 하기 "nginx - t"
해당 명령은 엔진엑스 설정을 테스트하는 명령어로, 엔진엑스 설정을 변경했다면 해당 명령어를 통해 테스트를 진행한 후 변경된 설정을 적용하는 것이 안전하다.
nginx -T는 설정을 테스트하고 모든 설정 내용과 결과를 출력해주는 명령어라고 한다. 테스트에 실패할 때, 원인을 보기 위해 사용하면 좋을듯하다.
무중단으로 설정 리로드하기 "nginx -s reload"
해당 명령은 엔진엑스 서버를 중지하지 않고도 설정을 리로드하는 신호를 보내는 명령어로, 동작 중인 엔진엑스의 마스터 프로세스는 해당 신호를 받으면 설정을 다시 읽어들인다.
따라서 서버 중지 없이 엔진엑스 설정을 리로드해 패킷 손실 없이 설정을 변경할 수 있다.
높은 가용성이 필요한 환경에서 부하분산 설정을 변경해야 하는 경우는 빈번하기 때문에 이 옵션을 사용하여 엔진엑스는 로드 밸런서로서 작동을 계속하면서 동적으로 설정을 변경하도록 하자
정적 콘텐츠 서비스하기
엔진엑스 설치 시 /etc/nginx/conf.d/default.conf에 기본 HTTP 설정 파일이 생성되는데 해당 파일을 수정하여 아래와 같은 예제가 있다고 가정하고 엔진엑스로 정적 콘텐츠를 서비스하는 방법에 대해 알아보자.
해당 예제는 HTTP 프로토콜과 80 포트를 이용해 /usr/share/nginx/html/ 경로에 저장된 정적 콘텐츠를 제공하는 예제이다.
1. 컨텍스트를 정의
server 블록을 선언하여 엔진엑스가 처리할 새로운 컨텍스트를 정의한다.
2. 포트 수신 및 default context 설정
해당 설정은 엔진엑스가 80 포트로 들어오는 요청을 수신하게 하고,
default_server 매개변수를 사용하여 이 컨텍스트에 정의된 내용이 80 포트에 대한 default context가 되도록 설정하였다.
예제는 listen 지시자가 단일 포트(80)만 사용하지만 필요에 따라 포트를 범위로 지정도 가능하다
3. hostname 지정
server_name 지시자에는 서버가 처리할 호스트명이나 도메인명을 지정한다.
이때, 해당 컨텍스트가 default_server 매개변수를 통해 기본 컨텍스트로 지정되지 않았다면, 엔진엑스는 요청 호스트 헤더값이 server_name 지시자에 지정된 값과 같을 때만 server 블록에 지정된 내용을 수행한다.
따라서, 서버가 사용할 도메인이 정해지지 않았다면 예시와 같이 default_server 매개변수를 사용해 기본 컨텍스트를 정의하고 server_name 지시자를 생략하여 요청을 처리할 수 있다.
4. location 블록 지정
NGINX 리버스 프록시
다음은 nginx의 여러 기능 중에서도 핵심 기능인 리버스 프록시에 대해 알아보자.
리버스 프록시는 클라이언트가 서버에게 요청을 보낼 때 실제 서버에게 보내는 것이 아닌 nginx 같은 프록시 서버에게 요청을
proxy_pass 키워드를 사용하면 쉽게 설정이 가능하다.
# 클라이언트가 example.com으로 요청을 보낼 경우
location /some/path/ {
proxy_set_header Host $host;
proxy_pass http://backend-server;
}
HTTP 프록시 서버로 요청을 전달하려면, location 내부에 proxy_pass 지시어를 지정해야 한다.
위의 예시는 이 location에서 처리되는 모든 요청을 지정된 주소의 프록시 서버로 전달한다. 이 주소는 도메인 이름이나 IP 주소로 지정할 수 있다.
또한 nginx는 $host 라는 변수를 통해 request의 호스트 이름을 저장한다.
변수를 통해 실제 서버에게 요청을 전달할 때 함께 전달한다면, 해당 클라이언트가 요청한 도메인 이름을 유지할 수 있다.
CORS 허용 설정 방법
요청이 GET, HEAD, POST 메서드와 Content-Type 헤더를 사용하고 그 외에 특별한 헤더가 없다면 브라우저는 요청을 서버로 보내고 Access-Control-Allow-Origin 응답 헤더만 확인하지만, 다른 요청에 대해서는 브라우저가 프리플라이트 요청을 보내 리소스에 대한 CORS 정책을 확인하고 따른다.
브라우저는 적당한 CORS 헤더를 찾지 못하면 해당 리소스 사용을 중지해버리기 때문에 서버에서 제공하는 리소스를 하위 도메인에서 문제없이 사용하게 하려면 CORS 허용이 필요하다.
애플리케이션 단이 아닌 Nginx를 통해서도 CORS 정책을 지정할 수 있는데, 다음은 CORS 요청인 경우, 헤더를 조작하여 허용하는 코드이다.
서버는 GET, POST, OPTIONS 메서드를 허용하며 Access-Control-Allow-Origin 헤더를 통해 http://example.com/ 여러 하위 도메인에서 서버 리소스에 접근 가능함을 알린다.
또한 프리플라이트 요청을 매번 보내지 않고도 CORS 정책을 참고할 수 있도록 사용자 브라우저에 Access-Control-Max-Age 헤더에 172만 8000초를 설정해 정책을 캐시한다.
'CS 👩🏻💻' 카테고리의 다른 글
[Git] Clone 시 unable to access 403 해결방법 (0) | 2023.07.24 |
---|---|
[CS] Tomcat에 대해 알아보자 (0) | 2023.07.10 |
MIME 타입 알아보기 (0) | 2023.07.04 |
mermaid를 이용한 쉽고 빠른 다이어그램 만들기 (0) | 2023.06.15 |
시퀸스 다이어그램 시작하기 (0) | 2023.06.15 |