Deploy ứng dụng Node.js lên VPS

Thường đối với một ứng dụng Node.js các bạn có thể deploy nó lên một số các dịch vụ miễn phí như Heroku nhưng nếu mình đã có một VPS thì tại sao mình không tận dụng nó để deploy ứng dụng Node.js của mình. Và hôm nay mình sẽ chia sẻ cho các bạn cách đưa một hoặc nhiều ứng dụng Node.js lên một máy chủ VPS. Chúng ta bắt đầu nhé 🙂

Deploy ứng dụng Nodejs lên VPS

Chạy một ứng dụng Node.js trên VPS

Bước 1: Tạo một repository.

Đầu tiên ta cần tạo một repository (github, bitbucket,…) để làm nơi lưu trữ sourcecode.

Ở đây mình không dùng FileZilla hay những cách khác để đưa sourcecode lên VPS mà mình dùng git vì dễ quản lý sourcecode, dễ dàng chỉnh sửa và còn nhiều lợi ích khác nữa mà mình sẽ nói ở phần sau.

Bước 2: Cài đặt Node.js

Đầu tiên các bạn cần phải thêm PPA của NodeSource theo cú pháp lần lượt:

$ cd ~
$ curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh
$ sudo bash nodesource_setup.sh

Cài đặt Node.js:

$ sudo apt-get install nodejs

Cài thêm gói build-essential hỗ trợ cho Node.js:

$ sudo apt-get install build-essential

Bước 3: Đưa sourcecode Node.js lên VPS

Đầu tiên ta phải cài đặt git cho VPS với cú pháp:

$ sudo apt-get install git

Tiếp theo bạn cần phải clone sourcecode của bạn về. Ở đây mình sẽ lưu vào trong thư mục /var/apps/demonodejs nên các bạn hãy tạo thư mục theo đường dẫn như mình nhé, hoặc lưu ở một nơi nào đó khác tùy các bạn.

$ git clone https://github.com/tuankhai0811/demonodejs.git /var/apps/demonodejs

Các bạn nhớ thay đường dẫn của các bạn vào nhé.

Sau khi clone về các bạn có thể chạy dòng lệnh sau để chạy ứng dụng:

$ node index.js

Quản lý ứng dụng Node.js bằng PM2

Các bạn để ý rằng nếu chúng ta chạy một ứng dụng Node.js bằng lệnh trên thì ta sẽ không thể thực hiện các lệnh khác hoặc chúng ta muốn chạy nhiều ứng dụng Node.js trên VPS thì cũng không thể dùng cách này được mà ta phải dùng đến PM2 để chạy và quản lý các ứng dụng Node.js của chúng ta.

Bước 1: Cài đặt PM2

Đầu tiên ta phải cài đặt PM2 với cú pháp sau:

$ sudo npm install -g pm2

Các bạn lưu ý là ở đây chúng ta sẽ sử dụng npm là một trình quản lý các module cho nodejs để cài đặt PM2.

Bước 2: Chạy ứng dụng Node.js với PM2

Để chạy một ứng dụng nodejs bằng PM2 ta thực hiện theo cú pháp:

$ pm2 start index.js

Sau khi chạy lệnh trên các bạn để ý rằng ứng dụng của chúng ta đã chạy và bạn hoàn toàn có thể thực hiện các lệnh khác và không ảnh hưởng gì đến nó. Hoặc các bạn cũng có thể chạy thêm nhiều ứng dụng khác với cú pháp tương tự như trên.

* Một số cú pháp thường dùng của pm2 để quản lý ứng dụng nodejs:

Dừng một ứng dụng:

$ pm2 stop app_name_or_id

Khởi động lại một ứng dụng:

$ pm2 restart app_name_or_id

Xem danh sách các ứng dụng đang chạy:

$ pm2 list

Xem các thông tin của ứng dụng:

$ pm2 info app_name_or_id

Xem mức CPU và bộ nhớ sử dụng:

$ pm2 monit

Xem log của ứng dụng:

$ pm2 logs app_name_or_id

Cấu hình Nginx làm Reverse Proxy Server

Như các bước ở trên thì ta thấy các ứng dụng Node.js chỉ chạy được dưới localhost của vps vì vậy ta cần phải thiết lập để người ngoài cũng có thể truy cập được vào ứng dụng. Ở bài trước mình có chia sẻ cách cấu hình Apache để chạy được nhiều Virtual Host trên một VPS thì Nginx cũng có chức năng tương tự như vậy. Bằng cách này các bạn có thể truy cập các ứng dụng của mình bằng các đường dẫn khác nhau thông qua IP của VPS.

Bước 1: Cài đặt Nginx

Cài đặt Nginx cho VPS theo cú pháp:

$ sudo apt-get install nginx

Bước 2: Chỉnh sửa file default

Mở tập tin cấu hình theo cú pháp:

$ sudo vi /etc/nginx/sites-available/default

Giờ ta xóa mọi thứ hiện tại đang có và chèn cấu hình như sau vào:

server {
    listen 8080;
    server_name localhost;
    location /app1 {
        proxy_pass http://localhost:3001;
        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;
    }
    location /app2 {
        proxy_pass http://localhost:3002;
        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;
    }
}

Ở đây chúng ta thấy server sẽ lắng nghe ở port 8080 thay vì mặc định là 80 vì port 80 đã được Apache sử dụng nên để tránh xung đột ta phải đổi sang một port khác.

Với app1 và app2 là đường dẫn của ứng dụng 1 và ứng dụng 2 tương ứng với 2 port 3001 và 3002. Ở đây mình chỉ chạy 2 ứng dụng nên mình sẽ có 2 thẻ location với cấu hình tương ứng. Các bạn cần sửa lại tên và đường dẫn theo đúng mục đích của các bạn, lưu ý là sau khi sửa xong phải lưu lại nhé.

Sau khi lưu xong ta cần phải kiểm tra xem file cấu hình ta mới sửa có bị lỗi cú pháp nào không và khởi động lại Nginx để chạy lại cấu hình mới:

$ sudo nginx -t
$ sudo systemctl restart nginx

Sau khi khởi động lại Nginx các bạn kiểm tra bằng cách truy cập đường dẫn:

http://example.com:8080/app1

Cấu hình Firewall bằng UFW

Ở đây mình dùng thêm UFW làm tường lửa cho VPS giúp quản lý các port và ngăn chặn các truy cập trái phép.

Đầu tiên ta cài đặt UFW với cú pháp:

$ sudo apt-get install ufw

Tiếp theo ta cần bật UFW lên:

$ sudo ufw enable

Và cấu hình cho phép UFW chấp nhận tất cả các port của Nginx:

$ sudo ufw allow 'Nginx Full'

* Một số cú pháp khác với UFW:

Xem trạng thái các port:

$ sudo ufw status

Bật cho phép SSH:

$ sudo ufw allow ssh

Cho phép một port được truy cập:

$ sudo ufw allow 2222

Từ chối một port được truy cập:

$ sudo ufw deny 2222

Xem danh sách các port với ID:

$ sudo ufw status numbered

Và cuối dùng là xóa một port khỏi danh sách theo ID hoặc Port:

$ udo ufw delete [ID]|Port

Lưu ý: Nếu bạn đang dùng VPS của Google thì bạn cần phải cấu hình thêm Port của VPS ở đây.

Nếu có khó khăn gì các bạn đừng ngại đặt câu hỏi bên dưới phần bình luận, mình sẽ cố gắng giúp các bạn trong phạm vi kiến thức của mình.

Nếu bài viết hữu ích ừng quên like/share để mình có động lực chia sẻ nhiều hơn.

Chúc các bạn thành công!

Chia sẻ bài viết:

1 thought on “Deploy ứng dụng Node.js lên VPS

Trả lời

Email của bạn sẽ không được hiển thị công khai.