[DevOps] Nginx

Nginx(엔진엑스)는 동시 접속 처리에 특화된 경량 웹 서버이다.
Apache보다 동작이 단순하고, 전달자 역할만 하여 동시 접속 처리에 특화되어 있다.

Nginx 역할

1. 정적 파일을 처리하는 HTTP 서버 역할


웹 서버의 역할을 HTML, CSS, Javascript, 이미지 같은 정보를 웹 브라우저(Chrome, Firefox 등)에 전송하는 역할을 한다.
(HTTP 프로토콜 준수)

2. 응용 프로그램 서버에 요청을 보내는 리버스 프록시 역할

리버스 프록시 서버로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 한다.

리버스 프록시 : 클라이언트는 가짜 서버에 요청하면, 프록시 서버(Nginx)가 배후 서버(reverse server, 응용 프로그램 서버)로부터 데이터를 가져오는 역할을 한다.

웹 응용 프로그램 서버에 리버스 프록시(Nginx)를 두는 이유는 요청에 대한 버퍼링이 있기 때문이다. 클라이언트에서 직접 응용 프로그램 서버에 요청하면 프로세스 1개가 응답 대기 상태가 되어야만 한다. 따라서 프록시 서버를 둠으로써 요청을 배분하는 역할을 한다.

프록시 서버를 두면 클라이언트가 실제 서버 정보를 알지 못해 보안면에서도 강하다.

Nginx 동작 방식


Nginx는 비동기 처리 방식(Event-Drive) 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용하고, 비동기 방식으로 Concurrency하게 처리할 수 있다.
위의 그림처럼 새로운 요청이 들어와도 새로운 프로세스와 쓰레드를 생성하지 않아 생성 비용이 존재하지 않고, 적은 자원으로도 효율적인 운용이 가능하다.
이러한 Nginx 장점으로 단일 서버에도 동시에 많은 연결 처리할 수 있다.

쓰레드 방식과 Event-Drive 방식 비교하기

Nginx 구조


Master Process와 다수의 Worker Process로 구성되어 실행된다.
Master Process는 설정 파일을 읽고, 유효성을 검사 및 Worker Process를 관리한다.
(Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정된다.)

모든 요청은 Worker Process에서 처리한다.
Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용한다.

Nginx 설치

공식 사이트

CentOS에서 설치하는 과정

yum을 통해 nginx 설치는 지원이 안된다.
대신 다음 명령어를 입력하자.

$ sudo amazon-linux-extras install nginx1

설치 확인 및 서비스 시작

$ nginx -v
nginx version: nginx/1.20.0
$ sudo service nginx start 

해당 EC2 IP주소:80을 접속해보자

이제 방화벽 포트 개방을 하여 nginx에 사용해보자
8089번 포트를 개방해 nginx에 사용해보겠다.

// 포트 개방
$ sudo firewall-cmd --permanent --zone=public --add-port=8089/tcp
// 방화벽 재시작
$ sudo firewall-cmd --reload
// 개방된 포트 목록 확인
$ sudo firewall-cmd --list-ports
$ sudo vi /etc/nginx/nginx.conf

    server {
        listen       8089;
        listen       [::]:8089;
        server_name  _;
        root         /usr/share/nginx/html;

80 -> 8089로 수정한다.

$ systemctl restart nginx
$ systemctl enable nginx
  • 이제 proxy를 설정해보자
$ sudo vi /etc/nginx/nginx.conf

server {
    listen       8089;
    listen       [::]:8089;
    server_name  localhost;
    root         /usr/share/nginx/html;
    location / {
        proxy_pass http://localhost:8080;
    }
  • proxy_pass : 엔진엑스로 요청오면 http://localhost:8080 로 전달한다.

그 후 다시 nginx를 재실행하자

$ sudo service nginx restart

http://[EC2 IP 주소]:8089 를 접속해보면 8080 포트의 응용 프로그램이 돌아가고 있다

참고 링크

좋은 웹페이지 즐겨찾기