본문 바로가기
프로그래밍/Linux

Ubuntu에서 Apache2, Express 연동(HTTP, HTTPS, SSL)

by 꾸션 2022. 5. 5.

Ubuntu환경에서 Apache2 웹서버와 Express 웹 어플리케이션 서버를 연동하는 방법입니다. SSL연동을 하여, HTTPS 서비스환경을 구축하는 것을 목표로 글을 작성합니다.

Apache2, Express, HTTP, HTTPS, SSL연동하기

 

아래는 이 글의 작성을 위한 환경입니다.

  • 도메인: ccusean.com
  • 서브 도메인: lotto.ccusean.com tools.ccusean.com games.ccusean.com
  • Express 포트: 8080
  • 최종 목표: HTTP(80) -> HTTPS(443) -> Express(8080)
  • SSL 인증서: Let's Encrypt를 통해서 보유한 상태

 

Apache2 패키지 설치 및 필요한 모듈 활성화

Ubuntu서버에서 Apache2서버 설치와 필요한 모듈을 활성화하는 방법입니다.

# Apache2 패키지 설치
sudo apt install apache2

# Apache 모듈 활성화
# mod_rewrite 모듈을 활성화. URL 재작성 규칙을 정의하고 사용할 수 있게 함
sudo a2enmod rewrite
# mod_ssl 모듈을 활성화. SSL/TLS 암호화를 사용하여 클라이언트와 서버 간의 보안 연결을 제공
sudo a2enmod ssl
# mod_proxy 모듈을 활성화. Apache 서버가 프록시 서버로 동작하게 해서 다른 서버로 요청을 전달할 수 있게 함
sudo a2enmod proxy
# mod_proxy_http 모듈을 활성화. HTTP를 통한 프록시 연결을 가능하게 함
sudo a2enmod proxy_http
# mod_proxy_html 모듈을 활성화. HTML 컨텐츠의 URL을 프록시 설정에 맞게 재작성할 수 있게 함
sudo a2enmod proxy_html
# mod_http2 모듈을 활성화. HTTP/2 프로토콜 지원을 활성화하여 더 효율적인 페이지 로딩과 성능 향상을 제공
sudo a2enmod http2
 

SSL/TLS: 웹 보안의 필수 구성요소

인터넷은 현재 전 세계에서 가장 널리 사용되는 정보와 커뮤니케이션 도구입니다. 불행하게도, 이런 인기 때문에 해커들과 사이버 범죄자들의 주요 목표가 되기도 합니다. 이 문제를 해결하기

ccusean.tistory.com

 

Apache2 설정 파일 만들기

Apache2 설정 파일을 만듭니다. 위에서 언급한 것과 같이 도메인 명이 "ccusean.com"이므로, "ccusean.com.conf"라는 이름으로 설정파일을 만들겠습니다. Apache2의 설정 파일의 기본 위치는 "/etc/apache2/sites-available/"입니다.

cd /etc/apache2/sites-available

sudo vim ccusean.com.conf

 

Apache2 설정

Apache2 설정파일 내용은 대략적으로 아래와 같습니다.

HTTP(80) 프로토콜을 사용하여 ccusean.com(서브 도메인 포함)에 접속하는 모든 것을 HTTPS(443)으로 영구적으로 리다이렉션 시킵니다. HTTPS에서는 접속한 모든 처리를 localhost의 Express(8080)포트에서 모든 처리를 하고, HTTPS를 통해서 클라이언트에게 되돌려 줍니다.

 

# HTTP: (HTTP -> HTTPS)
<VirtualHost *:80>
  ServerName ccusean.com
  ServerAlias lotto.ccusean.com tools.ccusean.com games.ccusean.com

  RewriteEngine On
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

# HTTPS (HTTPS -> Express)
<IfModule mod_ssl.c>
  <VirtualHost *:443>
    Protocols h2 http/1.1

    ServerName ccusean.com
    ServerAdmin ccusean@localhost

    DocumentRoot /home/ccusean/was

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine On
    SSLCertificateFile      /etc/letsencrypt/live/ccusean.com/cert.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/ccusean.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/ccusean.com/chain.pem
#    SSLCACertificatePath    /etc/letsencrypt/live/ccusean.com/
#    SSLCACertificateFile    /etc/letsencrypt/live/ccusean.com/fullchain.pem

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass        / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>
  </VirtualHost>
</IfModule>

서버 처리속도 향상을 위해서 HTTP/2 프로토콜을 활성화(Protocols h2 http/1.1) 시켰으며, Express에서 클라이언트 접속 도메인을 ccusean.com 혹은 서브 도메인으로 인식 가능하도록 호스트 헤더 보존(ProxyPreserveHost On) 시켰습니다.

 

위 설정 파일내용에 대한 자세한 설명을 달은 주석은 아래와 같습니다.

# 80번 포트에서 수신하는 모든 요청을 처리하는 가상 호스트 블록 시작
<VirtualHost *:80> 
  # 서버의 기본 도메인 이름 설정
  ServerName ccusean.com 
  # 서버의 별칭(도메인) 설정
  ServerAlias lotto.ccusean.com tools.ccusean.com games.ccusean.com

  # Apache의 Rewrite 모듈 활성화. URL 재작성을 가능하게 함
  RewriteEngine On 
  # HTTPS가 아닌 연결인 경우에만 아래 규칙을 적용
  RewriteCond %{HTTPS} off 
  # 모든 요청을 해당 도메인의 HTTPS 버전으로 리다이렉트. R=301은 영구 리다이렉트, L은 이 규칙 후 더 이상 규칙을 처리하지 않음을 의미
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
</VirtualHost>

# mod_ssl 모듈이 활성화되어 있을 경우에만 이 블록 내의 내용 실행
<IfModule mod_ssl.c>
  # 443번 포트에서 수신하는 모든 요청을 처리하는 가상 호스트 블록 시작
  <VirtualHost *:443>
    # 사용할 프로토콜 지정 (HTTP/2와 HTTP/1.1): HTTP/2 프로토콜을 활성화하여 서버 처리속도를 향상시킵니다.
    Protocols h2 http/1.1

    # 서버의 기본 도메인 이름 설정
    ServerName ccusean.com
    # 서버 관리자의 이메일 주소 설정
    ServerAdmin ccusean@localhost

    # 문서 루트 디렉토리 지정
    DocumentRoot /home/ccusean/was

    # 오류 로그 파일의 경로 설정
    ErrorLog ${APACHE_LOG_DIR}/error.log
    # 접근 로그 파일의 형식과 경로 설정
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # SSL 엔진 활성화
    SSLEngine On
    # SSL 인증서 파일 경로 설정
    SSLCertificateFile      /etc/letsencrypt/live/ccusean.com/cert.pem
    # SSL 인증서 키 파일 경로 설정
    SSLCertificateKeyFile   /etc/letsencrypt/live/ccusean.com/privkey.pem
    # SSL 인증서 체인 파일 경로 설정
    SSLCertificateChainFile /etc/letsencrypt/live/ccusean.com/chain.pem

    # 프록시 요청 비활성화
    ProxyRequests Off
    # 호스트 헤더 보존 활성화: Express에서 접속 URL을 localhost가 아닌 ccusean.com으로 인식할 수 있도록 합니다.
    ProxyPreserveHost On
    # 모든 요청을 로컬 호스트의 8080 포트로 프록시
    ProxyPass        / http://localhost:8080/
    # 프록시 요청의 응답 처리
    ProxyPassReverse / http://localhost:8080/
    # 모든 클라이언트로부터의 프록시 요청 허용
    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>
  </VirtualHost>
</IfModule>

 

Apache2 설정파일 활성화 시키기

아래의 명령어를 사용하여 "ccusean.com.conf"파일을 활성화 시킵니다. 이 명령어를 실행하면, "/etc/apache2/sites-enabled"에 링크 파일이 생성이 되고 Apache2서비스 실행시 실행이 됩니다. 명령어에서 마지막 부분은 ".conf"를 제외하고 입력합니다.

sudo a2ensite ccusean.com

 

Apache2 설정파일 검증하기

아래의 명령어를 통해서 Apache2 설정파일의 내용이 유효한지 확인할 수 있습니다.

sudo apachectl configtest

# 정상인 경우
# Syntax OK

# 에러인 경우
# Syntax Error와 설명이 나옵니다.

 

Express.js 프로그래밍하기

Apache2 연동과 관련된 부분만 추려서 보여드립니다. 메인 도메인인 "ccusean.com"과 서브 도메인 처리를 위한 부분을 나타냅니다.

각 각의 처리를 express의 router를 사용하여 정의하여 별도의 파일로 관리되어 있습니다.

const express = require('express')
const vhost = require('vhost')
// ...
const lottoRouter = require('./routes/lotto/index.js')
const toolsRouter = require('./routes/tools/index.js')
const gamesRouter = require('./routes/games/index.js')
const ccuseanRouter = require('./routes/ccusean/index.js')

const app = express()
// ...
app.use(vhost('lotto.ccusean.com', lottoRouter))
app.use(vhost('tools.ccusean.com', toolsRouter))
app.use(vhost('games.ccusean.com', gamesRouter))
app.use(vhost('ccusean.com', ccuseanRouter))

 

서비스 실행

Express 서비스 실행

Express 웹 어플리케이션 서버를 실행합니다.

npm start

PM2 또는 Forever와 같은 프로세스 매니저를 사용하는 경우 해당 명령어로 실행하시면 됩니다.

 

Node.js PM2(Process Manager)

Node.js로 실행되는 프로세스를 관리하는 툴입니다. Linux의 service데몬이라고 생각하시면 쉽게 이해가 되실 겁니다. PM2의 또 다른 강점은 프로세스를 CPU 코어 수만큼 실행할 수 있다는 것입니다. 1

ccusean.tistory.com

Apache2 서비스 실행

apache 서버를 재실행하여 연동 성공여부를 확인 합니다. 아래의 명령어 중 적절한 것을 선택해서 사용하세요.

# 실행
sudo systemctl start apache2

# 중지
sudo systemctl stop apache2

# 재실행 (stop후 start)
sudo systemctl restart apache2

# 리로드
sudo systemctl reload apache2

 

접속확인

웹브라우저

웹브라우저를 통해서 접속이 잘 이루어지는지 아래의 명령어를 주소창에 입력하여 확인 합니다.

# HTTP 확인 (접속하면 https://ccusean.com으로 자동 변경이 됩니다.)
http://ccusean.com

# HTTPS 확인
https://ccusean.com

# Express 확인
http://ccusean.com:8080

콘솔

콘솔창에서 아래의 명령어를 입력하여 접속이 잘 이루어지는지 확인 합니다.

# HTTP 확인
telnet ccusean.com 80

# HTTPS 확인
telnet ccusean.com 443

# Express 확인
telnet ccusean.com 8080

 

접속 오류가 나는 경우 체크사항

방화벽에 의해 막혀있는지 확인 합니다. 서버에서 로컬로 접속시 성공하고 외부에서 접속 시 오류가 나면 방화벽의 문제일 수 있습니다.

포트번호가 열려 있는지 확인 합니다. "netstat", "nmap" 혹은 기타 포트스캐너 툴을 이용해서 확인 합니다.

설정 파일 "Syntax" 에러가 아닌지, 프로그래밍 오류 혹은 오타가 있는지 확인 합니다.

반응형

댓글