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