Deploy web application là một bước quan trọng trong quy trình phát triển phần mềm. Tuy nhiên, đối với những người mới, việc này có thể gây khó khăn do thiếu kiến thức nền tảng. Trong bài viết này, mình sẽ hướng dẫn các bạn cách triển khai một API viết bằng express.js lên một máy chủ Ubuntu, sử dụng Nginx làm reverse proxy để phục vụ qua tên miền
app.ichhoa.dev
.
Để nắm rõ hơn về các khái niệm như reverse proxy, forward proxy và SSL, bạn có thể tham khảo các bài viết sau:
- Forward proxy, Reverse proxy và sự khác biệt giữa chúng?
- How does SSL work? | SSL certificates and TLS
Chuẩn Bị Để Deploy
Chọn Server
Bạn có thể sử dụng các dịch vụ điện toán đám mây như GCP (Google Cloud Platform), AWS (Amazon Web Services), hay Digital Ocean. Trong bài viết này, mình sẽ sử dụng máy chủ EC2 Ubuntu từ AWS để lưu trữ web app. Nếu bạn chưa biết cách tạo một máy EC2, hãy tham khảo bài viết hướng dẫn: Bắt Đầu Với Amazon EC2.
Đăng Ký Tên Miền (Tùy Chọn)
Bạn có thể đăng ký tên miền tại các nhà cung cấp như GoDaddy, Namecheap, hoặc Porkbun. Nếu bạn là sinh viên, hãy đăng ký Github Education để nhận 1 năm đăng ký tên miền miễn phí từ NameCheap.
Cài Đặt Các Gói Phần Mềm Cần Thiết
Chuẩn Bị Source Code
Trước khi triển khai ứng dụng, bạn cần upload source code lên máy chủ. Có nhiều cách để thực hiện điều này, ví dụ:
- Sử dụng Rsync để upload code thông qua SSH.
- Upload code lên S3 Bucket và sử dụng S3 CLI để tải về máy chủ.
- Sử dụng Git để pull code từ repository.
Để dễ dàng cho việc demo, mình sẽ sử dụng Git.
Cài Đặt Git và Pull Source Code
Đầu tiên, cài đặt Git:
bash
sudo apt-get install git
Sau đó, clone repository:
bash
git clone https://github.com/ichhoa129/express-example.git
Cài Đặt Node.js và PM2
Chạy các lệnh dưới đây để cài đặt Node.js phiên bản 18:
bash
cd ~
curl -sL https://deb.nodesource.com/setup_18.x -o /tmp/nodesource_setup.sh
sudo bash /tmp/nodesource_setup.sh
sudo apt install nodejs
Khởi Chạy Project
Bây giờ hãy thử chạy project để đảm bảo mọi thứ hoạt động:
bash
cd express-example
npm install
npm start
Khi khởi động, bạn sẽ thấy console hiển thị thông tin một cách đầy đủ. Giờ đây bạn có thể truy cập vào ứng dụng qua URL: <IP>:3000
. Ví dụ, nếu server của bạn có IP là 35.77.42.119, hãy truy cập theo đường dẫn 35.77.42.119:3000.
Tuy nhiên, điều quan trọng là nếu bạn tắt kết nối đến server, ứng dụng sẽ ngừng hoạt động. Để xử lý vấn đề này, chúng ta sẽ cài đặt PM2 để chạy ứng dụng ẩn danh:
bash
sudo npm i -g pm2
pm2 start "npm start" --name api
Giờ đây bạn có thể thoát khỏi console của server mà vẫn truy cập được ứng dụng qua URL <IP>:3000
.
Để tạo sự chuyên nghiệp hơn, chúng ta sẽ thiết lập một tên miền cho ứng dụng, sử dụng tên miền app.ichhoa.dev
.
Cài Đặt Tên Miền Cho Ứng Dụng
Cài Đặt Nginx
Do không thể trỏ tên miền đến địa chỉ IP với port cụ thể, ta cần thiết lập một reverse proxy cho client requests. Để hiểu rõ hơn về Nginx reverse proxy, bạn có thể tham khảo bài viết sau: Cấu Hình Reverse Proxy Trên Nginx.
Đầu tiên, cài đặt Nginx:
bash
sudo apt update
sudo apt install nginx
Tiếp theo, tạo file cấu hình Nginx để route request vào ứng dụng:
bash
cd /etc/nginx/sites-available
sudo touch app.ichhoa.dev
Sử dụng vim hoặc nano để chỉnh sửa file:
bash
sudo nano app.ichhoa.dev
hoặc
sudo vi app.ichhoa.dev
Cập nhật file app.ichhoa.dev
với nội dung như sau, nhớ thay đổi giá trị server_name
và proxy_pass
tương ứng:
nginx
server {
listen 80;
server_name app.ichhoa.dev; # Thay đổi thành tên miền của bạn
location / {
proxy_pass http://localhost:3000; # Thay đổi port tương ứng với ứng dụng của bạn
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Với cấu hình trên, Nginx sẽ lắng nghe yêu cầu trên port 80, kiểm tra tên miền và chuyển tiếp các yêu cầu đến ứng dụng.
Để áp dụng thay đổi, tạo symbolic link tới folder /etc/nginx/sites-enabled
và reload Nginx:
bash
sudo ln -s /etc/nginx/sites-available/app.ichhoa.dev /etc/nginx/sites-enabled/
sudo systemctl reload nginx
Thiết Lập Tên Miền
Truy cập trang web của nhà cung cấp tên miền và tạo một record A trỏ vào địa chỉ IP của server.
Giờ đây bạn có thể truy cập vào trang web qua URL http://app.ichhoa.dev. Nhưng để tăng tính bảo mật, bạn nên thiết lập HTTPS cho tên miền này. Mình sẽ hướng dẫn cách cài đặt SSL free từ Let's Encrypt.
Cài Đặt SSL Cho Tên Miền
Trong môi trường production, bạn cần mua chứng chỉ từ Certificate Authority (CA) để cài đặt cho tên miền của mình. Tuy nhiên, để demo, ta sẽ sử dụng Let's Encrypt, một dịch vụ cấp chứng chỉ miễn phí.
Cài Đặt Certbot
Certbot là công cụ giúp bạn tạo và cài đặt SSL cho tên miền.
bash
sudo apt install certbot python3-certbot-nginx
Cấu Hình Chứng Chỉ SSL
Tạo một chứng chỉ cho tên miền app.ichhoa.dev
:
bash
sudo certbot --nginx -d app.ichhoa.dev
Chạy lần đầu, Certbot yêu cầu bạn cung cấp email và đồng ý với các điều khoản.
Bây giờ bạn đã có thể truy cập trang web qua giao thức HTTPS: https://app.ichhoa.dev.
Cảm Ơn Các Bạn Đã Theo Dõi Bài Viết!
source: viblo