Bài viết này chúng ta sẽ tìm hiểu về quá trình deploy một ứng dụng NodeJS lên production thông qua VPS CentOS 7.
Trong bài viết, chúng ta sẽ mặc định user là root và ip của server là: 123.456.7.89
Step 1: Connect đến VPS
ssh [email protected]
Nhập password và nhấn enter.
Step 2: Cài đặt môi trường
1. Cập nhật phần mềm
yum update
Tạo folder và cấp quyền read and write
mkdir /home/varum
sudo chown -R $(whoami) /home/varum
2. Install Git
sudo yum install git
Kiểm tra version git xem đã cài đặt thành công hay chưa
git --version
3. Cài đặt Node và npm
3.1 Thêm nodesource v16 vào yum
curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
Bạn cũng có thể cài đặt các version bằng cách thay đổi setup_16
3.2 Install Node
sudo yum install nodejs
3.3 Kiểm tra version của node và npm
node --version
npm --version
4. Install Yarn
4.1 Thêm Yarn repo vào yum
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
4.2 Install Yarn
sudo yum install yarn
5. Install Database
Tùy thuộc vào dự án của bạn sử dụng database nào mà bạn sẽ cài đặt cho phù hợp. Ở đây mình sẽ hướng dẫn cài đặt cả MySQL và mongoDB.
5.1 Cài đặt MySQL
1. Tải MySQL
curl -sSLO https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
2. Prepare repository
sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
*Trường hợp bạn có 2 version mysql, bạn bắt buộc phải xóa 1 version đi
rpm -e --nodeps mysql57-community-release
* Disable all repositories in mysql repo
sed -i 's/enabled=1/enabled=0/' /etc/yum.repos.d/mysql-community.repo
* Lắp lại bước 2
* List MySQL Version
https://dev.mysql.com/downloads/repo/yum/
3. Install MySQL
sudo yum install mysql-server
Trong quá trình cài đặt các bạn có thể cần bấm y để xác nhận một vài lần
4. Start MySQL
sudo systemctl start mysqld
Kiểm tra xem MySQL đã active thành công hay chưa
sudo systemctl status mysqld
Nếu kết quả như hình thì MySQL đã được start thành công
5. Truy cập vào MySQL và tạo database cho dự án
Khi cài đặt xong MySQL, một mật khẩu tạm thời cho root user sẽ được tạo.
Dùng câu lệnh sau để xem mật khẩu tạm thời
sudo grep 'password' /var/log/mysqld.log
Kết quả
Trong ví dụ trên mật khẩu chính là: a&Uskgq<E0<Y
Tiếp theo ta cần thay đổi mật khẩu tạm thời
sudo mysql_secure_installation
Sau đó nhập mật khẩu tạm thời và tạo mật khẩu mới.
*Lưu ý: Mật khẩu nên bao gồm chữ, số, chữ hoa, chữ thường và ký tự đặc biệt
Cuối cùng là connect vào MySQL và tạo Database
sudo mysql -u root -p
Nhập password mới
Tạo database tên my_app
CREATE DATABASE my_app;
Ngoài ra, để có thể connect đến MySQL từ xa bạn có thể tham khảo bài viết: Allow MySQL Remote Connections on CentOS, RHEL
5.2 Cài đặt MongoDB
1. Tạo Mongo Repo
sudo vi /etc/yum.repos.d/mongodb-org.repo
Khi tạo file bằng vi, mặc định file sẽ được mở, để insert text bạn cần bấm phím i
Copy file cấu hình sau:
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
Bấm ESC và nhập :x để lưu
2. Install MongoDB từ yum
sudo yum install -y mongodb-org
3. Start MongoDB
sudo systemctl start mongod
4. Tự động start MongoDB mỗi khi restart server
sudo systemctl enable mongod
Vậy là xong quá trình cấu hình môi trường cho project.
Step 3: Clone project
1. Tạo folder dự án
Di chuyển về folder home để dễ dàng quản lý
cd /home
Tạo folder dự án tên projects
mkdir projects
Di chuyển vào folder projects
cd projects
2. Clone project
Gen SSH Key
ssh-keygen -t ed25519 -C "[email protected]"
View SSH Key
cat ~/.ssh/id_ed25519.pub
Copy SSH Key và dán vào Github
git clone [email protected]:tranquocviet226/ngontumathuat.git
*Bạn có thể cần phải gen ssh và thêm vào setting trên git.
3. Cài đặt và run project
Ở đây mình ví dụ bằng project tên ngontumathuat
cd ngontumathat
Install môi trường
yarn
Cài đặt pm2 để project có thể liên tục chạy khi chúng ta disconnect khỏi server, ngoài ra pm2 còn có rất nhiều tính năng khác các bạn có thể tìm đọc pm2.keymetrics.io
yarn global add pm2
Chạy pm2 mỗi khi restart
pm2 startup systemd
Start project với pm2
npm run build
pm2 start dist/main.js --name api
Với api là tên ứng dụng bạn đặt để quản lý trên pm2
Step 4: Cấu hình Nginx
1. Install EPEL
sudo yum install epel-release
2. Install Nginx
sudo yum install nginx
3. Start Nginx
sudo systemctl start nginx
4. Tự khởi động Nginx
sudo systemctl enable nginx
5. Tắt tường lửa
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
Sau khi cài đặt Nginx bạn có thể gõ địa chỉ ip vào trình duyệt để xem kết quả.
6. Cấu hình Nginx kết nối đến project
Truy cập vào /etc/nginx/nginx.conf
và xóa bỏ server mặc định bằng cách xóa toàn bộ nội dung default server
bên dưới dòng include /etc/nginx/conf.d/*.conf;
vi /etc/nginx/nginx.conf
Tạo file config cho dự án node.js:
vi /etc/nginx/conf.d/ngontumathuat.conf
Chỗ ngontumathuat.conf các bạn có thể thay bằng bất kỳ tên gì khác.
Copy file config sau vào:
server {
server_name _;
client_max_body_size 12M; #Dong nay de tang gioi han dung luong request len 12Mb
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Tại dòng proxy_pass http://127.0.0.1:3000/;
các bạn có thể thay đổi port 3000 thành các port khác phù hợp với dự án. Bởi vì mình dùng NodeJS nên port mặc định là 3000.
Restart Nginx
sudo systemctl reload nginx
Cuối cùng là truy cập vào ip trên trình duyệt và kiểm tra kết quả. Nếu gặp lỗi 502-bad-gateway thì có thể là lỗi với permission SELinux.
Bạn có thể chạy dòng lệnh sau
setsebool -P httpd_can_network_connect 1
Nếu vẫn không được các bạn có thể check log của Nginx và tiếp tục debug
vi /var/log/nginx/access.log
Ngoài ra để trỏ Domain về server các bạn có thể tham khảo bài viết:
https://ngontumathuat.com/post/cau-hinh-domain-cho-server-voi-nginx-DwXhEJ90I9nxjcAXt3xo
Vậy là xong. Done!