CentOS에 Node.js 설치를 해야되는데, 버전에 민감하지 않다면

관리자 권한 기준으로 터미널에

라고 입력하면

nodejs 와 npm 이 같이 설치 된다.

이렇게 나오면 성공!

근데 너무 버전을 신경쓰지 않았던 걸까?

버전이 낮아 npm 명령어가 실행 안되는 부분이 있어

node.js 를 재설치 했다.

내가 원하는 버전은 16버전이라, 다시 세팅했다.

일단 버전을 확인하고 npm의 캐시를 싹 삭제하자.

그리고 현재 깔려있는 node.js 와 npm을 삭제한다.

curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -

아래의 url을 참고하여 원하는 버전의 nodejs 버전을 curl 을 통해 세팅한다.

github.com/nodesource/distributions/blob/master/README.md

 

그리고, 아래와 같이 명령어를 작성하면...!

끝으로 node -v와 npm -v를 통해 버전을 확인하면,

원하는 버전이 세팅되어 있다.

우분투의 경우 npm은 같이 설치 되지 않던데

왜 그런걸까? 나중에 알아보기로 하자

오라클 프리티어를 이용하여 인스턴스를 만들면,

CentOS의 경우 OPC 라는 username 을 받게되는데 사실 이건 root 계정이 아니다.

처음 설정할 때 대부분 root 권한이 있어야 설정하기가 매우 간편한데,

우리는 인스턴스를 만들 때 root 에 대한 비밀번호를 입력한 적이 없을 것이므로 입력할 수단이 없다.

그래서 root 계정의 비밀번호를 새로 만들어줘야 하는데,

터미널에서

sudo passwd root

를 실행하고 비밀번호를 입력 및 저장한 다음에

su root

를 입력하고 비밀번호를 입력하면

root 계정으로 접근할 수 있다.

지난 포스팅에서 고정 IP 설정까지 끝내봤다.

2025.02.12 - [서버] - [서버] 오라클 클라우드 프리티어-02(feat.고정 IP 설정)

이제 이 서버를 외부에서 접근하여 서비스를 이용하게끔 처리하려면,

오라클 클라우드에서 수신 규칙을 추가해야 한다.

그 과정을 시작해보자.

오라클 인스턴스 내 기본 VNIC

위의 서브넷 링크를 클릭한다.

다음과 같이 나오는데, 보안 목록을 따로 추가할 필요없이

인스턴스를 생성할 때 기본 보안 목록이 들어갔을 것이다.

이름을 클릭한다.

수신 규칙

클릭하면 수신규칙 목록을 확인할 수 있는 화면으로 이동하게 되는데,

기본 22번 포트와 ICMP만 개방되어 있으나 필자는 미리 수신규칙을 추가해놔서

하단의 80포트와 443포트도 보이는 것이다.

수신 규칙 버튼을 클릭하여 외부에 개방하고 싶은 포트를 입력한다.

수신 규칙 추가 화면 - 소스 포트범위는 적지 않는다.

외부에서 접근할 때는 포트를 서버에서 할당해주기 때문에, (클라이언트)

소스 포트 범위는 따로 적지 않는다.

다만 오른쪽의 대상 포트 범위는 서버의 포트 범위 이기 때문에,

입력을 하는 데 단일포트만 입력해도 좋고 포트 범위를 입력해도 좋으나

필자는 단일 포트로 입력했다.

그 이후 하단의 수신 규칙 추가 버튼을 클릭한다.

자 이제 외부에서 접근할 수 있는 1차 관문은 끝났다.

그러나 이게 다가 아니다.

왜냐하면 리눅스 자체 방화벽이 있기 때문에 접근할 수 있는 포트를

방화벽 해제 해주어야 한다.

지금부터는 centos 와 우분투에 따라 문법이 다르기 때문에,

한가지를 선택해서 글을 남기는데,

필자는 CentOS를 선호하기 때문에 CentOS기준으로 해보자.

상식적으로 서버에서 몇개의 포트를 오픈하자고 방화벽을 전부 꺼버리면

보안에 취약하기 때문에 사용할 포트만 방화벽을 해제하고 사용하는 것이 중요하다.

  1. 특정 포트 방화벽 추가

sudo firewall-cmd --permanent --add-port=80/tcp

cmd는 firewall 의 명령어라는 뜻이고

permanent 는 영구적으로 방화벽에 추가하겠다는 뜻이다.

add는 추가하겠다는 뜻이다.

만약 root 권한으로 접근했을 때는 sudo를 뺴고 입력해도 무방하다.

2. 특정 포트 방화벽 해제

sudo firewall-cmd --permanent --remove-port=80/tcp

위와 달리 방화벽에서 해당 포트를 삭제하겠다는 의미이며,

이것을 해야 외부에서 접근이 가능해진다.

더 많고 자세한 부분은 이분의 블로그를 참고바랍니다.

https://uxgjs.tistory.com/162

이것으로 외부에서 접근 가능한 최소한의 조치는 끝났다.

상황에 따라 개발자들이 서버의 튜닝이 필요할 때 지속적으로 해야 한다.

다음 포스팅에서는 SSH 로 접근 가능할 수 있도록

리눅스 및 윈도우 환경에서 SSH KEY를 만들어 접근하는 방법을 알아보겠다.

서버를 원격으로 연결하여 프로그램을 실행한 이후,

터미널로 봤을 때는 프로그램이 정상적으로 실행되고 있지만

터미널 세션을 종료하면 프로그램이 같이 종료되는 경우가 있다.

터미널을 종료해도 프로그램을 실행할 수 있도록 하는 방법이 몇 가지 있지만

제일 쉬웠던 방법만 써본다.

  1. 평상시 프로젝트 실행 명령
npm run start

   2. 개선 방법

nohup npm run start & exit

nohup 명령어로 실행하고

exit 의 경우에는 따로 입력하여 종료한다.

나같은 경우 터미널을 그냥 x버튼을 클릭하여 종료했는데

그러면 nohup 명령어가 정상적으로

실행되지 않기에

exit 로 안전하게 터미널을 빠져나간다.

요즘 웹사이트들은 보안인증을 위해 기본적으로 HTTPS 를 적용한다.

그러므로 NginX 환경에서 SSL 인증을 해볼 것이다.

SSL 인증서는 기본적으로 구매를 해야 하는 데,

나의 경우에는 개발서버에 구축을 해야 하다보니 금액이 부담스러워

무료 SSL 인증서를 써야 했다.

고맙게도 무료 SSL 인증서를 만들어주는 곳이 있으니 그것을 활용해보자.

(90일간 사용가능하며, 인증서 갱신 가능)

 

https://letsencrypt.org/ko/docs/

필자의 경우 CentOS 에서 하므로, Yum 으로 통일한다.

1.Certbot 설치

sudo yum install certbot

정상적으로 설치되면 아래와 같이 나올 것이다.

Certbot 이 설치되었으니 SSL 인증을 할 도메인을 등록해주어야 한다.

2. 도메인 등록

sudo certbot certonly --standalone -d 도메인주소

위와 같은 명령어를 실행하고 필자의 경우 중간에 아래와 같은 에러가 발생했는 데,

80포트가 중첩되어 발생한 에러였다.

현재 사용하고 있는 80포트는 NginX 였으므로, NginX 를 stop 시키고 다시 명령어를 실행했다.

3. NginX Stop, 도메인 등록 재실행 (포트가 중첩되었을 경우에만 해당)

sudo systemctl stop nginx sudo certbot certonly --standalone -d 도메인주소

다시 명령어를 실행하는 경우 따로 질문을 하지않고 인증서가 등록된다.

여기서 fullchain.pem 과 privkey.pem 의 경로를 꼭 기억하고 있어야 한다.

향후 Nginx 파일을 수정할 때 작성하기 때문이다.

그 다음으로 해당 인증서가 없어질 수도 있기 때문에,

다른 곳에 따로 백업을 해두자.

4. 인증서 백업

sudo cp -r /etc/letsencrypt/ /home/사용자 // etc에 있는 letsencrypt를 , 사용자 경로로 복사

경로는 본인 입맛에 맞는 곳으로 설정하자.

꼭 안해도 되지만, 안전을 위해 해두는 것이 좋을 것 같다.

5. default.conf 파일 수정

여기서부터 상당히 중요한데, SSL 도입을 하는 경우 앞선 포스팅의 리버스프록시 부분보다

많은 부분이 수정된다.

cd /etc/nginx/conf.d // conf.d 폴더로 이동 sudo vim default.conf // default.conf 파일 수정

전체 소스

server {
                listen 80 default_server;
                server_name 도메인주소.kr;
                return 301 https://$host$request_uri;  
        }
server {
                listen 443 ssl http2  ;
                listen [::]:443 ssl http2  ;
                server_name localhost;
                ssl on;
                ssl_certificate /etc/letsencrypt/live/도메인주소/fullchain.pem;
                ssl_certificate_key /etc/letsencrypt/live/도메인주소/privkey.pem;
                ssl_session_timeout 1d;
                ssl_session_cache shared:SSL:50m;
                ssl_session_tickets off;
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                ssl_prefer_server_ciphers on;
                resolver 8.8.8.8;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
                proxy_buffer_size 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
                keepalive_timeout 10;
                location / {
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade;
                        proxy_set_header Connection "upgrade";
                        proxy_pass http://localhost:3000;
       }
}

 

소스를 분석해보자.

* 전체 개요

나의 경우 http 로 접근을 하든, https 로 접근을 하든, 80포트에서 3000번 포트로

포트포워딩을 해줘야하는 상황이었다.

그래서 1차적으로 80포트로 접근했을 때 아래와 같은 443포트로 이동시켰고,

443포트 내에서 리버스프록시로 서버내의 3000포트로 이동시켰다.

* SSL 설정

이부분은 구글링을 하다보니 옵션이 매우 상세해서, 공식문서를 참고하셔도 좋으나

필요없는 부분도 있기에 내가 설정한 것만 사용해도 좋을 것 같다.

SSL 설정 부분

다른부분은 복사해서 붙여넣어도 상관없으나,

ssl_certificate 와 ssl_certificate_key 부분은 각자 도메인 및 경로에 맞는 것으로 설정을 해주자.

옵션별로 자세한 해설은 나중에 다뤄보겠다.

6. Nginx 재시작

sudo systemctl restart nginx

HTTPS 적용한 모습

성공 !

* 오류

1. 쿠키 문제

나의 경우 다른사람의 글대로 적은 데로 세팅을 해도 안됐다.

그런데 알고보니 개발환경에서 특정 URL 로 너무 리다이렉트되서

접근이 안되던 것이었다.

그럴 경우에는 쿠키를 삭제해주면 된다.

https://support.google.com/chrome/answer/95647?hl=ko&visit_id=637946724970155827-1235010596&p=rl_error&rd=1#zippy=%2C%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%97%90%EC%84%9C-%EC%BF%A0%ED%82%A4-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0

2. 도메인 문제

서버 내에서 등록된 도메인으로 적을 경우 리다이렉트 안되는 문제가

발생하여 localhost로 바꾸니 정상 적용된다.

서버에서 관리자말고 사용자로 들어가 접근할 때가 있다.

사용자를 만들어주자.

useradd [사용자계정명] // 계정 만들기 passwd [사용자계정명] // 비밀번호 설정

매우 간단하죠?

서버 설정 가끔씩 하는 데, 가끔 까먹을 때가 있어 기재해놓는다. 나의 개발환경은

리눅스(CentOS),Nginx, 도커, 스벨트,스프링부트, MariaDB 환경이다.

(도메인 갱신은 Let's encrypt)

  1. ELCAP 방화벽 설정

2. 서버에 firewalld 설치

sudo yum install firewalld // 설치
sudo systemctl start firewalld // 시작
sudo systemctl enable firewalld // 재부팅해도 자동실행하도록 등록

 

3. 특정포트 허용(위의 ELCAP 방화벽 관리의 포트를 허용해준다고 보면 됌)

sudo firewall-cmd --zone=public --add-port=80/tcp --permanent // 80 포트 허용 .. 이하 생략

4. 특정 서비스 허용(http,https 등)

sudo firewall-cmd --zone=public --add-service=https --permanent // https 허용 .. 이하 생략

했을 때 success 라고 나오면 된 것임

5. firewalld 업데이트

sudo firewall-cmd --reload

이제 방화벽을 업데이트하자

6. firewalld 업데이트 후 등록된 리스트 확인

sudo firewall-cmd --list-all

방화벽 설정은 이제 끝났다.

이쯤에서, 소프트웨어 패키지 도구인 epel 을 설치해보자

7. epel-release 설치

sudo yum install epel-release // epel 설치

중간에 질문을 할텐데, y눌러주면 됌

8. MariaDB 버전 설정

cd /etc/yum.repos.d   // 해당경로 이동
touch MariaDB.repo   // MariaDB 설정용 파일 생성
vim MariaDB.repo  // 해당 파일 접근

 

vim으로 접근한 MariaDB.repo에 아래 내용 작성

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.6/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

 

나의 경우 10.6버전대를 사용, 위와 같이 설정한다.

9. mariadb 설치

sudo yum install mariadb-server

epel 로 설치되는 것을 볼 수 있다.

10. 시스템 등록 및 시작

sudo systemctl start mariadb // MariaDB 서비스 시작
sudo systemctl enable mariadb // 재부팅시에도 동작하게 등록

11. 비밀번호 설정

MariaDB의 경우 초기비밀번호는 공백이기 때문에 개나소나 들어올 수 있다.

바로 비밀번호 설정을 해준다.

sudo mysql_secure_installation // 보안설정

 

위와 같이 root 비밀번호 세팅할거냐 물어보면. y 눌러주고 현재 비밀번호가 공백이기 때문에

그냥 엔터누르면 바꿀 비밀번호 입력하고 확인 비밀번호까지 입력하면 성공처리된다.

그 외 보안옵션이 있지만 취향껏 설정한다.

12. 최종체크

데이터베이스 세팅 및 테이블 세팅은 별개로 한다.(자기 개발환경에 맞춰서)

13. Nginx 설치

설치전 내 블로그를 참조해보고 진행하면 좋다.

https://blog.naver.com/ohks486/222832867066

sudo yum install nginx

14. Nginx 경로 이동

cd /etc/nginx/conf.d

15. default.conf 파일 생성

디렉토리로 접근했는데, default.conf 파일이 없을 경우 만들어준다. 있으면 안 만들어도 됌

touch default.conf

 

16. default.conf 파일 수정(중요)

sudo vi default.conf // vim으로 해도됌

17. 각 도메인별 서버 설정한다.

 

server {


     if ($http_user_agent ~* (AhrefsBot|BLEXBot|DotBot|SemrushBot|Eyeotabot|PetalBot|MJ12bot|brands-bot|bbot|AhrefsBo|MegaIndex|UCBrowser|Mb2345Browser|MicroMessenger|LieBaoFast|Headless|netEstate|newspaper|Adsbot/3.1|WordPress/|ltx71) ) {
    return 403;
  }

                        listen 80 default_server;
                        server_name *.도메인.kr;
                        return 301 https://$host$request_uri;

        }


server {
                listen 443 ssl http2;
                listen [::]:443 ssl http2;
                server_name test.도메인.kr;
                ssl_certificate /etc/letsencrypt/live/test.도메인.kr/fullchain.pem;
                ssl_certificate_key /etc/letsencrypt/live/test.도메인.kr/privkey.pem;
                ssl_session_timeout 1440m;
                ssl_session_cache shared:SSL:50m;
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                location / {
                 proxy_pass http://localhost:8081/;
                         proxy_read_timeout 600s;
                         proxy_send_timeout 600s;
                         proxy_redirect off;
                         proxy_pass_header Server;
                         proxy_set_header Host $http_host;
                         proxy_set_header X-Real-IP $remote_addr;
                         proxy_set_header X-Scheme $scheme;
                         proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
                         proxy_set_header X-Forwarded_Server $host;
                         proxy_set_header X-Forwarded-Host $host;
                         proxy_set_header Upgrade $http_upgrade;
                         proxy_buffer_size 128k;
                         proxy_buffers 4 256k;
                         proxy_busy_buffers_size 256k;
                         proxy_http_version 1.1;
               }

}

server {
                listen 443 ssl http2;
                listen [::]:443 ssl http2;
                server_name test.도메인.kr;
                ssl_certificate /etc/letsencrypt/live/test.도메인.kr/fullchain.pem;
                ssl_certificate_key /etc/letsencrypt/live/test.도메인.kr/privkey.pem;
                ssl_session_timeout 1440m;
                ssl_session_cache shared:SSL:50m;
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                location / {


                 proxy_pass http://localhost:3000/;
                         proxy_read_timeout 600s;
                         proxy_send_timeout 600s;

                         proxy_redirect off;
                         proxy_pass_header Server;
                         proxy_set_header Host $http_host;
                         proxy_set_header X-Real-IP $remote_addr;
                         proxy_set_header X-Scheme $scheme;
                         proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
                         proxy_set_header X-Forwarded_Server $host;
                         proxy_set_header X-Forwarded-Host $host;
                         proxy_set_header Upgrade $http_upgrade;
                         proxy_buffer_size 128k;
                         proxy_buffers 4 256k;
                         proxy_busy_buffers_size 256k;
                         proxy_http_version 1.1;
                 }
        }

18. Let's encrypt 설치

설정은 다했는데.. nginx -t 로 테스트를 해보면 실패할 것이다.

왜냐하면 아직 Let's encrypt로 설정을 안했기 때문이다.

자세한내용은 여기 참고

https://blog.naver.com/ohks486/222833865442

sudo yum install certbot

19. 도메인 등록

sudo certbot certonly --standalone -d 도메인주소

만약 80포트 관련 에러가 나올 경우, nginx stop 후 다시 진행한다.

sudo systemctl stop nginx sudo certbot certonly --standalone -d 도메인주소

위와 같이하면 인증서가 나오는데, nginx 에서 서버설정 시 인증서 경로를 추가해주자

20. Docker 설치

 

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io​

21. Docker 서비스 시작 및 등록

sudo systemctl start docker
sudo systemctl enable docker

22. Docker login

docker login

docker 로 실행하기 때문에 Node.js, 자바 등은 별도로 설치하지 않는다.

이상 끝~

** 혹시 서비스 접근했는데 502 에러 나올 시 조치방법이다. **

vi /var/log/nginx/error.log 내용

13: Permission denied) while connecting to upstream

나의 경우 https만 안되었다.

setenforce 0 // SEL Linux를 disable 처리한다.
sestatus // SEL Linux 상태확인

sestatus를 하면 위에 sentenforce를 0으로 했기 때문에 아래와 같이 간단하게만 나올 것이다.

 

그럼 이제 이부분을 편집해보자.

RHEL/CentOS 8 일경우

vi /etc/selinux/config

RHEL/CentOS 7 일경우

vi /etc/sysconfig/selinux

아래 SELINUX = enforcing 으로 수정한다.

그다음, 서버를 재시작한다.

reboot

+ Recent posts