프록시 서버 왜 쓸까?
기본 웹 서비스 통신의 방식입니다.
www.naver.com을 치면
이런 화면을 받아오는 것과 같습니다.
이후 로그인을 하는 등 비즈니스 로직과 관련된 부분을 동작하면 백엔드에 요청하고 응답받은 리소스를 활용해 화면을 재구성합니다
웹 서비스 인프라를 구축하며 서버의 프론트엔드의 3000번과 백엔드의 8080번 포트를 모두 직접 노출을 했습니다.
하지만 그 앞단에 프록시 서버를 두면 아래와 같이 통신하고 다음과 같은 장점들을 갖습니다.
Nginx를 프록시 서버로 활용해 아래와 같은 이점을 살렸습니다.
1. 리버스 프록시 기능으로 백엔드, 프론트엔드의 포트노출을 최소화
2. SSL 오프로딩으로 하위 백엔드 서버와 프론트엔드 서버는 http 통신만으로 부하를 줄이고 인증서 유지보수 간소화
3. Upstream 기능으로 부하 분산 및 백업 서버 관리
Nginx 왜 쓸까?
- 높은 성능: Nginx는 이벤트 기반 아키텍처를 사용하여 매우 높은 성능을 제공합니다. 비동기 처리 방식을 통해 동시에 많은 연결을 처리할 수 있으며, 효율적인 리소스 관리를 통해 빠른 응답 시간을 보장합니다.
- 저 메모리 사용량: Nginx는 경량화된 설계로 메모리 사용량이 상대적으로 낮습니다. 이는 더 많은 연결을 처리하면서도 시스템 리소스를 적게 사용하여 효율성을 높입니다.
- 확장성: Nginx는 수평 및 수직 확장이 가능합니다. 단일 서버 또는 다중 서버 환경에서도 사용할 수 있으며, 로드 밸런싱 및 부하 분산 기능을 통해 트래픽을 효율적으로 관리할 수 있습니다.
Nginx는 비교적 가볍고 강력한 성능을 제공하고, 무엇보다 설정이 직관적이고 간단합니다.
https://prohannah.tistory.com/136
저는 가상 호스팅 개념을 위한 Server블록과 Server 블록 내에 특정 URL 처리를 위한 Location블록을 사용했습니다.
Nginx 설정
다음은 위의 설정을 어떻게 관리하나? 입니다.
먼저 /etc/nginx/.nginx.conf 파일입니다.
메인 설정 파일이고 include로 /etc/nginx/conf.d/*.conf 파일들과 /etc/nginx/sites-enabled/* 파일들을 읽어 적용합니다.
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings // SSL 설정
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings // 로그 파일 저장 위치
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
##
# Virtual Host Configs // 하위 설정파일 읽기 (sites-enabled)
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
conf.d 하위 파일은 전역 설정 및 모듈 설정을, sites-enabled 하위 파일은 특정 도메인 또는 가상 호스트 설정을 맡습니다.
또한, sites-enabled 디렉토리에서 가상 호스트 설정을 활성화하거나 비활성화하는 것만으로도 특정 웹 사이트를 쉽게 추가하거나 제거할 수 있습니다.
Reverse Proxy, SSL 적용(Ubuntu Linux)
1. nginx 설치
sudo apt update
sudo apt install nginx
2. 방화벽 적용
sudo ufw app list
Nginx HTTP: 포트 80번만 허용
Nginx HTTPS: 포트 443번만 허용
Nginx Full: 포트 80, 443번 허용
sudo ufw allow 'Nginx Full'
sudo ufw status
Status: active
To Action From
-- ------ ----
Nginx HTTP ALLOW Anywhere
Nginx HTTP (v6) ALLOW Anywhere (v6)
3. Certbot 설치(!! PPA 이용 방식은 최근 Deprecate 되었습니다.)
apt-get install python3-certbot-nginx
certbot certonly --nginx -d example.com
경로확인
/etc/letsencrypt/live/example.com
4. sites-available 디렉토리 밑에 하위 설정 파일 생성
위의 example.com -> [domain name]으로 대체하시면 됩니다.
sites-available/[domainname]
server { // https프로토콜(443포트) 처리 블록
server_name [domain name];
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/[domain name]/fullchain.pem; // SSL 인증서
ssl_certificate_key /etc/letsencrypt/live/[domain name]/privkey.pem; // SSL 인증서
location /api { // api로 시작하는 요청은 백엔드로
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
error_page 405 = $uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Origin http://localhost:3000; // CORS 에러처리
proxy_set_header Authorization $http_authorization;
}
location / { // 그 외의 요청은 프론트엔드로
proxy_pass http://localhost:3000;
}
}
server { // http프로토콜(80포트) 처리 블록
if ($host = [domain name]) { // https로 redirect
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name [domain name];
return 404; # managed by Certbot
}
5. sites-enabled 심볼릭 링크
심볼릭 링크
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
구동 확인 syntax is ok, test is successful이 출력되야 합니다.
nginx -t
설정 적용
nginx -s reload
짜잔, SSL과 리버스 프록시 적용이 됩니다.
리버스 프록시 서버(포트 노출 줄여 보안강화, server & location block)를 적용하는데 nginx 웹서버를 활용한 이유(경량, 이벤트 아키텍처 & 비동기로 높은 성능), nginx 설정 방법(sites-available)과 간단한 SSL 인증서 적용까지 정리해봤습니다.
참고
https://jaehyeon48.github.io/nginx/configure-nginx-on-ubuntu-2004/
https://prohannah.tistory.com/136
https://velog.io/@coastby/Nginx-SSL-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0
https://blog.naver.com/pjt3591oo/222242046633a