OS & network/linux

오라클 리눅스에 Ngnix 설치 및 구성하기

김재벌 2024. 11. 19. 08:04

안녕하세요. 테크넷마스터 김재벌 입니다.

 

이번에는 오라클에서 가장 많이 쓰는 웹서비스 & 프록시로 사용하는 Nginx 를 설치해 보도록 하겠습니다.

 

NGINX 설치 및 활성화

 

NGINX 패키지 설치

 

터미널을 열고  환경 변수를 생성합니다.

 

$ssh oracle@<ip_address_of_instance> "echo export IP=<ip_address_of_instance> | tee -a ~/.bashrc > /dev/null"

 

이 명령은 인스턴스의 공용 IP 주소를 포함하는 환경 변수를 생성합니다. 이는 뒷부분에서 사용됩니다.

 

*** 이 명령을 입력할 때 두 개의 항목을 모두 <ip_address_of_instance> 를 실제 IP 주소로 입력해야 합니다.

 

SSH를 통해 ol-node-01 인스턴스에 연결합니다.

 

$ssh oracle@<ip_address_of_instance>

 

NGINX 패키지와 모든 종속성을 설치합니다.

 

$sudo dnf install -y nginx

 

NGINX 서비스 활성화 및 시작

  1. NGINX 서비스를 활성화하고 시작하여 즉시 액세스하고 재부팅 후 자동으로 서비스가 시작되도록 합니다.
  2. sudo systemctl enable --now nginx.service
  3. 서비스 상태를 확인 합니다.

이 서비스는 기본적으로 TCP 포트 80에서 수신하는 웹 서버를 시작합니다.

$sudo systemctl status nginx

 

기본 서비스는 모든 서버 이름을 포트 80에서 수신합니다.

서버 이름은 server_name 을 사용하여 정의되고 , NGINX는 구성 파일을 평가하여 주어진 요청에 사용할 서버 블록을 결정합니다.

구성은 정확한 이름, 와일드카드 이름 및 정규 표현식의 조합을 사용하여 서버를 지정할 수 있습니다.

 

방화벽 규칙 구성

사용자 지정 방화벽 프로필이나 OCI 인스턴스를 사용하는 경우 NGINX 웹 서비스에 대한 방화벽 포트(80)를 엽니다.

$sudo firewall-cmd --add-service=http --permanent

$sudo firewall-cmd --reload

설치에 따라 인스턴스에 OCI의 공개 IP 주소가 있고 가상 클라우드 네트워크(VCN)에 대한 다른 인그레스 규칙이 적용될 수 있습니다. 따라서 추가 보안 목록 규칙을 구성하거나 네트워크 보안 그룹 구성을 업데이트해야 할 수 있습니다.

 

기본 설치 테스트

배포를 테스트하는 방법에는 브라우저나 cURL 등 여러 가지가 있습니다.

선택하는 방법은 네트워크 및 방화벽 구성에 따라 달라집니다.

OCI의 경우 VCN 보안 목록 규칙도 고려해야 합니다.

cURL을 사용하여 로컬 액세스를 테스트합니다.

이 테스트는 NGINX가 실행 중인 인스턴스에 SSH를 통해 연결된 터미널 세션에서 NGINX 테스트 페이지에 액세스하려고 시도합니다. 이 연결 유형은 서비스가 작동하고 모든 방화벽 규칙이나 OCI 유입 보안 규칙을 우회하는지 확인합니다.

 

$curl http://$(hostname -i)

 

$(hostname -i)인스턴스의 IP 주소를 가져옵니다.

이것이 OCI 인스턴스인 경우 인스턴스의 개인 IP 주소입니다.

NGINX를 설치한 인스턴스에서 테스트할 때 를 로 바꿀 수도 있습니다  

 

브라우저를 사용하여 원격 액세스를 테스트합니다.

브라우저를 열고 인스턴스의 IP 주소를 사용하여 NGINX 테스트 페이지에 액세스합니다.

이것이 OCI 인스턴스인 경우 인스턴스의 퍼블릭 IP 주소를 사용해야 합니다.

퍼블릭 IP 주소는 SSH를 사용하여 인스턴스에 연결할 때 사용하는 IP 주소입니다.

 

NGINX 웹 서버가 기본 테스트 페이지를 엽니다 

 

/usr/share/nginx/html/index.html.

 

터미널을 사용하여 원격 접속을 테스트합니다.

이것이 OCI 인스턴스인 경우 인스턴스의 퍼블릭 IP 주소를 사용해야 합니다.

퍼블릭 IP 주소는 SSH를 사용하여 인스턴스에 연결할 때 사용하는 IP 주소입니다.

 

$curl http://<ip_address_of_instance>

 

사용자 정의 NGINX 구성 만들기

웹 서버의 루트 경로를 변경하려면 /etc/nginx/nginx.conf파일을 직접 편집하지 마세요

대신 선호하는 방법으로 디렉토리에 사이트별 구성을 만드십시오 

예를 들어, 파일을 만들고 /etc/nginx/conf.d/default.conf사이트에 대한 구성으로 채우십시오.

 

새로운 사이트를 호스팅할 디렉토리를 만듭니다.

$sudo mkdir /srv/website

 

새로운 사이트 방문자에게 표시할 index.html 파일을 만듭니다.

cat << EOF | sudo tee /srv/website/index.html > /dev/null
<html>
<head>
<title>Hello</title>
</head>
<body><p>Hello World!</p></body>
</html>
EOF

 

nginx 프로세스에 디렉토리 소유권을 부여하고 적절한 SELinux 보안 컨텍스트를 설정하도록 권한을 업데이트합니다.

 

$sudo chown -R nginx:nginx /srv/website

$sudo chcon -Rt httpd_sys_content_t /srv/website

 

/etc/nginx/conf.d/default.conf서버 IP 주소 방문자를 위해 사용자 지정 NGINX 구성을 만듭니다 .

 

cat << EOF | sudo tee /etc/nginx/conf.d/default.conf > /dev/null
server {
  server_name   $(hostname -i) $IP;
  root           /srv/website;
  index          index.html;
}
EOF

 

$(hostname -i)인스턴스의 IP 주소를 삽입합니다. OCI 인스턴스의 경우 이는 개인 IP 주소입니다.

OCI 외부에서 OCI 인스턴스에서 실행되는 NGINX 사이트에 액세스하려면 공용 IP 주소 또는 공용 인터넷에서 확인되는 호스트 이름도 포함해야 합니다

$IP 시작 부분에서 설정한 환경 변수는 공용 IP 주소를 나타냅니다.

새로운 구성을 로드하려면 NGINX 웹 서비스를 다시 시작합니다.

 

$sudo systemctl restart nginx

  1. 열린 브라우저로 전환하세요.
  2. 구성과 페이지 변경 사항을 확인하려면 페이지를 다시 쿼리하세요.
  3. 터미널로 돌아가세요.
  4. 로그 파일을 추적하여 연결 세부 정보나 문제를 디버깅하고 볼 수 있습니다.
  5. sudo tail -f /var/log/nginx/access.log -f /var/log/nginx/error.log

서비스 보안을 위한 HTTPS 구성

HTTPS를 사용하여 웹 브라우저와 NGINX 서버 간의 모든 통신을 보호하는 것을 권장합니다.

보안 설정에는 TLS 인증서가 필요합니다.

 

TLS/SSL 인증서 생성

Oracle은 외부 인증 기관(CA)에서 서명한 TLS 인증서를 사용할 것을 강력히 권장합니다

 

** https://docs.oracle.com/en/operating-systems/oracle-linux/certmanage/ 참고 **

 

Managing Certificates and Public Key Infrastructure

 

docs.oracle.com

 

하지만 이 튜토리얼에서는 데모 목적으로 자체 서명된 인증서를 사용합니다.

  1. 인증서와 키를 생성합니다.
  2. openssl req -new -x509 -days 30 -nodes -newkey rsa:2048 -keyout server.key \
  3. -addext "subjectAltName = DNS:$IP" \
  4. -out server.crt -subj "/C=US/ST=Ca/L=Sunnydale/CN=$(hostname -i)"

우리는 옵션을 사용하여 인스턴스의 IP 주소를 인증서 CN값 에 할당 $(hostname -i)하고 OCI 퍼블릭 IP 주소를 옵션을 사용하여 할당합니다

환경에 필요하지 않으면 줄을 subjectAltName제거할 수 있습니다 .

이 옵션을 사용하면 여러 개의 를 포함하여 인증서에 여러 이름을 추가할 수 있으며 ,

각각을 쉼표로 구분합니다.--addextDNS:<hostname_or_ip_address>

  1. NGINX에 대한 키와 인증서를 저장할 디렉토리를 만듭니다.
  2. sudo mkdir -p /etc/pki/nginx/private
  3. 인증서를 .에 복사 /etc/pki/nginx/server.crt하고 키 파일을 /etc/pki/nginx/private/server.key. 에 복사합니다.
  4. sudo cp server.crt /etc/pki/nginx/
  5. sudo cp server.key /etc/pki/nginx/private

TLS/SSL을 위한 NGINX 구성 업데이트

 

파일을 교체  /etc/nginx/conf.d/default.conf.

 

업데이트된 파일에는 TLS 지원 웹사이트에 대한 구성과 HTTP 트래픽에 대한 301 리디렉션이 포함되어 있습니다. 301 리디렉션은 HTTP 트래픽을 HTTPS 사이트로 자동으로 리디렉션합니다.

cat << EOF | sudo tee /etc/nginx/conf.d/default.conf > /dev/null
server {
 server_name   $(hostname -i) $IP;
 return 301 https://\$host\$request_uri;
}
 
server {
 listen       443 ssl http2;
 listen       [::]:443 ssl http2;
 server_name    $(hostname -i) $IP;
 root           /srv/website;
 index          index.html;
 ssl_certificate "/etc/pki/nginx/server.crt";
 ssl_certificate_key "/etc/pki/nginx/private/server.key";
 ssl_session_cache shared:SSL:1m;
 ssl_session_timeout  10m;
 ssl_ciphers PROFILE=SYSTEM;
 ssl_prefer_server_ciphers on;
}
EOF

 

여러 도메인을 호스팅하는 경우 디렉토리 에서 만든 각 구성에 대해 서로 다른 ssl_certificate및 값을 지정할 수 있습니다 .

 

ssl_certificate_keyserver_name/etc/nginx/conf.d

  1. 새로운 구성을 로드하려면 NGINX 서비스를 다시 시작합니다.
  2. sudo systemctl restart nginx

방화벽 업데이트

NGINX HTTPS 웹 서비스에 대해 방화벽 포트 443을 활성화하고 기본 방화벽 서비스를 다시 로드합니다.

 

$sudo firewall-cmd --add-service=https --permanent

$sudo firewall-cmd --reload

 

작동하는 HTTPS 구성 확인

  1. HTTPS를 사용하여 로컬로 사이트에 액세스하려면 cURL을 사용하세요.

$curl -k https://$(hostname -i)

 

-k옵션은 인증서 확인을 우회 합니다.

그리고 이 구성에서는 필요합니다.

그렇지 않으면 cURL은 자체 서명된 인증서를 사용하여 사이트에 액세스하는 것을 방지합니다.

  1. 브라우저를 사용하여 원격 액세스를 테스트합니다.

브라우저를 열고 인스턴스의 IP 주소를 사용하여 NGINX 서버에 액세스합니다.

요청 앞에 를 붙이면 http://브라우저가 HTTPS 사이트로 리디렉션합니다.

 

참고: 대부분의 브라우저는 자체 서명된 인증서를 사용하여 사이트에 액세스할 때 보안 위험 경고를 표시합니다. 사용하는 브라우저에 따라 보안 경고를 승인합니다. Chrome의 경우 Advanced버튼을 클릭한 다음 Proceed to localhost (unsafe)링크를 클릭합니다.