Ubuntu-Node-MySQL 설정하기

Marullo·2020년 12월 4일
0

1. NaverCloud 사용

공인 ip와 서버 접속용 공인 ip의 차이

서버 접속용 공인 ip 서버 접속용 공인 IP는 내부 22번 포트로 접근하기 위한 통로가 된다고 보면 된다. NCloud 서버는 기본적인 공인 IP를 제공하지는 않지만 22번 포트(SSH, Windows: 3389)에 한해서 포트포워드 설정을 통해서 SSH 접근이 가능하다.

나의 경우, 22번 포트에 대해 5022번 포트로 연결했다.PUTTY로 서버접속용 공인 IP에 5022번 포트를 입력하면, 알아서 22번 포트로 이동시켜준다. 다른 포트로는 서버 접속용 ip를 입력해도 연결 되지 않는다.SSH 이외의 접근에는 공인 IP를 사용해야 한다. 포트포워딩을 통해

공인 ip 공인 IP는 서버에 할당 받아 사용하는 것이고, 포트포워딩 설정에서 IP는 서버 접속용으로 모든 서버들이 동일한 IP를 다른 포트를 통해 사용하는 것을 의미합니다. 서버 접속 이외의 목적으로 ‘IP’가 필요한 경우 공인 IP를 신청하여 사용해야 함

포트포워딩 & ACG

서버는 단 하나의 컴퓨터만 갖는 것이 아니다. SSH를 위한 컴퓨터, HTTP를 처리하기 위한 컴퓨터, MYSQL을 처리하긴 위한 컴퓨터 등 CLIENT의 요청을 각각의 컴퓨터가 분업하고 있으며, 서버는 그러한 컴퓨터들의 집합이다.즉 서버는 집이고, 각각을 처리하기 위한 방이 있다고 생각해야 한다.

도메인은 IP로 맵핑되고,IP로 서버라는 집에 도착하면포트번호로 방을 찾아가서 요청한다.




2. Ubuntu 설정

서버 인스턴스를 생성하고 ssh를 통해 접근해보자. 처음 서버에 접속할 때는 root로 접근할 것이다. 비밀번호는 클라우드 시스템에서 준 비밀번호를 입력하면 된다.

2-1 Ubuntu 계정 관리

2-1-1. 일반 사용자 생성

root로 접근하는 것은 아무래도 부담스러우니 사용자를 생성하자.

터미널에 adduser '아이디'를 입력하면 내가 원하는 패스워드를 입력할 수 있다.

2-1-2. 일반 사용자의 권한

root가 아닌 일반 계정으로 리눅스 서버에 로그인 한 후, 폴더를 생성하거나 프로그램을 설치 할때 권한이 거부되었다는 "Permission denied"메세지가 뜬다.

해당 명령어를 사용할 권한이 없어 발생한 오류이기 때문에, root 권한을 잠시 빌려야 되는데 이때 사용하는 명령어가 sudo다. 예를 들어 sudo apt-get install mysql-server 이런식으로 root의 권한을 빌려 프로그램을 설치 할 수 있다.

그러나, 이것도 부족하다. 저렇게만 써주면 "아이디 is not in the sudoers file"이라는 오류가 발생한다. sudo 명령어만 사용하면 root권한을 얻을 수 있는 것이 아니기 때문이다.

해당 아이디에 sudo 권한을 주고 싶다면 vim /etc/sudoers 명령어를 터미널에 입력하는데, sudoers파일은 sudo명령어를 사용할 수 있는 계정들을 가지고 있는 파일이다. 해당 파일에 sudo 명령어를 사용하게 하고픈 id를 추가해주면 된다.

root 계정과 똑같은 형식으로 행을 추가해주면 된다.

readonly라고 하면서 저장이 안된다면 명령어 뒤에 !를 붙여 강제로 실행하면 된다.

  • sudo -i 명령어는 root 계정으로 로그인하겠다는 뜻이다. (sudo 명령어와는 달리 root로 계정이 변경된 것을 확인할 수 있다.)
  • 다시 일반사용자로 돌아오려면 ctrl + d 를 입력하면 된다.

2-1-3.비밀번호 없이 서버컴퓨터에 접근하기

ssh-keygen명령어를 통해 공개키-비밀키 형식으로 서버에 접근할 수 있다.

이것에 대해 더 공부해보도록

2-2.Ubuntu 환경 설정

2-2-1.패키지 매니저 업데이트

sudo apt-get update

sudo apt-get upgrade

명령어를 순차적으로 터미널에 입력해서, 패키지 매니저를 최신 상태로 만들자.

2-2-2. 로케일 설정

  • Locale이란?
  1. locale 확인 방법

    1. 우리 서버의 Locale을 확인하고자 한다면 터미널에 locale을 입력한다. 아무런 설정도 하지 않았다면 en-US.UTF-8로 도배가 되어있을 것이다.
  2. 한글패키지 설치

    1. 앞서 말했듯이, 어떤 것을 설치하기 전에 패키지 매니저를 최신 상태로 만드는 습관을 들여야 한다. sudo apt-get updatesudo apt-get upgrade 를 먼저 입력하자.
    2. sudo apt-get install language-pack-ko 로 한글 패키지를 설치하자.
  3. Locale 설치

    1. sudo locale-gen ko_KR.UTF-8로 한국 Locale을 설치 한다.
  4. OS의 Locale 설정

    1. sudo -i 명령어로 root 계정으로 변경하자. 당연히 중요한 일이니까 root 계정으로 해야겠지??? ㅋㅋㅋㅋ 추측

    2. 아래와 같이 명령어 입력

      cat << 'EOF' > /etc/default/locale
      LANG="ko_KR.UTF-8"
      LANGUAGE="ko_KR:ko:en_US:en"
      EOF
  5. 재부팅 후 locale 명령어 입력하면 locale이 변경된 것을 확인 할 수 있다.




3. MySQL 설치

  1. sudo apt-get update
  2. sudo apt-get upgrade
  3. sudo apt-get install mysql-server
  4. mysql_secure_installation

어떤 프로그램을 설치할 때, 내 서버의 패키지 매니저를 최신상태로 만들어야 한다. MySQL설치에도 당연히 적용되는 이야기다.sudo apt-get updatesudo apt-get upgrade 명령어를 순차적으로 터미널에 입력해서, 패키지 매니저를 최신 상태로 만들자.

sudo apt-get install mysql-server 로 mysql server 를 설치하자. 중간에 root비밀번호는 설정하는 것이 좋다. 근데 이유를 모르겠네 어차피 다음 단계 때문에 나가리 되는 것 아닌가

mysql_secure_installation 명령어로 기본 보안 설정을 할 수 있다. 해당 명령어를 실행하면 여러 질문들이 나오게 되는데 잘 읽어보고 결정하면 된다.

질문 1: "Change root password?" → [N]

설치시에 비밀번호 설정을 안했으면, root 패스워드를 설정할 것이냐는 질문이 나올 것인데, [Y]를 누르고 비밀번호 설정해주면 된다.

질문 2: "Remove anonymous users" → [Y]

익명 사용자로 접속하는 해킹 공격을 방지하기 위해서 익명 사용자의 로그인을 차단하도록 Y를 선택한다.

질문 3: "Disallow root login remotely?" → [Y]

root 사용자로 접속하는 해킹 공격을 방지하기 위해서 root 사용자의 원격접속을 차단한다.

질문 4: "Remove test database and access to it?" → [Y]

기본적으로 생성된 test 데이터베이스를 삭제할 것이냐는 질문, 사용 안할 것이므로 [Y]

질문 5: "Reload privilege tables now?" → [Y]

privilege table을 reload하면 설정이 적용되는데, 지금 바로 reload시키기 위해 [Y]


4.MySQL 설정

https://medium.com/@js230023/리눅스-mysql-설정-1701ba44da9c

1. MySQL 계정 생성

root사용자의 권한이 너무 막강하기 때문에 root사용자를 사용하지 않는다.

데이터 베이스의 모든 정보를 삭제할 수도 있고 테이블이나 데이터 베이스 자체를 삭제해 버릴 수도 있다.따라서 개발자들에게는 특정한 스키마에만 접속을 허용하고 개발에 필요한 select, update, insert, create와 같은 일부 권한만 허용하는 사용자 계정과, 데이터베이스의 모든 권한을 사용할 수 있는 DBA(DataBase Administrator)용 계정을 따로 만들어서 사용한다.

또한 데이터베이스는 특성상 해킹 공격을 당하기 쉽다. 이런 경우 기본적으로 root 사용자로 접속을 시도하는 경우가 많기 때문에 외부에서 root의 접근을 허용하지 않는다. 앞의 mysql_secure_installation 명령에서도 root의 외부접근을 차단했다.

sudo mysql 을 통해 접속하려고 하지만 안될 것이다. 따라서 우리는 mysql -u root -p를 통해 mysql에 접속할 것이다. 앞에서 MySQL보안 설정을 진행했기 때문에 바로 MySQL로 접속할 수가 없다. 따라서 -u root로 root 사용자로 접속할 것을 지정하고 -p로 비밀번호를 입력함.(되지 않는다면 앞에 sudo를 붙이자.)

!!! 유저를 생성하기 위해선 root로 로그인해야 한다. 또 root의 외부접속을 막았으니 ssh로 서버컴퓨터에 접속해서 mysql을 켜야한다.

접속이 되었다면 유저를 생성하자

create user '사용자 id'@'호스트' identified by '비밀번호';를 통해 계정을 생성 할 수 있다.

  • 여기서 호스트가 중요한데, 호스트는 ip주소, %, localhost 세개로 나눠진다.
  • localhost란 MySQL이 설치되어 있는 서버를 의미한다. 따라서 localhost로 지정하면, 해당 계정은 해당 서버에서만 mysql에 접속할 수 있다. 즉 외부 접속은 불가능하다.
  • %로 호스트를 지정하면, 외부접속이 가능해진다. 어디서든 접속이 가능하게 하여 우리가 개발을 할 수 있게 하자 ㅎㅎ

use mysql; 명령어로 mysql데이터베이스를 선택하고

select user, host from user; 명령어로 어떤 계정들이 있는지 확인할 수 있다.

권한을 부여하자

원하는 데이터베이스에만 접근할 수 있도록 하기 위해, 먼저 데이터베이스를 생성하자

CREATE DATABASE sprintdb; sprintdb라는 데이터베이스를 생성

SHOW DATABASES; 를 통해 데이터베이스 명령을 확인할 수 있다.

GRANT ALL ON sprintdb.* TO 'j190'@'%'; 명령어로 권한을 부여한다.

j190 계정에게 sprintdb의 모든 테이블에 모든 명령에 대한 권한을 주었다.

ALL 대신에 INSERT, DELETE, SELECT를 적어주면 해당 명령어만 수행할 수 있다.

FLUSH PRIVILEGES; 명령어로 변경된 내용을 반영하게 한다.

SHOW GRANTS FOR '사용자계정'@'호스트'; 를 통해 해당 id의 권한을 확인할 수 있다.

2. MySQL 외부접속 허용

WorkBench나 HeidiSQL등을 이용하여 서버 공인 IP 3306번 포트로 접속을 시도하면, 접속이 안될 것이다. MySQL에서 외부접속을 허용한 계정으로 접속을 시도하는데 왜 안될까?

???? 어디갔냐

3. MySQL utf-8 설정

리눅스의 경우 mysql이 처음 설치되면 latin 1으로 초기설정이 되어있다. 한글 처리를 위해 utf8로 설정을 바꾸는 것이 좋다.

  1. sudo -i 로 root 계정으로 접속한다.

  2. 아래와 같은 명령어로 utf-8 설정으로 바꿀 수 있다.

    $ cat << 'EOF' > /etc/mysql/mysql.conf.d/utf8.cnf
    # for utf8 characterset
    [client]
    default-character-set = utf8
    
    [mysqld]
    init_connect = SET collation_connection = utf8_general_ci
    init_connect = SET NAMES utf8
    character-set-server = utf8
    collation-server = utf8_general_ci
    
    [mysqldump]
    default-character-set = utf8
    
    [mysql]
    default-character-set = utf8
    EOF
  3. sudo systemctl restart mysql 을 통해 재시작하자.

  4. mysql에 접속하여 status 명령어를 치면 character-set이 utf-8로 바뀐 것을 확인할 수 있다. (아직은 sudo mysql로 접속할 수 없을 것이다. → mysql -u root -p로 접속하자.)

  • cat /etc/mysql/my.cnf 명령어를 통해, 제일 마지막 두줄을 확인해보자.

4.자동시작 설정

서버가 재부팅 되더라도, mysql이 자동으로 재시작 되게 하려면 systemctl 명령어를 사용한다.

  • systemctl 명령어 - service_name은 서비스 이름으로 바꾸어 사용합니다.
  • 서비스 상태 확인 ****systemctl status service_name.service
  • 서비스 시작 ****systemctl start service_name.service
  • 서비스 재시작 ****systemctl restart service_name.service
  • 서비스 중지 ****systemctl stop service_name.service
  • 부팅 시 서비스 자동 시작 ****systemctl enable service_name.service
  • 부팅 시 서비스 자동 시작 해제 ****systemctl disable service_name.service
  • 서비스 목록 보기 ****systemctl list-units --type=service

따라서 우리는 systemctl enable mysql.service 명령어를 입력한다.




4. Ubuntu에 Node 설치

sudo apt-get install nodejs

sudo apt-get install npm

git clone -b J190 --single-branch 링크

npm install

npm start

→ 오류 발생

node에 버전을 확인해보자 node -v

npm 버전도 확인해볼까 npm -v

apt 패키지 매니저는 node 4.~.~을 가져왔다.

내 로컬의 node는 12.~.~인데

당연히 지원하는게 많지 않겠지

따라서, node js를 최신버전으로 받아와야한다.

node의 버전관리자인 nvm을 설치하자

apt 패키지 매니저 대신, Node.js version manager인 nvm을 이용하여 설치할 수 도 있습니다.

nvm을 이용하면 Node.js의 여러 버전을 설치하고 쉽게 환경 관리를 할 수 있습니다.

우선 우분투 저장소에서 nvm 설치에 필요한 패키지들을 설치합니다.

sudo apt-get update
sudo apt-get install build-essential libssl-dev

다음으로 nvm 설치 스크립트를 다운로드 후 실행시켜 줍니다.

curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh -o install_nvm.sh
bash install_nvm.sh
source ~/.profile

설치가 완료되면 home 디렉터리에 ~/.nvm 폴더가 생성됩니다.

설치 가능한 Node.js 버전 목록을 확인하기 위해서 다음과 같이 입력하면 됩니다.

nvm ls-remote
# 결과

v5.8.0
v5.9.0
v5.9.1
v5.10.0
v5.10.1
v5.11.0
v6.0.0

원하는 버전을 선택한 후 다음과 같이 설치하면 됩니다.

로컬과 똑같은 버전인 12.18.3을 다운받자

nvm install 6.0.0

여러 버전의 Node.js를 설치했다면 다음과 같이 특정 버전으로 변경하여 사용할 수 있습니다.

nvm use 12.18.3

nvm을 이용하여 Node.js를 설치하면 1, 2번 방법과 달리 node 명령어를 사용해야 합니다.

node -v
# v6.0.0

설치된 Node.js 버전 목록을 보려면 다음과 같이 입력하면 됩니다.

nvm ls

출처:https://itstory.tk/entry/Ubuntu-1604-nodejs-와-npm-설치




5. Node와 MySQL 연동

node 에서 mysql 을 연결할 때 사용하는 tool로 mysql.js, mysql2.js 가 있다. mysql 과 mysql2 가 다른점은 대표적으로 promise 지원의 차이가 있습니다.

npm install --save mysql2 로 mysql2를 설치하자.

이후require('mysql2')를 통해 라이브러리를 가져오면, db와 연결할 수 있는 메소드를 사용할 수 있다.

profile
한국외대 중국어&컴공 복수전공 - 세미 전공자의 기술 블로그

0개의 댓글