Triển khai ứng dụng Nodejs trên máy chủ Centos



  • Học lập trình web bằng Node.js
    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ớ, không 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ô tình 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 giờ 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 đó.

    Học "Xây dựng web site tốc độ cao bằng Node.js" được học miễn phí khóa "HTML5, CSS3, JavaScript"
    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
    Nguồn bài dịch : http://techmaster.vn/posts/33620/trien-khai-ung-dung-nodejs-tren-may-chu-centos



  • Mình có hướng dẫn khá chi tiết bằng video
    https://www.youtube.com/watch?v=64eB9Djfstg&t=448s


Log in to reply