Hướng dẫn deploy Node.js app lên VPS Linux Ubuntu - Phần 1

Hướng dẫn deploy Node.js app lên VPS Linux Ubuntu - Phần 1

Lời mở đầu

Với sự phát triển của ngành phần mềm hiện nay, việc chạy ứng dụng Node.js trên máy chủ ảo Ubuntu là một lựa chọn tối ưu cho các nhà phát triển. Nhờ vào tính ổn định và hiệu quả của hệ thống Ubuntu, ứng dụng của bạn sẽ luôn hoạt động mượt mà và sẵn sàng phục vụ người dùng. Vì thế trong bài viết này chúng ta sẽ tìm hiểu cách deploy Node.js app lên VPS Linux Ubuntu

Tại sao deploy Node.js app trên VPS Linux Ubuntu?

Trước tiên chúng ta hãy nói về ưu điểm của VPS:

  • Tính linh hoạt: Dễ dàng cấu hình và điều chỉnh theo nhu cầu của ứng dụng.
  • Khả năng tùy chỉnh cao: Cung cấp quyền kiểm soát chi tiết đối với môi trường triển khai.
  • Khả năng mở rộng: Có thể nâng cấp tài nguyên khi nhu cầu sử dụng tăng cao.

Và lợi ích của việc sử dụng Linux Ubuntu đó là hệ thống ổn định đảm bảo hoạt động trơn tru, bảo mật cao giảm thiểu nguy cơ bị tấn công và xâm nhập và cộng đồng hỗ trợ lớn cung cấp nhiều tài nguyên hướng dẫn.

Mục tiêu bài viết

Bài viết này sẽ hướng dẫn các bạn từng bước triển khai ứng dụng Node.js lên VPS chạy hệ điều hành Linux Ubuntu. Các bạn sẽ học cách cài đặt môi trường Node.js, cấu hình máy chủ VPS, và triển khai ứng dụng của mình sao cho hoạt động một cách hiệu quả và bảo mật.

Do bài viết cũng khá dài nên mình sẽ chia làm 3 phần nhé.

Chuẩn bị trước khi deploy Node.js app

Để bắt đầu vào deploy Node.js app lên VPS Linux Ubuntu thì các bạn cần chuẩn bị những thứ dưới đây:

  • VPS chạy hệ điều hành Linux Ubuntu: Khuyến khích cài đặt Ubuntu bản từ 18.04 trở lên. Nếu chưa có VPS các bạn có thể đăng ký tại inet.vn và nhập mã LAHOTECHCP để được giảm giá khi đăng ký.
  • Tên miền (domain): Tên miền đã trỏ đến IP của VPS. Nếu bạn nào chưa có tên miền có thể đăng ký tại inet.vn.
  • Ứng dụng Node.js: Đã được upload lên các dịch vụ lưu trữ mã nguồn như Github.
  • Công cụ SSH: Dùng để kết nối với VPS từ xa. Ở đây mình sử dụng MobaXterm.

Sau khi chuẩn bị xong những thứ trên chúng ta bắt đầu thôi.

Cài đặt Nginx cho VPS Ubuntu

Cài đặt Nginx

Vì Nginx có sẵn trong gói cài đặt của Ubuntu nên chúng ta có thể dễ dàng cài đặt bằng cách sử dụng apt. Trước tiên để đảm bảo các bản cập nhật và gói phần mềm mới nhất chúng ta cần cập nhật cơ sở dữ liệu của các gói phần mềm bằng cách chạy lệnh dưới đây:

bash
sudo apt update

Tiếp theo cài đặt nginx, trong lúc cài đặt các bạn cần phải bấm Y (Yes) để xác nhận cho apt cài thêm các gói thư viện cần thiết cho nginx:

bash
sudo apt install nginx

Thiết lập tường lửa (Firewall)

Trước khi chúng ta thiết lập service Nginx, cần phải thiết lập tường lửa để cho phép truy cập vào nó. Nginx nó sẽ tự đăng ký một service với ufw khi cài đặt. Vì thế chúng ta có thể thiết lập tường lửa để cho phép truy cập vào service Nginx dễ dàng hơn.

Liệt kê tất cả các configuration của ứng dụng mà ufw có thể thiết lập:

bash
sudo ufw app list

Nó sẽ in ra tất cả danh sách các profiles của ứng dụng mà chúng ta có thể thiết lập Firewall:

bash
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Trong danh sách trên có 3 profile cho Nginx:

  • Nginx Full: Đây là profile mở cả 2 port 80 và 443 (TLS/SSL encrypted traffic)
  • Nginx HTTP: Profile này chỉ mở cổng 80
  • Nginx HTTPS: Profile này chỉ mở cổng 443

Vì chúng ta chưa cài đặt SSL cho Nginx, nên chúng ta sẽ mở port 80 để thử nghiệm xem service Nginx có hoạt động như mong muốn hay không.

Chúng ta sẽ mở cổng 80 bằng lệnh sau:

bash
sudo ufw allow 'Nginx HTTP'
bash
Rules updated
Rules updated (v6)

Sau đó kiểm tra lại status bằng lệnh:

bash
sudo ufw status

Nếu bạn nào không hiện output như dưới đây thì hãy xuống dưới sang bước kế tiếp. Còn bạn nào có output như dưới đây thì là do chưa enable ufw, các bạn enable bằng lệnh sau:

bash
sudo ufw enable

Nếu nó hỏi Command may disrupt existing ssh connections. Proceed with operation (y|n)? các bạn bấm y để xác nhận nhé.

Bây giờ chúng ta sẽ kiểm tra lại status và kết quả hiện ra như sau:

bash
Status: active

To                         Action      From
--                         ------      ----
Nginx HTTP                 ALLOW       Anywhere
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Sau khi thiết lập tường lửa bây giờ chúng ta có thể kiểm tra web server đã hoạt động hay chưa

Lưu ý:

Một lưu ý quan trọng là chúng ta cần phải cho ufw allow cả OpenSSH vì lúc chúng ta enable ufw lên thì nó sẽ không tự động add rule OpenSSH vào nên không kết nối tới VPS bằng SSH được. Nếu quên bước này thì trong lần kết nối tiếp theo tới VPS sẽ không được.Chạy lệnh: sudo ufw allow 'OpenSSH' sau đó kiểm tra lại status ufw

Một lưu ý quan trọng là chúng ta cần phải cho ufw allow cả OpenSSH vì lúc chúng ta enable ufw lên thì nó sẽ không tự động add rule OpenSSH vào nên không kết nối tới VPS bằng SSH được. Nếu quên bước này thì trong lần kết nối tiếp theo tới VPS sẽ không được.Chạy lệnh: sudo ufw allow 'OpenSSH' sau đó kiểm tra lại status ufw

Kiểm tra Web Server

Khi quá trình cài đặt xong thì Ubuntu sẽ start Nginx lên và web server đã hoạt động. Kiểm tra systemd xem để chắc chắn rằng service đã và đang hoạt động

bash
systemctl status nginx
bash
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-03-03 09:17:37 UTC; 28min ago
       Docs: man:nginx(8)
    Process: 11020 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 11021 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 11127 (nginx)
      Tasks: 3 (limit: 2237)
     Memory: 4.6M
        CPU: 67ms
     CGroup: /system.slice/nginx.service
             ├─11127 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─11130 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             └─11131 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Mar 03 09:17:37 lahocore systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 03 09:17:37 lahocore systemd[1]: Started A high performance web server and a reverse proxy server.

Output ở trên các bạn sẽ kiểm tra thấy dòng Active: active (running) nghĩa là service Nginx đã hoạt động.

Bây giờ mở trình duyệt lên và truy cập tới địa chỉ IP VPS của các bạn. Nếu các bạn không nhớ thì có thể chạy lên sau:

bash
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Sau khi có được IP của máy chủ VPS thì truy cập trên trình duyệt như sau http://ip_vps_server 

Thiết lập Server Blocks

Ở bước này, chúng ta sẽ config tên miền cho web server. Hãy đảm bảo rằng tên miền của các bạn đã trỏ về IP của VPS.

Trong thư mục /etc/nginx/sites-available/ tạo một fiel mới với tên là tên miền của các bạn. Ví dụ tên miền của mình là example.com thì sẽ tạo file là /etc/nginx/sites-available/example.com. Chúng ta sẽ tạo bằng lệnh sau:

bash
sudo nano /etc/nginx/sites-available/example.com

Chỉnh sửa nội dung như dưới đây:

plain text
server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

Bấm Ctrl + X -> Y sau đó bấm Enter để lưu lại file.

Tiếp theo, kích hoạt file này bằng cách liên kết nó tới thư mục sites-enabled của nginx, nơi mà nó sẽ đọc trong khi khởi động:

bash
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Để tránh tình trạng vấn đề bộ nhớ hash bucket có thể phát sinh khi thêm các server names bổ sung, cần config giá trị biến server_names_hash_bucket_size trong file /etc/nginx/nginx.conf. Mở file nginx.conf lên:

bash
sudo nano /etc/nginx/nginx.conf

Tìm đến dòng có server_names_hash_bucket_size sau đó xoá kí tự # để uncomment dòng này:

plain text
...
http {
    ...
    server_names_hash_bucket_size 64;
    ...
}
...

Sau đó bấm Ctrl + X -> Y -> Enter để lưu lại file.

Tiếp theo chạy lệnh dưới đây để kiểm tra xem không có cú pháp nào lỗi trong các file cấu hình Nginx:

bash
sudo nginx -t

Nếu như hiện như dưới đây thì không có vấn đề gì

bash
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Sau đó thì restart lại Nginx

bash
sudo systemctl restart nginx

Cấu hình SSL/TLS cho web server Nginx bằng Let's Encrypt

Cài đặt Certbot

Đầu tiên để sử dụng Let's Encrypt để nhận một chứng chỉ SSL là cài đặt Certbot trên máy chủ của chúng ta.

bash
sudo snap install --classic certbot

Khi cài đặt thành công sẽ in ra phiên bản của Certbot

bash
certbot 2.9.0 from Certbot Project (certbot-eff✓) installed

Sau đó tạo một liên kết tượng trưng (symbolic link) tới tệp thực thi certbot (/snap/bin/certbot) mà chúng ta vừa cài đặt từ thư mục /usr/bin/. Bước này đảm bảo rằng lệnh certbot có thể chạy đúng trên máy chủ của chúng ta. Để làm điều này, chúng ta sẽ chạy lệnh ln sau đây. Lệnh này chứa flag -s để tạo một liên kết tượng trưng (symbolic link) hoặc liên kết mềm, không phải là một liên kết cứng:

bash
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Kiểm tra lại cấu hình Nginx

Chạy lệnh dưới đây. Nếu không có lỗi nào được tìm thấy, nó sẽ xuất ra một thông báo "syntax is ok" và "test is successful" xác nhận rằng cấu hình là hợp lệ.

bash
sudo nginx -t

Nếu có lỗi, hãy mở lại tệp khối máy chủ đã cấu hình ở phần server block và kiểm tra xem có bất kỳ lỗi chính tả hoặc ký tự nào bị thiếu không. Khi cú pháp của tệp cấu hình là chính xác, hãy tải lại Nginx để tải cấu hình mới.

bash
sudo systemctl reload nginx

Hết phần 1

Các bạn đọc phần 2 tại đây nhé: Hướng dẫn deploy Node.js app lên VPS Linux Ubuntu - Phần 2 | FuKT Production

Bài viết liên quan