티스토리 뷰
웹서버를 사용할 때 apache와 더불어 nginx 를 많이 사용합니다. 읽을 때는 엔진엑스라고 읽게 되는데, 이번 글에서는 nginx를 설치하고 환경 설정을 하는 방법을 작성해보려 합니다.
웹 서버
웹 서버란 이미지, 동영상, 자바스크립트, HTML 등의 정적 리소스를 제공하는 서버 시스템입니다. 주로 HTTP 통신 프로토콜을 통해 리소스를 전잘하지만 FTP 나 SMTP와 같은 다른 프로토콜도 지원합니다. 웹 서버는 클라이언트와 WAS의 중간 다리 역할을 하기도 합니다. 주로 어플리케이션 서버의 인터셉터가 생성되기 전 가로채는 역할도 합니다. 주 역할은 아래와 같습니다.
1. 데이터 전송
- HTML 텍스트 파일을 비롯해 이미지나 음성 데이터 같은 정적 컨텐츠를 웹 클라이언트에 전송
- 최근 유행하는 클라이언트 사이드 렌더링(React, Vue, Angular 등)에 의해 생성된 빌드 파일 제공
2. Application 실행
- 웹 서버가 직접 웹앱 서버를 실행하여 이미지 압축 등의 기능도 사용 가능
3. Proxy (가장 중요)
- 클라이언트의 요청을 Application Server로 전달
- 캐시 처리와 로드 밸런싱, 암호화등의 기능 사용
nginx 특징
가장 큰 특징은 Asynchoronous Event Driven(비동기적 이벤트 수행)에 의해 Non Blocking 처리를 하게 됩니다. 그렇기 때문에 동시 접속수에 따라 서버의 크기를 Scale up(확장)과 Scale down(축소) 가 가능합니다. 그렇기 떄문에 프로세스 기반인 apache 서버보다 소비 메모리량이 적어지며 기하급수적으로 들어오는 요청에 따른 처리를 수월하게 할 수 있습니다.
그리고 Single Thread 기반으로 Master / Worker 프로세스 구동 방식을 채택하였기 때문에 Context Switching을 하지 않습니다. 그렇기 때문에 CPU 사용률을 감소시킬 수 있습니다.
하지만 결국 하드웨어 자원을 사용하는 것이기 떄문에 IO가 자주 일어나는 모델에서는 Apache가 더 유리합니다. 이를 대응하기 위해 nginx에서는 Proxy 처리를 하기 때문에 단점을 보완한다고 볼 수도 있습니다.
nginx 설치
설치 방법은 공식 사이트에 보다 자세히 나와있습니다. ubuntu의 경우 아래와 같이 설치합니다.
# apt repository 에 설치하고자 하는 nginx 버전 추가
# ubuntu 버전 (18.04: bionic, 16.04: xenial)
sudo touch /etc/apt/sources.list.d/nginx.list
echo "deb http://nginx.org/packages/ubuntu/ bionic nginx" | sudo tee -a /etc/apt/sources.list.d/nginx.list
echo "deb-src http://nginx.org/packages/ubuntu/ bionic nginx"| sudo tee -a /etc/apt/sources.list.d/nginx.list
# 인증 키 등록
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
# 저장소 업데이트
sudo apt-get update
# nginx 설치
sudo apt-get install nginx
그리고 CentOS 이면 아래와 같이 설치합니다.
# nginx 공식 저장소 추가
sudo vim /etc/yum.repos.d/nginx.repo
# 파일에 아래 내용 추가
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
# nginx 설치
sudo yum install nginx
설치 후에 아래 명령어를 이용하여 버전을 확인하고 서비스를 시작합니다.
# nginx 버전 확인
nginx -v
# nginx 시작
sudo /etc/init.d/nginx start
nginx 환경 변수
/etc/nginx/nginx.conf 파일을 열게되면 아래와 같은 내용이 나옵니다.
# worker 프로세스를 실행할 사용자 설정
# - 이 사용자에 따라 권한이 달라질 수 있다.
user nginx;
# 실행할 worker 프로세스 설정
# - 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통, 더 높게도 설정 가능
worker_processes 1;
# 오류 로그를 남길 파일 경로 지정
error_log /var/log/nginx/error.log warn;
# NGINX 마스터 프로세스 ID 를 저장할 파일 경로 지정
pid /var/run/nginx.pid;
# 접속 처리에 관한 설정을 한다.
events {
# 워커 프로레스 한 개당 동시 접속 수 지정 (512 혹은 1024 를 기준으로 지정)
worker_connections 1024;
}
# 웹, 프록시 관련 서버 설정
http {
# mime.types 파일을 읽어들인다.
include /etc/nginx/mime.types;
# MIME 타입 설정
default_type application/octet-stream;
# 엑세스 로그 형식 지정
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 엑세스 로그를 남길 파일 경로 지정
access_log /var/log/nginx/access.log main;
# sendfile api 를 사용할지 말지 결정
sendfile on;
#tcp_nopush on;
# 접속시 커넥션을 몇 초동안 유지할지에 대한 설정
keepalive_timeout 65;
# (추가) nginx 버전을 숨길 수 있다. (보통 아래를 사용해서 숨기는게 일반적)
server_tokens off
#gzip on;
# /etc/nginx/conf.d 디렉토리 아래 있는 .conf 파일을 모두 읽어 들임
include /etc/nginx/conf.d/*.conf;
}
마지막으로 수정된 설정값을 적용하기 위해 재기동합니다.
# ubuntu
$ service nginx reload;
# centOS
$ systemctl start nginx
'Server' 카테고리의 다른 글
[Java] LocalDate, LocalTime, LocalDateTime 파보기 (0) | 2021.06.22 |
---|---|
[Java] 암호화의 기초와 적용해보기 (0) | 2021.06.21 |
[Java] 대용량 파일 AWS에 업로드하기 (0) | 2021.06.21 |
API Throttling 에 대해서 (0) | 2021.06.17 |
PM2 를 활용한 서비스 운영하기 (0) | 2021.06.15 |
Socket.io 사용하여 채팅 구현하기 (0) | 2021.06.15 |