Triển khai một ứng dụng Nodejs + Nginx trên Raspberry Pi

Post Reply
boco.cf
Posts: 13
Joined: Wed Apr 17, 2019 1:29 pm

Triển khai một ứng dụng Nodejs + Nginx trên Raspberry Pi

Post by boco.cf »

Như tiêu đề của topic, tôi muốn triển khai một ứng dụng để người dùng có thể truy cập trên internet, cụ thể là một app chạy với Nginx trên Raspberry Pi. Ở đây tôi sử dụng Nodejs + expressjs để minh họa việc chạy app đơn giản cho tiện, (bạn có thể cài đặt 1 blog wordpress, hay làm một app angular, react, expressjs...).

Các thứ bạn cần:
  • Có một con Raspberry Pi 3
  • Có một địa chỉ IP tĩnh (nếu không muốn tìm thêm giải pháp phức tạp để domain của bạn trỏ tới IP thỉnh thoảng lại thay đổi khi máy Pi kết nối mạng).
  • Có một domain name để trỏ tới static IP của bạn
Các bước cài đặt:
  • Cài đặt web server Nginx trên Raspberry Pi.
  • Cài đặt nodejs + expressjs
  • Cài đặt virtual host cho app
  • Cài đặt Forwarding port
Cài đặt web server Nginx trên Raspberry Pi

Ở topic trước ta đã trình bày về cách cài đặt Nginx trên RPI, bạn có thể tham khảo: viewtopic.php?f=37&t=482802

Cài đặt nodejs + expressjs

1. Cài đặt Nodejs:

Code: Select all

sudo apt-get install nodejs
sudo apt-get install npm
npm install -g npm
2. Check version:

Code: Select all

node -v
npm -v
3. Cài đặt express-generator

Code: Select all

npm install -g express-generator
4. Create app:

Tạo thư mục chứa app của bạn, ví dụ /var/www/my-app, và cd đến my-app và chạy lệnh sau:

Code: Select all

#view engine sẽ là Pug (mặc định là jade)
express --view=pug my-app
#install dependencies
npm install
#run the app
DEBUG=myapp:* npm start
5. Kiểm tra app:

Vào trình duyệt truy cập http://localhost:3000/ , nếu hiển thị như sau là ok.
--------------------------------------
Express
Welcome to Express
--------------------------------------

Như vậy ta đã cài đặt được một app đơn giản từ expressjs, chi tiết hơn bạn có thể tham khảo: http://expressjs.com/

Cài đặt virtual host cho app

Hoàn thành bước trên bạn chỉ chạy trên localhost với port xxxx, nếu muốn cấu hình ra ngoài internet để có thể truy cập từ xa, thì bạn cần bước cấu hình virtual host cho app bạn vừa dựng.

Phân tích kỹ thuật: vì sao lại cần phải cấu hình virtual host cho app?
Bởi vì Nginx đang lắng nghe trên cổng 80, nó sẽ nhận được các request HTTP đến máy Pi của bạn, nhưng app của bạn đang lắng nghe trên một cổng khác (ví dụ cổng 3000). Do đó, bạn cần định cấu hình Nginx để hoạt động như một Reverse Proxy, nhận ra các yêu cầu dành cho app của bạn.

Nginx giữ file cấu hình cho mỗi ứng dụng trong thư mục sites-available, cd đến thư mục này: cd /etc/nginx/sites-available/

Tại đây bạn copy file cấu hình tên là default ra thành my-app và sửa nội dung file my-app với các câu lệnh sau:

Code: Select all

sudo cp default my-app
sudo nano my-app
Bạn sửa file my-app sao cho nội dung như sau:

Code: Select all

server {
   listen 80;
   # thư mục chứa app của bạn
   root /var/www/my-app/;
   # domain name để truy cập đến app của bạn
   server_name your-domain.com;
   location / {
      # đích đến thực sự trong local của app mới dựng trên Pi của bạn
      proxy_pass http://localhost:8080/;
   }
}
Để kích hoạt cấu hình trên, bạn cần tạo một symlink trong thư mục sites-enabled, nơi Nginx tìm kiếm các cấu hình hoạt động trong thời gian chạy:

Code: Select all

sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/my-app
Chú ý reload lại nginx để apply các cấu hình bên trên:

Code: Select all

sudo /etc/init.d/nginx reload
Cuối cùng bạn chỉ cần add thêm vào file hosts thông tin static IP mapping với your-domain.com (trên Pi của bạn: /etc/hosts):

Code: Select all

sudo nano /etc/hosts
# bạn cần phải có 1 static IP để your-domain trỏ tới
# add dòng này vào file hosts trên máy Pi của bạn
11.22.33.44 your-domain.com
Cài đặt Port Forwarding

Ứng dụng của bạn đã được cấu hình chạy với Nginx, cấu hình mapping với domain của bạn, nhưng làm sao để truy cập từ bên ngoài vào máy của bạn? Câu trả lời là Port Forwarding

Bạn cần mở 2 port trên router của bạn: HTTP protocol sử dụng port 80 mặc định, và SSH sử dụng port 22 (bạn có thể remote ssh từ bên ngoài khi bạn mở port 22 cho Pi của bạn).

Truy cập vào router của bạn (có thể ip là: 192.168.0.1, bạn có thể tìm bằng nhiều cách), sau đó login vào và tìm mục "Port Forwarding" (hoặc các cụm từ tương tự vì có thể mỗi loại router lại dùng một tên khác một chút).

Bạn điền các thông số sau cho các mục tương ứng:

Code: Select all

Public port rank: 80
Target IP address: 192.168.x.x 		# sử dụng lệnh [hostname -I] trên máy Pi để biết được local IP
Target port rank: 80
Protocol: tcp
Bạn cũng điền tương tự bên trên cho port 22 nếu muốn control máy Pi của bạn từ bên ngoài.

The end

Đến đây bạn đã host được một app bằng nodejs + expressjs chạy với Nginx và public ra internet bằng cách cài đặt Port Forwarding.

Bạn có thể host nhiều app khác và cấu hình virtual host cho app trên Nginx tương tự, như vậy bạn đã có thể phát triển thêm những app khác nhau mà không cần phải mua thêm máy hoặc thuê hosting nếu không cần thiết.
Donate:
DGB address: D5SDMcJX6r1cJoPjWUfRj5BSfM2Y4Qvnzr

Post Reply