Unbuntu + Node.js + MySQL

Ubuntu에 Node.js와 MySQL을 설치하는 과정에 대한 글입니다.

컴퓨터 대여

직접 컴퓨터를 사서 관리할 수 없으니 Vultr 에서 아래와 같은 성능의 가상 컴퓨터를 빌려서 사용했다.

처음에는 조금 더 싼 가격의 제품을 선택했었는데, Webpack으로 React Project를 Build하는 중에 메모리 부족으로 인한에러가 떠서 Memory가 2GB인 위의 제품으로 업그레이드 했다.

AWS와 달리 우리나라에 서버가 없기 때문에 그나마 가까운 일본을 선택했고,

사람들이 많이 쓰는 Ubuntu 16.04를 기본 운영체제로 선택하고,


아까 말한 성능의 컴퓨터를 선택한뒤

나머지는 필요에 맞게 해주면 되는데, 나는 아래와 같이 아무 추가적인 설정을 하지 않고 그냥 Deploy Now를 클릭해서 컴퓨터 대여를 완료했다.

서버 접속

방금 빌린 컴퓨터에 접속하기 위해서는 2가지 방법이 있는데, 하나는 Vultr에서 제공하는 Web Console을 이용하는것이고,

저 버튼을 클릭하면 콘솔창이 나온다

다른 하나는 내 터미널에서 접속하는것이다.

나는 내 터미널(Mac용 Command Line Tool)에서 접속하는게 더 편하기 때문에,
위의 IP Address & Username & Password 를 이용해서 서버 컴퓨터에 접속하였다.

$ ssh root@my-ip-address // 이후에 비밀번호 입력하고 접속하면 된다.

사용자 계정 생성

사용자 추가

$ adduser username

위처럼 치면 아래와 같이 패스워드를 입력하는 과정이 진행된다.

root@Voice_Car:~# adduser username
Adding user `username' ...
Adding new group `username' (1000) ...
Adding new user `username' (1000) with group `username' ...
Creating home directory `/home/username' ...
Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully

비밀번호를 설정하면 아래와 같이 사용자의 정보를 입력하는 과정이 진행된다. 대충 입력해도 되고, 안해도 된다.

Changing the user information for username
Enter the new value, or press ENTER for the default
    Full Name []:
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? [Y/n]

sudo group에 추가

사용자를 만들었으니 그 사용자를 sudo group에 추가시켜서 sudo command를 쓸 수 있도록 해야한다.

$ usermod -aG sudo username

테스트

root에서 username으로 사용자를 바꿔서

$ su - username

sudo 명령을 내려본다.

$ sudo whoami

그러면, root이라고 뜬다.

password없이 sudo 사용하기

확실하지는 않지만, 해당 유저가 sudo group에 포함되어 있는데도 sudo 명령어를 쓸때 비밀번호를 요구하는 경우가 있다.

/etc/sudoers 파일을 열어서, #includedir /etc/sudoers.d 이 코드 바로 뒤에 사용자명 ALL=NOPASSWD: ALL 이거를 추가해 주면된다. username은 당연히 본인의 username을 입력해 줘야한다.

Node.js설치

먼저 설치되어있는 패키지들의 새로운 버전이 있는지 확인한다.

$ sudo apt-get update

Node 10버전을 설치한다.

$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
$ apt-get install -y nodejs

다만, 라즈베리파 제로 모델에서는 위와 같은 nodesource로는 안된다. 이 글을 참고해서 진행해야한다.

MySQL설치

# 설치 가능한 MySQL 버전을 확인한다
$ sudo apt-cache search mysql-server
# MySQL 5.7을 설치한다
$ sudo apt-get install mysql-server-5.7

MySQL을 설치하고 root게정의 비밀번호를 설정하는 화면이 나오는데, 그냥 비밀번호 입력하면된다. 만약에 안나오면 그냥 초기 비밀번호로 root이 설정된것이다.

이제 MySQL이 잘 켜져있는지 확인해보자.

$ /etc/init.d/mysql status

위와 같이 치면, 아래와 같은 화면이 나온다.

Active로 나온다면 잘 실행되고 있다는 의미이다.

MySQL server 접속

$ sudo mysql -u root -p

초기 비밀번호 root을 입력해 주자.

접속 성공!

MySQL 계정 생성

# 사용자 계정 생성
create user '아이디'@호스트 identified by '비밀번호';

# 로컬 접속계정 생성
create user '아이디'@localhost identified by '비밀번호';

# 모든 IP로 접속가능한 계정 생성
create user '아이디'@'%' identified by '비밀번호';

이제 새로 생성한 계정에 아래와 같이 권한을 부여한다. 여기서 생성한 계정으로 다시 접속해서 grant하면 안되고, root계정으로 해야한다.

# 사용자 권한 설정
GRANT ALL PRIVILEGES ON 데이터베이스명.테이블명 TO '아이디'@'호스트' IDENTIFIED BY '비밀번호';

# 모든 데이터베이스, 모든 테이블, 모든 IP 접속 허용
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%' IDENTIFIED BY '비밀번호';

# 특정 데이터베이스, 모든 테이블  모든 IP 접속 허용
# ex) test 라는 데이터베에스의 모든 테이블, 모든 IP 접속하도록 권한부여
GRANT ALL PRIVILEGES ON test.* TO '아이디'@'%' IDENTIFIED BY '비밀번호';

# 모든 데이터베이스, 모든 테이블, 특정 대역 IP 접속 허용
# ex) 192.168 로 시작하는 IP에 대해 접속하도록 권한 부여
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'192.168.%' IDENTIFIED BY '비밀번호';

# 모든 데이터베이스, 모든 테이블, 특정 IP만 접속 허용
# ex) 192.168.22.33 IP에 대해 접속하도록 권한 부여
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'192.168.22.33' IDENTIFIED BY '비밀번호';

# 모든 데이터베이스, 모든 테이블, 로컬에서만 
GRANT ALL PRIVILEGES ON *.* TO '아이디'@localhost IDENTIFIED BY '비밀번호'; 

다음으로 변경된 권한을 반영한다.

flush privileges;

이제 MySQL설정이 끝났으니 exit; 명령어로 나가준다.

외부 접속 허용

우분투에서는 기본적으로 외부 접속을 막아놓기 때문에, 설정으로 MySQL 포트를 열어줘야한다. (기본 MySQL 포트 번호는 3306이다)

# MySQL 포트 외부접속 허용
sudo ufw allow (MySQL 포트번호)/tcp

이제 Listen IP 대역을 변경한다. 명령어를 입력하여 해당 경로이동한다.

cd /etc/mysql/mysql.conf.d
sudo nano mysqld.cnf

bind-address 부분을 #으로 comment 처리한다.

(참고로 ubuntu 16.04 미만에서는 /etc/mysql/my.cnf 여기로 들어가야한다)

그리고 mysql을 재시작해준다.

sudo /etc/init.d/mysql restart

MySQL 한글 설정

MySQL의 기본 언어셋은 latin1으로 설정되어있다. latin1로 설정되어 있으면 한글이 DB에 제대로 저장되지도 않고, 뺄때도 제대로 뺄수도 없다. 그래서 아래와같이 한글 설정을 해줘야한다.

$ sudo nano /etc/mysql/conf.d/mysql.cnf // mysql.cnf 파일 오픈

아래의 내용을 복사해서 붙여넣기 한다.

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
character-set-server=utf8
collation-server=utf8_general_ci
init_connect = set collation_connection = utf8_general_ci
init_connect = set names utf8

[mysql]
default-character-set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set=utf8

[client]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

위와 같이 설정이 끝났으면, 아래 명령어를 실행하여 MySQL을 재시작한다.

sudo /etc/init.d/mysql restart

이제 설정이 잘 반영되었는지 확인해 보자.

# MySQL 계정 로그인
mysql -u 아까만든계정아이디 -p

로그인 이후에 status로 mysql 상태를 확인한다.

DB생성

# DB를 만든다.
create database test_db01;

# 모든 DB를 보여준다
show databases;

Git설치

항상하는 업데이트 먼저 해준다.

$ apt-get update

git 설치

$ apt-get install git-core

git이 잘 설치되었는지 확인해본다.

$ git --version

git 유저 설정을 해준다.

$ git config --global user.name "testuser"
$ git config --global user.email "testuser@example.com"

Nginx

install

sudo apt-get update
sudo apt-get install nginx

settings

sudo nano /etc/nginx/sites-available/default

default 파일에 들어가서, 아래와 같이 입력해준다.

server {
  listen 80;
  server_name my-custom-domain.com;
  location / {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

참고로, 원래는 이런 코드가 들어있을 것이다. 삭 지우고 위처럼 입력해주면된다.

proxy

upload limit

Nginx는 기본적으로 1MB이상 업로드를 못한다. 이거를 해제해 주자.

sudo nano /etc/nginx/nginx.conf

파일 업로드 제한을 100MB로 확장.

http {
    client_max_body_size 100M;
}

그리고 각자의 서버프로그램에 맞는 설정을 해준다. 예를들어서 PHP같은 경우에는 php.ini파일에서 upload_max_filesize를 100M로 변경해주고, Node.js에서 multer라이브러리를 사용하는 경우는 아래와 같이 해준다.

const upload = multer({
    ...
    limits:{fileSize: 100000000} // about 100MB
});

이제 Nginx를 재시작한다.

sudo service nginx restart

PHP / Node.js도 재시작 하자.

유용한 명령어

에러로그 위치 : /var/log/nginx

설정파일을 잘 수정했는지 확인 : nginx -t

nginx 재시작 : systemctl reload nginx or service nginx restart

참고자료

  1. https://all-record.tistory.com/183
  2. https://stackoverflow.com/questions/26717013/how-to-edit-nginx-conf-to-increase-file-size-upload
  3. https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/
  4. https://serverfault.com/questions/160581/how-to-setup-passwordless-sudo-on-linux
  5. https://askubuntu.com/a/272435/891600

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Up Next:

publicPath의 역할

publicPath의 역할