3 minute read

언젠가 또 해야할 과정 같아 전체적인 흐름을 기록해보았습니다!


HTTP 도메인 연결

1. 도메인을 구입한다. ( 가비아를 사용했습니다. )

2. DNS 설정을 진행한다 ( 가비아 DNS 관리 URL)

DNS 레코드를 추가한다.

DNS 레코드 : DNS에서 도메인에 관한 설정을 하기 위해 사용되는 일련의 문자들을 뜻한다.

DNS 레코드 데이터 주요 정보
  1. 타입 ( 주요 타입만 설명 )
    • A 레코드 :  도메인 주소와 서버의 IP 주소를 직접 매핑해주는 레코드이다.
    • CNAME 레코드 ( Canonical Name ) : 도메인 주소를 또 다른 도메인 주소와 매핑해주는 레코드이다.
  2. 호스트
    • 도메인 앞에 붙을 호스트 이름 ( ex. www )
    • 아무것도 없을 경우에는 @ 를 작성한다.
  3. TTL ( Time To Live ) : DNS 서버가 검색한 결과에 대한 캐시가 유지되는 시간 ( 초 단위 )
    • 레코드가 수정, 삭제가 되어도 TTL 까지 캐시가 살아있기에 적용까지 시간이 걸린다.
추가해야할 레코드

위의 레코드를 추가해면 도메인과 실제 서버 IP 가 매핑된다.

사용하려는 서버의 포트에 접근하는 방법 ( http 로 접근시 80포트만 접속된다. )
  1. 직접 포트를 입력한다 ( ex. mydomain.com:8080 )
  2. 80 포트에서 WAS 포트를 향한 포트 포워딩 ( 리버스 프록시 )을 설정한다. ( 아래 에서 자세히 설명 )

HTTPS 적용 ( aws ec2 ubuntu 환경)

1. 사용하는 도메인의 SSL 인증서를 발급한다. ( Nginx, Certbot 사용)

Nginx란?

여러가지 기능을 제공하는 웹 서버 소프트웨어

내가 사용한 Nginx의 기능

  1. HTTPS 지원 : SSL 인증서를 사용하여 데이터를 암호화하고 보호하는 기능을 제공한다.
    • 사용자가 접속 시 브라우저와 서버 사이에 안전한 암호화된 연결을 설정하여 데이터를 전송한다.
  2. 리버스 프록시 : 포트 포워딩을 통해 클라이언트와 웹 서버 사이에서 중간 역할을 한다.

Certbot 이란?

무료로 SSL 인증서를 발급받고 관리하는 도구 ( 주로 Nginx, Apache 와 함께 사용 된다.)

2. Nginx, certbot 을 설치한다. ( apt-get 패키지 매니저 업데이트 후 진행 추천 )

sudo apt-get update 
sudo apt-get install nginx
sudo apt-get install certbot python3-certbot-nginx

3. Certbot 을 통해 SSL 인증서를 발급받는다.

( 명령어를 실행하면 설정파일이 수정되니 필요하다면 백업을 해놓으라는 내용 )

  • 한 개의 도메인에 해당하는 인증서를 발급할 때
    sudo certbot --nginx -d your_domain.com
    
  • 여러 도메인에 해당하는 인증서를 발급할 때
    # You may specify multiple domains with -d and obtain and
    sudo certbot --nginx -d example.com -d www.example.com
    

발급한 뒤 아래 명령어를 실행시켜보자

cat /etc/nginx/sites-available/default

설정 파일을 확인 하면 중간 중간 코드들이 자동적으로 추가되어 있음을 확인할 수 있다. ( # managed by Certbot 주석이 달려있다. )

server {
	server_name [서버 도메인]; # managed by Certbot
	listen [::]:443 ssl ipv6only=on; # managed by Certbot
	listen 443 ssl; # managed by Certbot
	ssl_certificate /etc/letsencrypt/live/[서버 도메인]/fullchain.pem; # managed by Certbot
	ssl_certificate_key /etc/letsencrypt/live/[서버 도메인]/privkey.pem; # managed by Certbot
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

4. 적용을 위해 Nginx 테스트, 재시작

sudo nginx -t
sudo service nginx restart

Nginx 를 이용한 포트 포워딩

일단 nginx 설정 파일을 봐보자

cat /etc/nginx/nginx.conf

여기서 우리가 봐야할 주요 설정은 여기다.

Virtual Host Configs 즉 가상호스트 설정이다.

Nginx 는 가상호스팅 설정을 통해서 하나의 물리적 서버에서 여러 개의 도메인 또는 서브도메인을 호스팅할 수 있게 하며 이를 통해 포트 포워딩 ( 리버스 프록시 )을 진행한다.

아래 include에 해당하는 디렉토리로 이동해보자.

위에는 아무것도 없고 아래에는 default 라는 파일이 존재한다.

이 파일에서 사용가능한 간단한 기본 설정들에 대해서 알아보자

# 기본 서버 설정 블록
server {
	
	listen 80; # IPv4 를 통해 80번 포트로 오는 요청에 대해서 처리한다.
	listen [::]:80; # IPv6 를 통해 80번 포트로 오는 모든 요청에 대해서 적용한다.
	server_name localhost; # 해당 설정이 적용될 호스트 이름
	
	# 경로 / 에 대한 설정 블록
	location / { 
		root /home/; # 해당 location 에서 사용할 정적 페이지들의 위치
		index index.html; # 경로에 접속시 보여줄 페이지
		try_files $uri $uri/ /index.html; # 경로가 없거나 경로가 / 인경우 /index.html 로 처리한다.
		proxy_pass http://localhost:8080; # WAS와 연동하는 경우 사용되며 요청을 전달한다. ( 리버스 프록시 )
	}
}

위에 설정들을 정리하면 아래와 같다.

  • http://localhost ( http 기본 포트 80 ) 에 오는 모든 요청을 http://localhost:8080 로 전달한다.
  • http://localhost:8080/hello.html 에 접속시 /home/ 경로에 있는 hello.html 을 띄워준다.
  • http://localhost:8080 , http://localhost:8080/ , http://localhost:8080/index.html 에 요청시 모모두 /home/ 경로에 있는 index.html 을 띄워준다.

리버스 프록시 추가 설정 목록

  • proxy_redirect off; 애플리케이션 서버가 리다이렉션 응답을 전송해도 Nginx는 해당 응답을 그대로 반환한다.

  • charset utf-8;
    Nginx가 UTF-8 인코딩을 사용하여 요청과 응답을 처리하도록 지정한다. 여러 언어의 인코딩을 올바르게 처리하기 위해 설정한다.

  • proxy_set_header HOST $http_host; 요청의 Host 헤더에 클라이언트 요청의 Host 헤더 값을 넣어서 전달하여, 서버 측에서 실제 요청이 어떤 도메인으로부터 들어온 것인지를 파악할 수 있다.

  • proxy_set_header X-Real-IP $remote_addr; 요청의 X-Real-IP 헤더에 클라이언트의 실제 IP 주소넣어서 전달하여 서버 측에서 클라이언트의 실제 IP를 파악할 수 있다.

  • proxy_set_header X-Forwarded-Proto $scheme; 요청의 X-Forwarded-Proto 헤더에 클라이언트 요청에 사용된 프로토콜을 넣어줌으로써 서버 측에서 실제 요청에 사용된 프로토콜을 알 수 있다. (HTTP, HTTPS)

  • proxy_set_header X-NginX-Proxy true; 요청의 X-NginX-Proxy 헤더를 설정하여 요청이 Nginx 에서 프록시로 처리되었는지 알 수 있다.


간단한 진행과정만 적으려했는데 프로젝트에서 팀원들과 같이 설정하면서 나온 키워드들이 궁금해서 찾고 공부하다 보니 글도 장황해지고 시간도 오래걸렸다. ㅎㅎ

하지만 nginx 는 앞으로도 많이 사용할 것 같고 앞으로 리버스 프록시 에서 생길만한 문제들에 대해 어떤 설정을 사용하면 좋을지 어떻게 해결할 수 있을지 어느정도 감이 오는 것 같아 만족스러운 포스팅이였다.