Bài viết này chúng ta sẽ tìm hiểu về quá trình deploy một ứng dụng NodeJS lên production thông qua VPS CentOS 7.

Trong bài viết, chúng ta sẽ mặc định user là  root  và ip của server là:  123.456.7.89 

 

Step 1: Connect đến VPS

ssh [email protected]

 

Nhập password và nhấn enter.

 

Step 2: Cài đặt môi trường

1. Cập nhật phần mềm

yum update

Tạo folder và cấp quyền read and write

mkdir /home/varum
sudo chown -R $(whoami) /home/varum

2. Install Git

sudo yum install git

 

Kiểm tra version git xem đã cài đặt thành công hay chưa

git --version

 

3. Cài đặt Node và npm

3.1 Thêm nodesource v16 vào yum

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

Bạn cũng có thể cài đặt các version bằng cách thay đổi setup_16

 

3.2 Install Node

sudo yum install nodejs

 

3.3 Kiểm tra version của node và npm

node --version
npm --version

 

4. Install Yarn

4.1 Thêm Yarn repo vào yum

curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo

 

4.2 Install Yarn

sudo yum install yarn

 

5. Install Database

Tùy thuộc vào dự án của bạn sử dụng database nào mà bạn sẽ cài đặt cho phù hợp. Ở đây mình sẽ hướng dẫn cài đặt cả MySQL và mongoDB.

 

5.1 Cài đặt MySQL

 

    1. Tải MySQL

curl -sSLO https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

 

    2. Prepare repository

sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

 

*Trường hợp bạn có 2 version mysql, bạn bắt buộc phải xóa 1 version đi

rpm -e --nodeps mysql57-community-release

* Disable all repositories in mysql repo

sed -i 's/enabled=1/enabled=0/' /etc/yum.repos.d/mysql-community.repo

* Lắp lại bước 2

* List MySQL Version

https://dev.mysql.com/downloads/repo/yum/

 

    3. Install MySQL

sudo yum install mysql-server

Trong quá trình cài đặt các bạn có thể cần bấm  để xác nhận một vài lần

 

    4. Start MySQL

sudo systemctl start mysqld

 

Kiểm tra xem MySQL đã active thành công hay chưa

sudo systemctl status mysqld

 

Nếu kết quả như hình thì MySQL đã được start thành công

 

    5. Truy cập vào MySQL và tạo database cho dự án

 

Khi cài đặt xong MySQL, một mật khẩu tạm thời cho root user sẽ được tạo.

 

Dùng câu lệnh sau để xem mật khẩu tạm thời

sudo grep 'password' /var/log/mysqld.log

 

Kết quả

 

Trong ví dụ trên mật khẩu chính là: a&Uskgq<E0<Y

 

Tiếp theo ta cần thay đổi mật khẩu tạm thời

sudo mysql_secure_installation

Sau đó nhập mật khẩu tạm thời và tạo mật khẩu mới.

*Lưu ý: Mật khẩu nên bao gồm chữ, số, chữ hoa, chữ thường và ký tự đặc biệt

 

Cuối cùng là connect vào MySQL và tạo Database

sudo mysql -u root -p

Nhập password mới

 

Tạo database tên  my_app 

CREATE DATABASE my_app;

 

Ngoài ra, để có thể connect đến MySQL từ xa bạn có thể tham khảo bài viết: Allow MySQL Remote Connections on CentOS, RHEL

 

5.2 Cài đặt MongoDB

    1. Tạo Mongo Repo

sudo vi /etc/yum.repos.d/mongodb-org.repo

Khi tạo file bằng vi, mặc định file sẽ được mở, để insert text bạn cần bấm phím i

 

Copy file cấu hình sau:

[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc

Bấm ESC và nhập  :x   để lưu

 

    2. Install MongoDB từ yum

sudo yum install -y mongodb-org

 

    3. Start MongoDB

sudo systemctl start mongod

 

    4. Tự động start MongoDB mỗi khi restart server

sudo systemctl enable mongod

 

Vậy là xong quá trình cấu hình môi trường cho project.

 

Step 3: Clone project

1. Tạo folder dự án

Di chuyển về folder home để dễ dàng quản lý

cd /home

 

Tạo folder dự án tên projects

mkdir projects

 

Di chuyển vào folder projects

cd projects

 

2. Clone project

Gen SSH Key

ssh-keygen -t ed25519 -C "[email protected]"

 

View SSH Key

cat ~/.ssh/id_ed25519.pub

 

Copy SSH Key và dán vào Github

 

git clone [email protected]:tranquocviet226/ngontumathuat.git

*Bạn có thể cần phải gen ssh và thêm vào setting trên git.

 

3. Cài đặt và run project

Ở đây mình ví dụ bằng project tên ngontumathuat

cd ngontumathat

Install môi trường

yarn

 

Cài đặt pm2 để project có thể liên tục chạy khi chúng ta disconnect khỏi server, ngoài ra pm2 còn có rất nhiều tính năng khác các bạn có thể tìm đọc pm2.keymetrics.io

yarn global add pm2

 

Chạy pm2 mỗi khi restart

pm2 startup systemd

 

Start project với pm2

npm run build
pm2 start dist/main.js --name api

 

Với api là tên ứng dụng bạn đặt để quản lý trên pm2

 

 

Step 4: Cấu hình Nginx

1. Install EPEL

sudo yum install epel-release

 

2. Install Nginx

sudo yum install nginx

 

3. Start Nginx

sudo systemctl start nginx

 

4. Tự khởi động Nginx

sudo systemctl enable nginx

 

5. Tắt tường lửa

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

Sau khi cài đặt Nginx bạn có thể gõ địa chỉ ip vào trình duyệt để xem kết quả.

 

6. Cấu hình Nginx kết nối đến project

    Truy cập vào /etc/nginx/nginx.conf và xóa bỏ server mặc định bằng cách xóa toàn bộ nội dung default server bên dưới dòng include /etc/nginx/conf.d/*.conf;

 

vi /etc/nginx/nginx.conf

 

    Tạo file config cho dự án node.js:

vi /etc/nginx/conf.d/ngontumathuat.conf

Chỗ ngontumathuat.conf các bạn có thể thay bằng bất kỳ tên gì khác.

Copy file config sau vào:

server {
    server_name _;
    client_max_body_size 12M; #Dong nay de tang gioi han dung luong request len 12Mb

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:3000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

 

Tại dòng  proxy_pass http://127.0.0.1:3000/; các bạn có thể thay đổi port 3000 thành các port khác phù hợp với dự án. Bởi vì mình dùng NodeJS nên port mặc định là 3000.

 

Restart Nginx

sudo systemctl reload nginx

 

Cuối cùng là truy cập vào ip trên trình duyệt và kiểm tra kết quả. Nếu gặp lỗi 502-bad-gateway thì có thể là lỗi với permission SELinux.

Bạn có thể chạy dòng lệnh sau

setsebool -P httpd_can_network_connect 1

 

Nếu vẫn không được các bạn có thể check log của Nginx và tiếp tục debug

vi /var/log/nginx/access.log

 

Ngoài ra để trỏ Domain về server các bạn có thể tham khảo bài viết:

https://ngontumathuat.com/post/cau-hinh-domain-cho-server-voi-nginx-DwXhEJ90I9nxjcAXt3xo

 

Vậy là xong. Done!