Triển khai ứng dụng nodejs lên server Centos

Phát triển ứng dụng trên local tương đối đơn giản. Bạn chỉ việc cd vào thư mục , gõ câu lệnh node app.js , ứng dụng đã hoạt động.

Mọi thứ sẽ trở nên phức tạp hơn khi bạn đưa ứng dụng lên server . Nếu việc triển khai ứng dụng PHP hay Ror tương đối đơn giản. Code của bạn ở trong một thư mục xác định. Mỗi lẫn bạn update bạn chỉ việc thay đổi đoạn code trong thư mục đó.

Trong thế giới Nodejs vấn đề sẽ phức tạp hơn một chút. Nào chúng ta cùng nhau tìm hiểu cách để host và deploy ứng dụng Nodejs nhé.

Trong bài viết này mình hướng đến máy chủ sử dụng hệ điều hành Centos. Đây có thể là server chạy VMware, VPS .v.v . Với các hệ điều hành Linux khác các bước thực hiện cũng gần như tương tự nhé chỉ khác chút về mặt cú pháp thôi.

Bắt đầu nào

Trước khi bắt tay vào việc cài đặt, chúng ta phân tích một chút đã.

Đầu tiên, chúng ta sẽ sử dụng Nginx để xử lý các request. Ứng dụng Node của bạn sẽ không tương tác trực tiếp từ người dùng, mọi thứ đều phải thông qua Nginx.
Với các nội dung cố định( css, img, javascript .v.v) Nginx sẽ xử lý trực tiếp cho các bạn mà không cần gọi đến ứng dụng Nodejs.
Bên cạnh đó nếu bạn cần web hỗ trợ SSL/TLS, bạn chỉ cần Nginx là đủ, không cần thiết phải cấu hình trên ứng dụng Node.

Bước thứ hai, bạn cần phải đảm bảo ứng dụng Nodejs của bạn luôn hoạt động , tự khởi động lại khi server bị restart, bạn cần tạo một dịch vụ systemd.
Với các bạn dùng pm2 để chạy nodejs, cũng có 1 số lệnh để tạo systemd với pm2 , mình sẽ giới thiệu trong một bài khác .

Tại sao lại là Nginx

Các bạn thấy mình nhắc khá nhiều đến Nginx ở trên vậy tại sao phải cần nó nhỉ.

Phục vụ các file cố định,như javascript, ảnh , css, Với bạn đã từng dùng express chắc bạn có biết đến nó có sẵn luôn thằng express.static để xử lý các request kiểu này . Tuy nhiên sử dụng Node với các request này không thưc sự hiệu quả. Nó tốn kém bộ nhớ, ko có cache ở trên server điều này làm cho ứng dụng của bạn chạy chậm và có khả năng nghẻo giữa chừng.

Thiết lập kết nối SSL để tạo ra cái này với Nodejs bạn cần phải gọi đến thằng https và cấu hình khá lằng nhằng phức tạp. Tuy nhiên với Nginx mọi thứ dễ thở hơn nhiều không ảnh hưởng đến logic trong ứng dụng Node

Giới hạn dung lượng upload file , với một số ứng dụng bạn hỗ trợ người dùng upload file lên trên server. Tuy nhiên, với ứng dụng web chúng ta chẳng thể nào tin tưởng người dùng và dù vô tinh hay cố ý họ có thể đẩy lên server 1 file 100GB hoặc lớn hơn nữa và server của bạn ra đi . Việc phải xử lý logic này trên Node không đơn giản nhé.

Tận dụng tối đã số core trong hệ thống . Nodejs nổi tiếng vì việc chạy trên một luồng ( single thread). Điều đó có nghĩa là bạn không thể chạy hai cái cùng lúc. Nếu server của bạn có nhiều core bạn chỉ có thể chạy 1 trong số chúng. Thật là tệ. Có 2 giải pháp để xử lý vấn đề này : Sử dụng tính năng cluster ( pm2 làm rất tốt cái này) , Chạy ứng dụng ở nhiều port khác nhau và bạn sử dụng Nginx như 1 thằng load balancer

Khả năng tự phục hồi hệ thống.

Vấn đề thứ 2 mà ta gặp phải khi triển khai ứng dụng là làm sao đảm bảo ứng dụng chạy 24/24. Bạn không thể lúc nào cũng canh chừng hệ thống để mà chạy lại server được. Server của bạn có thể lăn đùng ra bất kỳ lúc nào.

Thật may mắn là toàn bộ các phiên bản Linux đều đi kèm với hệ thống khởi động. Nó không chỉ giúp khởi động ứng dụng khi server được bật lên. Nó còn luôn giám sát ứng dụng đó và khởi động nó khi gặp phải các yêu cầu bạn đặt ra.

Trong quá khứ việc viết script cho hệ thống này khá phức tạp, chẳng ai thích nó cả

Hiện nay , hầu hết các bản Linux đều đi kèm hệ thống hiện đại hơn gọi là systemd , việc sử dụng nó cũng rất đơn giản.

Triển khai code

Bạn biết cách để chạy ứng dụng nhưng làm cách quái nào ta có thể đưa code lên server bây h nhỉ.
Đơn giản nhất thì ta sử dụng đến cú pháp scp , copy dữ liệu từ local lên server. Cách này thật là tệ với 1 dự án lớn điều này khiến bạn không thể kiểm soạt được các version của code.
Giải pháp hiệu quả nhất là sử dụng 1 hệ thống quản lý version như Git chẳng hạn. Bạn đẩy ứng dụng lên git. Trên server bạn git clone lại nó. Với các thay đổi bạn chỉ cần git pull lại trong thư mục là xong.

Bắt tay vào cài đặt

Chém mãi chưa thấy thực hành nhỉ. Bắt tay vào làm thôi.
Đầu tiên ta cần cài đặt các gói cần thiết lên server. Bạn cần gói EPEL(Extra Packages for Enterprise Linux) trên Centos

    $ sudo yum install epel-release

Cài đặt Nginx

Cú pháp cài đặt Nginx là

    $ sudo yum install -y nginx

Đồng thời bạn cũng cần thiệt đặt nginx khởi động cùng với server bằng câu lệnh

    $ sudo systemctl enable nginx

Bước cuối cùng. Reboot lại máy chủ. =). Mình đùa đấy, chúng ta cần phải bật ứng dụng nginx lên nữa

    $ sudo systemctl start nginx

Để kiểm tra nginx đã chạy chưa bạn có thể mở trình duyệt vào địa chỉ IP của máy chủ. Nếu bạn thấy trang chủ Nginx mọi thứ ok rồi đó.

Cài đặt Nodejs và NPM

Tất nhiên rồi cái quan trọng nhất với chúng ta là nodejs

    $ sudo curl -sL https://rpm.nodesource.com/setup | sudo bash -
    $ sudo yum install -y nodejs
    $ sudo yum install -y gcc-c++ make

Câu lệnh cuối cùng giúp bạn chạy các module native bằng C++ trên nodejs

Cài đặt Git

Trong ví dụ này mình dùng git, để cài đặt git trên centos ta dùng cú pháp

    $ sudo yum install -y git

Tạo ứng dụng Express đơn giản

Ở đây mình tạo ra 1 ứng dụng express đơn giản ** app.js**

var app = require('express')(),
   port = process.env.PORT || 3000;

app.get('/',function(req,res){
    res.sendFile(__dirname + "/demo.html");
})

app.listen(port, function() {
  console.log('Listening on port ' + port)
})

Trong thư mục ứng dụng mình tạo 1 file demo.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Demo Application</title>
    <link rel="stylesheet" href="/public/css/style.css">
</head>
<body>
<h1> Welcome to your basic web app structure </h1>
<p>
    If the title above is red
    then Nginx is serving static files!
</p>
</body>
</html>

bạn tạo giúp mình 1 file theo cấu trúc public/css/style.css với đoạn css nhỏ

h1 {
  color: red;
}

Đưa ứng dụng của bạn lên server

Đầu tiên hay tạo 1 ứng dụng express đơn giản ở máy của bạn. Sau đó đẩy ứng dụng lên github. Tiếp đến ssh vào server. Thông thường mình hay cài đặt ứng dụng ở thư mục /opt, nhưng bạn có thể lựa chọn ứng dụng tùy ý

    $ cd /opt/
    $ sudo mkdir app
    $ sudo chown your_app_user_name app
    $ git clone  <link git> app
    $ cd app
    $ npm install

Cấu hình systemd

Cấu trúc 1 dịch vụ trong systemd tương đối đơn giản :

[Service]
ExecStart=/usr/bin/node /opt/app/app.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=node-app-1
User=your_app_user_name
Group=your_app_user_name
Environment=NODE_ENV=production PORT=5000

[Install]
WantedBy=multi-user.target

Chú ý bạn nhớ thay đổi your_app_user_name , thành tên bạn đã thiết lập nhé. Sau đó hãy lưu nội dung trên vào file có đuôi .service. Bạn đặt file vừa tạo tại ** /etc/systemd/system/node-app-1.service**
Với file trên ứng dụng của bạn chạy Port 5000 , hãy tạo 1 file tương tự nhưng đổi nội dung Port qua 5001( sửa cả nội dung SyslogIdentifier nhé ). Lưu file thứ 2 tại /etc/systemd/system/node-app-2.service

Bước tiếp theo là ta phải khởi động 2 dịch vụ vừa tạo :

    $ systemctl start node-app-1
    $ systemctl start node-app-2

Cài đặt 2 ứng dụng chạy khi khởi động server

    $ systemctl enable node-app-1
    $ systemctl enable node-app-2

Hai cú pháp khá tốt để kiểm tra dịch vụ là

    $ sudo systemctl status node-app-1
    //Xem trạng thái của ứng dụng
    $ sudo journalctl -u node-app-1
    // Xem log của ứng dụng

Cập nhật ứng dụng khi có thay đổi

Khi bạn thay đổi code của ứng dụng hãy commit và push lên trên github. Tiếp đó login vào server để git pull và khởi động lại ứng dụng

    cd /opt/app
    git pull
    sudo systemctl restart node-app-1
    sudo systemctl restart node-app-2

Bước cuối cùng cấu hình Nginx

Một cấu hình Nginx cơ bản có nội dung như sau:

# Cấu hình các ứng dụng node đang chạy
upstream node_server {
   server 127.0.0.1:5000 fail_timeout=0;
   server 127.0.0.1:5001 fail_timeout=0;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    index index.html index.htm;

    # Cấu hinh domain ở đây
    server_name _;

    # Cấu hình forward các request đến ứng dụng nodejs
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect off;
        proxy_buffering off;
        proxy_pass http://node_server;
    }

    # Cấu hinh thư mục dữ liệu tĩnh
    location /public/ {
        root /opt/app;
    }
}

Để sử dụng cấu hình trên , hãy lưu nội dung đó vào file /etc/nginx/conf.d/node-app.conf

Tiếp đó bạn vào trong file /etc/nginx/nginx.conf xóa toàn bộ nội dung default server phía dưới dòng include /etc/nginx/conf.d/*.conf;

OK Bước cuối cùng đây rồi

    $ sudo systemctl restart nginx

Ta cần phải restart lại nginx để nó nhận cấu hình mới.

Vừa rồi mình đã giới thiệu một số bước để đưa ứng dụng của bạn lên server cài Centos. Tác giả của loạt bài này còn có 1 số hướng dẫn cho 1 số hệ điều hành khác nhưng mình xin phép không dịch các phấn đó vì hệ thống cũng tương tự nhau. Trong bài tiếp theo chúng ta sẽ tìm hiểu về cấu hình systemd và pm2 nhé
Lược dịch từ https://www.terlici.com/2015/04/20/hosting-deploying-nodejs-centos.html

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Quốc Cường

12 bài viết.
64 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
29 6
Một câu hỏi thường gặp của lập trình viên có kinh nhiệm với SQL mới chuyển sang Mongo là làm thế nào để có thể model được quan hệ 1 : nhiều. Có rất...
Quốc Cường viết hơn 2 năm trước
29 6
White
21 4
REST là kiến trúc phần mềm phổ biến nhất hiện nay trên internet. Thực tế khi đọc bài viết về REST các bạn sẽ thấy nó hơi bị mơ hồ khó hiểu. REST ...
Quốc Cường viết hơn 2 năm trước
21 4
White
14 0
Javascript là một ngôn ngữ hết sức uyển chuyển,với một vấn đề bạn gặp phải có hàng tá cách để thực hiện. Với một người mới bắt đầu vào việc lập trì...
Quốc Cường viết hơn 2 năm trước
14 0
Bài viết liên quan
Male avatar
25 13
Vẫn theo khung sườn đã định trước từ phần 1, trong phần này tôi sẽ giới thiệu cách cấu hình nginx để thực hiện vai trò của một load balancer. Trư...
manhdung viết gần 3 năm trước
25 13
White
0 0
Lâu lâu không động vào nodejs không biết mấy ông tool tiếc này đi đâu về đâu rồi. Trước đây thì mình vẫn có thể dùng istanbul với mocha đơn giản th...
Hoàng Duy viết hơn 1 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
64 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!