[Nginx] 쉽게 이해하는 Nginx 설치부터 Reverse Proxy 까지 (서버에 포트 여러개 연결하기)

Julie Mingu·2024년 1월 6일
0
post-thumbnail

Ubuntu와 Nginx 조합으로 백엔드 개발 서버를 구축하였습니다.
개발서버 내에 6개의 포트에 각기 다른 서비스를 빌드하였는데요,
오늘은 각 Nginx 안에 각 포트 안에 어떻게 서비스를 넣는 건지 그 개념을 살펴보고자 합니다.

🚩 예고! 🚩 Nginx 서버의 개념을 이해하기 위해서는 방향성이 핵심입니다!

Nginx는 웹서버의 하나로서, 원래 웹서버 하면 Apache가 유명한데요~
이제는 웹서버 시장 점유율 1위가 Nginx라고 하네요.
간단하게만 설명하면, Apache는 프로세스 기반의 접근 방식을 택하고 있고,
Nginx는 이벤트 중심의 접근 방식을 택하고 있다고 해요.

쉽게 말하면 Apache는 하나의 스레드가 한 가지 일만을 (1 프로세스)처리한다면
Nginx는 하나의 스레드에서 다양한 요청을 (1가지의 이벤트로) 멀티 처리하는 것이죠.

서버를 구축할 때 헷갈려서는 안되는 것이 WS (Web Server)와 WAS (Web Application Server)입니다.
WS는 우리가 잘 알고 있는 아파치(Apache)나 엔진엑스(Nginx)에요.
아파치 톰캣은 많이 들어보셨죠. 그것은 엄밀히 말하면 WAS입니다.

일반적으로 HTTP Server라고 불리는 것들이 Web Server입니다.

그러다가 WAS가 등장한 것인데요.
서버에서 더이상 새로운 페이지를 계속 불러오지 않고, 특정 부분만 로딩하면서
페이지에 필요한 부분이 사용자별로 달라지게 된 것이죠~

그래서 정적데이터는 기존처럼 WS에서 바로 처리하지만,
동적 데이터는 WAS에 위임하여 가져오게 됩니다.
즉, WAS는 우리가 잘 알고 있는 Node.js, Tomcat, Gunicorn 같은 것들이에요.
아마 이 WAS는 우리의 프로그래밍 언어 환경에 따라 채택하게 될겁니다.
동적 데이터를 처리해야하니까요~!


자, 그럼 이제 서버를 구축하러 가보실까요.

하나의 서버에 여러 포트로 각각의 서비스를 처리하는 방법

하나의 서버에 웹서버 2개를 설치하면 주로 포트가 충돌나기 때문에
웹서버 1개에 도커를 여러개 연결하거나 하지요.
그래서 웹서버에 여러 포트를 이용해서 서비스를 접속할 수 있게 합니다.

크게 웹서버 구축은 아래 단계를 따르게 될 것이에요.
서버에 터미널로 접속해서 Nginx를 설치해봅시다.

Nginx 설치

# 패키지 목록 업데이트
sudo apt update

# 설치
sudo apt install nginx

# 서비스 시작
sudo systemctl start nginx

# nginx 상태 및 포트 확인
service nginx status
ufw app list

# UFW에서 nginx 허용
sudo ufw allow 'Nginx Full'

# 방화벽 확인
sudo ufw status

# 현재 구축중인 서버 IP 주소 접속시 환영 페이지가 표시되면 성공

Nginx가 환영한다고 하네요.
우리가 저 서버에 각 포트에는 각기 다른 서비스가 응답할 수 있도록 해봅시다.


Nginx 환경 구축하기

Nginx에 포트별로 서버를 구축하라는 말은,
Nginx 안에 웹서버를 여러개 구축하고, 이를 각 포트에 연결하라는 말과 같아요.

여러개의 서비스를 1개의 서버에 띄워야한다면 좋은 방법이겠죠.
특히 개발 서버입니다.

그러려면 환경 구축을 통해서 Nginx가 WAS를 향해 서있을 수 있도록 방향성을 잡아주어야 해요.
그것을 Reverse Proxy 기능을 통해 구현합니다.

etc/nginx 여기서 설정해요

/etc/nginx 에는 여러가지 디렉토리가 있습니다.
그 중에서 우리가 주목해야할 곳은 1곳 이에요. sites-available
다른 폴더에서 여기를 끌어온답니다. 각 서비스의 설정 파일을 여기에 가지런히 정리해보세요!
Nginx config 파일 하나에 다 적는 것도 좋지만, 디렉토리별로 정리해두면 정말 깔끔해요.

아래는 그 파일의 예시에요.
어떤 포트로 연결할지 생각하시고, 그 포트를 적어주면 됩니다.

# 각 애플리케이션에 대해 별도의 server 블록을 생성하여 작성

server {
    listen 3001;
    server_name example.com;  # 도메인을 사용하는 경우

    location / {
        proxy_pass http://localhost:3002;  # 서버 주소
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

제가 위에 적은 코드를 보시면,
3001번을 listen 하고 있어요
Nginx는 클라이언트에게서 오는 요청을 3001번에서 기다립니다.
요청이 오면 프록시 패스를 통해 3002번으로 보낸다는 거에요.

이후에 WAS 설정하실때 3002번을 열어두시면 되겠죠.
3002번은 Nginx에서 뜨는 3002번이 아니라는 것을 알아두심 돼요.

Nginx가 요청을 대신 처리하도록 보내는 곳, 그곳이 바로 WAS 일거고 (자바나, 노드)
이 요청을 받을 곳을 Upstream 이라고 하고, 보내는 Nginx를 Downstream 이라고 해요.

즉, 클라이언트 요청이 오면 특정 포트에서 listen 하고 있다가,
Nginx는 정적 파일은 본인이 그냥 다시 보내주고,
동적 파일인 경우 Upstream 에게 보내서 반환해주는 거지요.

우리는 이것을 이용해서 각 서비스마다 포트를 매칭해놓고 (A 포트 - A 서비스)
특정 A 포트에서 오는 요청은 특정한 A 서비스로만 가도록 하는 것이에요.

마지막으로 그냥 설정파일로 연결만 해두었다고 저절로 이어지지 않아요.
포트를 열어주는 작업을 꼭 해줘야 합니다.

이 포트를 열어주지 않으면 나중에 pm2나 톰캣을 연결했어도,
해당 pm2에서 online인 상태여도 인터넷에 아무것도 안뜰거에요.
주로, Time Out ERR가 뜨게 되겠죠!

Port 열어주기

# nginx 테스트
sudo nginx -t

# 테스트 이상없는 경우 서비스 리로드
sudo service nginx reload

# 방화벽 확인
sudo ufw status

# 특정 포트 열어주기 (listen 할 곳)
sudo ufw allow 3001/tcp

이렇게 하면
포트에 서비스가 잘 뜰겁니다! 🎉


Nginx 가 뜨지 않는다면
/var/log/nginx -> error.log 를 보시면 요청건별로 세부적인 에러를 보실 수 있습니다.

프록시의 문제라기 보다는, WAS의 문제일 가능성이 커요.
ufw 도 꼭 확인하시구요!


오늘은 웹서버 Nginx를 통해 각 포트에 서비스를 설정하는 방법에 대해서 알아보았습니다.
감사합니다💚

profile
(੭˙ ˘ ˙)੭🌱 자란다, 잘한다!

0개의 댓글