Nginx Server 설정 및 튜닝 방법

Nginx를 커스텀 설정하는 방법

SoniaComp
9 min readMar 22, 2021

참고

용어

HTTP

웹 서버와 웹 클라이언트가 서로 정보를 주고 받기 위한 약속(프로토콜)

Web Server ( Http Server )

  • 서버 쪽에서 정보를 제공하는 소프트웨어
  • 정적인 데이터를 서비스 → 적은 컴퓨팅 파워로 많은 요청을 처리할 수 있다.

Application Server

  • 많은 연산을 하기 때문에 웹 서버보다 더 많은 자원을 사용한다.

[ Nginx (WebServer) ]

더 적은 자원으로 더 빠르게 데이터를 서비스 할 수 있다.

설정 파일의 역할

  • nginx.conf : 메인 설정 파일.
  • fcgi.conf : FastCGI 환경설정 파일
  • sites-enabled : 활성화된 사이트들의 설정 파일들이 위치
  • sites-available : 비활성화된 사이트들의 설정 파일들이 위치
  • http 블록: 관리상의 이슈로 한번만 사용하는 것을 권장한다.
  • server 블록: 하나의 웹사이트를 선언하는데 사용된다. 가상 호스팅(Virtual Host)의 개념.
  • Host: 네트워크에 연결된 하나의 컴퓨터
  • Virtual Host: 한대의 컴퓨터로 마치 여러대의 컴퓨터가 존재하는 것처럼 동작한다.
  • include: 별도의 파일에 설정을 기록해서 설정의 그룹핑, 재활용성을 높이는 방법 http { includes sites-enabled/*; }
  • location 블록: server 블록 안에 등장하면서 특정 URL을 처리하는 방법을 정의
  • events 블록: 네트워크의 동작방법과 관련된 설정값을 가진다.

성능과 보안을 강화하는 환경 설정

  • user: 워커 프로세스의 권한
  • nginx 는 마스터 프로세스와 워커 프로세스로 동작 워커 프로세스: 실질적인 웹 서버 역할
  • 워커 프로세스를 악의적 사용자가 제어하게 되면, 해당 머신을 루트 사용자의 권한으로 원격 제어하게 되는 셈이기 때문에 보안상 위험하다.
  • [✓] 계정이 하는 일에 대한 대표성이 있는 이름
  • [✓] shell 에 접속 제한
  • useradd --shell /usr/sbin/nologin www-data
  • worker_process
    여러개의 CPU 코어가 여러개 있는 시스템에서 이 값이 1이면 하나의 코어만으로 요청을 처리하게 되는 셈이다. 따라서 여러개의 코어가 있는 시스템이라면 이 값은 코어의 숫자만큼 지정하는 것이 바람직하다.
  • worker_connections
    몇개의 접속을 동시에 처리할 것인가
    하나의 머신이 처리할 수 있는 커넥션의 양: worker_connections 과 worker_process
    ngrinder: 직접 퍼포먼스를 테스트하면서 값이 조정해야 한다.
  • log_not_found
    존재하지 않는 파일에 대한 요청이 있을 때 404에러를 에러 로그 파일에 기록할 것인지 여부
    off: 존재하지 않는 파일에 대한 에러로그 기록을 생략할 수 있다.
  • client_max_body_size
    업로드 할 수 있는 용량의 크기 지정
    기본값은 1MB, 더 많은 파일의 업로드를 허용 하려면 이 값을 늘려줘야 한다.

[ Nginx 설정 파일 ]

용어

  • Document Root: URL의 루트 디렉토리에 해당하는 웹서버 상의 디렉토리

연산자

  • = : 같다
  • ! = : 다르다
  • ~ : 정규 표현식 패턴 매칭
# php로 끝나는($) 경로로 접근하는 요청에 대해 error_log 출력 
location ~ /.php$ {
error_log /var/log/opentutorials.org.php.error debug;
}
  • !~ : ~의 반대
  • ~* : 대소문자를 구분하지 않는 정규 표현식 패턴 매칭
  • !~* : ~* 의 반대
  • -f : 파일이 존재하는 지 여부를 테스트
  • !-f : -f의 반대
  • -d : 디렉토리가 존재하는지 테스트
  • !-d : -d의 반대
  • -e : 파일, 디렉토리, 심볼릭 링크 존재 여부 테스트
  • !-e : e의 반대
  • -x : 파일이 존재하고 실행 가능한지를 테스트
  • !-x : -x의 반대

변수

  • $host : 현재 요청의 호스트명. 호스트명은 일반적으로 머신이 위치하는 IP나 도메인
  • $uri = document_uri : 현재 요청의 uri. 호스트명과 파라미터는 제외된다.
  • $args : URL의 질의 문자열
  • $arg_[PARAMETER]
  • $binary_remote_addr : 바이너리 형식의 클라이언트 주소
  • $body_bytes_sent : 전송된 바디의 바이트 수
  • $content_length : HTTP 요청 헤더의 Content-Type과 동일
  • $document_root : 현재 요청의 document root 값이 root 지시어와 동일
  • $http_HEADER : http 헤더의 값을 소문자로, 대시(-)를 밑줄(_)로 변환한 값
  • $scheme: HTTP의 구조로 http, https를 의미
  • $server_addr: 서버주소
  • $server_name: 서버 이름
  • $server_port: 서버 포트
  • $server_protocol: HTTP 요청 프로토콜 (HTTP/1.0 혹은 HTTP/1.1)
  • $cookie_COOKIE : cookie의 값을 알아내는 데 사용하는 변수
<http://opentutorials.org:80/production/module/index.php?type=module&id=12>$host : opentutorials.org
$uri : /production/module/index.php
$args : type=module&id=12
server_addr : 115.68.24.88
server_name : localhost
server_port : 80
server_protocol : HTTP/1.1
$arg_type : module
$request_uri : /production/module/index.php?type=module&id=12
$request_filename : /usr/local/nginx/html/production/module/index.php

코어 모듈 지시어

이벤트 모듈 지시어

[ 퍼포먼스 튜닝 ]

튜닝

[ 모듈 ]

rewrite

웹 서버와 웹 브라우저는 URL 을 통해서 통신을 주고받는다. 웹 서버의 기본적인 동작: URL의 path에서 요청하는 파일을 Document Root 에서 찾아서 전달해주는 것
→ rewrite: 주어진 URL 의 규칙을 변경해서 웹 서비스를 보다 유연하게 만드는 방법

  1. semantic url
    - 해당 URL 이 담고 있는 정보를 예측할 수 있게 한다.
    - 검색엔진
  2. 확장자의 치환
  3. 리다이렉션
  4. 내부 리다이렉션
    - 더 빠르고, 웹 브라우저에게 리다이렉션 자체를 숨길 수 있다.
location /docs/ {
rewrite ^/docs/(.*)$ /files/docs/$1;
}
# 디버깅 방법
# error_log 지시자를 server나 location 블록 아래 위치시킨다.
# server 블록 아래에 두면 해당 가상 호스트 전체의 에러 메시지가 출력
# location 블록 아래에 두면, 해당 경로에 대한 에러만 로그로 출력
server {
server_name opentutorials.org
error_log /var/log/opentutorials.org.error debug;
location ~ /.php$ {
error_log /var/log/opentutorials.org.php.error debug;
}
}
# www 제거
if ($host ~* ^www\.(.*)){
set $host_without_www $1;
rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
}
# favicon.ico 무시
location = /favicon.ico {
return 204;
}

upstream

FastCGI를 사용하면 전통적으로 웹 서버와 동일한 머신에서 동작하던 웹 어플리케이션을 별도의 서버로 분리할 수 있다.

  • Upstream Server (Origin Server) : 여러대의 컴퓨터가 순차적으로 어떤 일을 처리할 때 어떤 서비스를 받는 서버 (Upstream Server, Downstream Server)
  • Upstream Module : 부하분산, 속도 개선과 같은 역할
upstream 이름 {
[ip_hash;]
server host 주소:포트 [옵션];
.....
}
# ip_hash: 같은 방문자로부터 도착한 요청은 항상 같은 업스트림 서버가 처리할 수 있게 한다.
# weight=n: 업스트림 서버의 비중
# max_fails=n: n으로 지정한 횟수만큼 실패가 일어나면 서버가 죽은 것으로 간주한다.
# fail_timeout=n: max_fails가 지정된 상태에서 이 값이 설정만큼 서버가 응답하지 않으면 죽은것으로 간주한다.
# down: 해당 서버를 사용하지 않게 지정한다. ip_hash: 지시어가 설정된 상태에서만 유효하다.
# backup: 모든 서버가 동작하지 않을 때 backup으로 표시된 서버가 사용되고, 그 전까지는 사용하지 않는다.
server {
listen 80;
server_name localhost;

location ~ \.php$ {
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
upstream backend {
ip_hash;
server 192.168.125.142:9000 weight=3;
server 192.168.125.143:9000;
server 192.168.125.144:9000 max_fails=5 fail_timeout=30s;
server unix:/var/run/php5-fpm.sock backup;
}

cert 와 SSL 설정

reverse proxy

--

--

SoniaComp
SoniaComp

Written by SoniaComp

Data Engineer interested in Data Infrastructure Powering Fintech Innovation (https://www.linkedin.com/in/sonia-comp/)

No responses yet