Do đó, bài viết này sẽ hướng dẫn bạn từng bước để phát triển một ứng dụng Nodejs trên AWS một cách đầy đủ nhất, đưa ứng dụng lên máy chủ bằng cách sử dụng Docker container, RDS Amazon Aurora, Nginx với HTTPS và truy cập vào ứng dụng
1. ngăn xếp công cụ
Ứng dụng mẫu Nodejs
Một ứng dụng mẫu Nodejs với 3 API viz, status, insert và list. Các API này sẽ được sử dụng để kiểm tra trạng thái của ứng dụng, đưa dữ liệu vào cơ sở dữ liệu và cho phép gửi và hiển thị dữ liệu từ cơ sở dữ liệu
Phiên bản AWS EC2
Một phiên bản AWS EC2 được chạy trên hệ điều hành Ubuntu 20. 04 LTS được sử dụng để phát triển ứng dụng Nodejs được đóng gói [containerized]. Ta sẽ tải Docker trong trường hợp này, đặt bên trên các vùng chứa sẽ được tạo ra sau. Chúng ta cũng sẽ tải MySQL Client vào instance. Máy khách MySQL yêu cầu kết nối với Phiên bản Aurora để tạo một bảng bắt buộc
AWS RDS Amazon Aurora
Dữ liệu của bạn sẽ được lưu trữ tại AWS RDS Amazon Aurora. Ta sẽ lưu trữ các trường cơ bản như tên người dùng [tên người dùng], email-id và tuổi
Amazon Aurora là một hệ thống cơ sở dữ liệu liên kết dưới dạng MySQL và PostgreSQL trên AWS
docker
Docker là một nền tảng được đóng gói [containerization] để xây dựng các Docker Images, khai thác chúng qua các container. Ta sẽ phát triển ứng dụng Nodejs trên server, Nginx, và Certbot là Docker Containers
Docker-Soạn thư
Để code các container Nodejs, Nginx hay Certbot, ta sử dụng Docker-Compose. Docker Compose giúp giảm thời gian phát triển container và quản lý thời gian tốt hơn
Nginx
Nginx được sử dụng để kích hoạt HTTPS cho ứng dụng mẫu Nodejs, điều hướng mọi yêu cầu từ người dùng tới ứng dụng Nodejs. Nó hoạt động như một proxy ngược được sử dụng để điều hướng yêu cầu của người dùng tới ứng dụng, đồng thời hỗ trợ bảo mật trong kết nối bằng việc cung cấp cấu hình để kích hoạt SSL/HTTPS
Chứng chỉ
Certbot cho phép chúng ta tự động sử dụng Let’s Encrypt để xác thực tên miền [xác thực miền – DV] và đạt chứng chỉ SSL
Miền
Ở phần cuối của tài liệu, bạn sẽ được truy cập vào ứng dụng mẫu Nodejs, sử dụng tên miền của bạn trên HTTPS, ví dụ, ứng dụng mẫu Nodejs của bạn sẽ được bảo mật trên Internet
Người phát thơ
Ta sẽ sử dụng Postman để kiểm tra các API như kiểm tra trạng thái, chèn dữ liệu, liệt kê dữ liệu từ cơ sở dữ liệu
Như đã nói ở trên, ta sẽ “triển khai một ứng dụng Nodejs trên AWS… đưa ứng dụng lên máy chủ sử dụng Docker container, RDS Amazon Aurora, Nginx với HTTPS và truy cập vào ứng dụng bằng tên miền [tên miền]. ” Đầu tiên, ta sẽ cùng tìm hiểu về các tầng hạ kiến trúc trước khi bắt tay thực hiện
2. Kiến trúc. Triển khai ứng dụng Nodejs lên máy chủ qua Docker container, RDS Amazon Aurora, Nginx với HTTPS, truy cập qua tên miền
Triển khai ứng dụng Nodejs lên phiên bản EC2 bằng Docker sẽ khả dụng trên cổng 3000. Ứng dụng mẫu Nodejs này sẽ truy xuất dữ liệu từ phiên bản RDS Amazon Aurora được tạo ra từ các VPC tương tự như trên phiên bản EC2. Một phiên bản Amazon Aurora DB sẽ được bảo mật và được truy cập trong cùng một VPC. Ứng dụng Nodejs được phát triển khai trên phiên bản EC2 có thể được truy cập bằng cách sử dụng IP công khai trên cổng 3000, tuy nhiên chúng tôi sẽ không làm như vậy
Truy cập vào các ứng dụng trên cổng không chuẩn là điều kiện không khuyến khích, liệu chúng ta sẽ có Nginx được vận hành như một proxy dự trữ, kích hoạt cổng SSL. Người dùng sẽ cố gắng truy cập vào ứng dụng bằng cách sử dụng tên miền và các yêu cầu này sẽ được chuyển sang Nginx. Nginx sẽ kiểm tra yêu cầu dựa trên API, rồi chuyển yêu cầu đó cho ứng dụng Nodejs. Yêu cầu này sẽ dừng lại với SSL, đánh dấu cho kết quả làm việc giữa máy khách và máy chủ khi đã được bảo mật hoàn toàn
Dưới đây là sơ đồ kiến trúc hạ tầng giúp ta hình dung về cách phát triển khai thác ứng dụng Nodejs trên AWS
3. Điều kiện tiên quyết
Trước khi ta bắt tay vào phát triển ứng dụng Nodejs trên AWS, hãy đảm bảo rằng ta đã hoàn thành các điều kiện đầu tiên được giải quyết dưới đây
- Có một tài khoản AWS
- Có PostMan hoặc phần mềm thay thế cho máy để kiểm tra API
- Một tên miền đã đăng ký được khai báo trên tài khoản AWS
4. Tạo Ubuntu 20. 04 Phiên bản LTS EC2 trên AWS
Truy cập vào trang web https. //AWS. amazon. com/console/ and login to your account
Sau khi đăng nhập thành công, nhấn vào thanh tìm kiếm và nhập EC2. Nhấp vào kết quả để truy cập bảng điều khiển của EC2 và bắt đầu tạo một phiên bản EC2
Tại đây, nhấn vào “Khởi chạy phiên bản” để cấu hình và tạo một phiên bản EC2
Chọn AMI “Máy chủ Ubuntu 20. 04 LTS”
Chúng tôi khuyên bạn nên chọn t3. small for the own test, it will enough 2 CPUs and 2GB RAM. You can choose the instance tùy chọn theo nhu cầu
Bạn có thể giữ cài đặt sẵn có và tiếp tục khai thác. Tại đây, tôi đã chọn VPC mặc định, nếu muốn bạn có thể chọn VPC khác. Ghi nhớ rằng, ở đây chúng ta sẽ tạo một instance trên Public Subnet
Tốt nhất, bạn nên chọn dung lượng lớn hơn khoảng 30GB. The other section can be default
Chọn các thẻ như “Tên” “Môi trường” tùy theo lựa chọn của bạn. Bạn cũng có thể bỏ qua phần này
Cho phép kết nối tới cổng 22 chỉ qua IP của bạn. Nếu bạn cho phép kết nối từ 0. 0. 0. 0/0. , ví dụ của bạn sẽ được truy cập bởi bất kỳ ai qua cổng 22
Kiểm tra lại cấu hình, sau đó nhấn vào “Khởi chạy” nếu bạn thấy mọi thứ đã sẵn sàng để tạo một phiên bản
Trước khi một phiên bản được tạo ra, nó cần một cặp khóa. Bạn có thể tạo một cặp khóa mới hoặc sử dụng một cặp khóa có sẵn. Click vào “Launch instance” để bắt đầu bước khởi tạo một instance
Truy cập bảng điều khiển và kiểm tra phiên bản của bạn. Nhấp vào nút “Xem phiên bản”
Tại đây, bạn có thể thấy instance đã được tạo và đang trong giai đoạn “Initiating”. Trong khoảng 1-2 phút, bạn sẽ thấy phiên bản bắt đầu chạy
Trong khoảng thời gian đó, ta sẽ cùng tạo một phiên bản RDS nhé
5. Tạo RDS Aurora với MySql Instance trên AWS
Một lần nữa, nhấn vào thanh tìm kiếm ở đầu trang, và lần này chúng ta sẽ tìm “RDS”. Click vào kết quả để truy cập vào bảng điều khiển của RDS
Tại trang chủ của RDS, nhấn vào “Tạo cơ sở dữ liệu” để cấu hình và tạo một phiên bản RDS
Chọn “Easy create” cho phương thức, “Amazon Aurora” cho loại công cụ, “Dev/Test” cho kích thước phiên bản DB
Kéo xuống một chút và chọn “Số nhận dạng cụm DB” như “my-Nodejs-database”. Bạn có thể đặt một tùy chọn tên khác, khi nó chỉ là cái tên được gán cho phiên bản RDS. Tuy nhiên, ta nên sử dụng cái tên trùng nhau để không lộn xộn trong các bước sau đó
Đồng thời, đặt tên người dùng chính là “admin”, cài đặt mật khẩu, rồi nhấn vào “Tạo cơ sở dữ liệu”
Đây là bước quyết định đầu tiên để tạo ra một phiên bản RDS Amazon Aurora. Lưu ý rằng trên môi trường production và live thì bạn không được đặt tên người dùng và mật khẩu đơn giản
Tại đây, bạn có thể thấy instance đang trong quá trình “khởi tạo”. Trong vòng 5-10 phút tới, instance will run
Tại đây, ta cần lưu ý
- Phiên bản RDS Amazon Aurora sẽ ở trạng thái riêng tư theo mặc định, có nghĩa là ta không thể truy cập nó từ bên ngoài mà chỉ ở bên trong VPC
- Phiên bản EC2 và phiên bản RDS thuộc về một VPC chung
- Phiên bản RDS có thể tiếp cận với phiên bản EC2
6. Cài đặt phụ thuộc trên EC2 Instance
Bây giờ, bạn có thể kết nối với Instance mà bạn vừa tạo ra.
Máy khách MySql
Ta sẽ cần một ứng dụng khách MySQL để kết nối với phiên bản RDS Amazon Aurora và tạo cơ sở dữ liệu bên trong nó. Kết nối với phiên bản EC2 và thực hiện các lệnh từ đó
- cập nhật sudo apt
- sudo apt cài đặt mysql-client
Tạo bảng
Ta cần có một bảng trong phiên bản RDS Amazon Aurora để lưu trữ dữ liệu từ các ứng dụng. Để tạo bảng, hãy kết nối với phiên bản RDS Amazon Aurora bằng cách sử dụng máy chủ MySQL mà bạn đã tải xuống phiên bản EC2 ở bước đầu tiên
Sao chép Điểm cuối cơ sở dữ liệu từ phiên bản Amazon Aurora
Thi hành lệnh tiếp theo với giá trị chính
- mysql -u -p -h
Sau đó, lệnh của bạn sẽ xuất hiện như sau
- mysql -u admin -padmin1234 -h cơ sở dữ liệu my-Nodejs. cụm-cxxjkzcl1hwb. eu-tây-3. số thứ tự. amazonAWS. com
Một khi bạn đã kết nối với phiên bản Amazon RDS Aurora, hãy thực hiện tiếp các lệnh sao để tạo một bảng có tên “người dùng”
hiển thị cơ sở dữ liệu;
dùng chính;
TẠO BẢNG NẾU KHÔNG TỒN TẠI người dùng[id int NOT NULL AUTO_INCREMENT, tên người dùng varchar[30], email varchar[255], age int, PRIMARY KEY[id]];
chọn * từ người dùng;
Bạn có thể nhìn vào ảnh chụp màn hình bên dưới để xem các lệnh đã chạy thế nào
Tạo đường dẫn thư mục ứng dụng [Application Directory]
Bây giờ chúng ta sẽ tạo một đường dẫn có thể giúp ta lưu trữ codebase và các tệp cấu hình
- pwd
- cd /home/ubuntu/
- mkdir Nodejs-docker
- cd Nodejs-docker
Sao chép kho lưu trữ phần mã trên phiên bản EC2
Clone phần Github Repository đang chứa toàn bộ code của bạn. Đây là một bước không bắt buộc. Nếu bạn đã sao chép toàn bộ tệp từ kho lưu trữ sang thư mục ứng dụng, bạn không cần phải tạo thêm tệp trong các bước sau nữa. Tuy nhiên, bạn vẫn cần tạo một số thay đổi nhất định
- pwd
- cd /home/ubuntu/
- bản sao git https. //github. com/shivalkarrahul/DevOps. git
- cp /home/ubuntu/DevOps/AWS/Nodejs-docker/* /home/ubuntu/Nodejs-docker
7. Triển khai ứng dụng Deploy Nodejs trên phiên bản AWS EC2 sử dụng Docker container, RDS Amazon Aurora, Nginx with HTTPS và truy cập ứng dụng qua tên miền
Tại sao cần sử dụng Docker trên phiên bản EC2?
Docker là một công cụ được đóng gói [containerization] để đóng các gói phần mềm trở thành “hình ảnh” có thể sử dụng để tạo các container Docker. Docker giúp ta tạo lập, chia sẻ và khai thác các ứng dụng một cách dễ dàng
Bước đầu tiên để “Docker hóa” chính là tải Docker
Tải Docker
- Kiểm tra phiên bản Linux hiện tại
mèo/etc/vấn đề
- Cập nhật chỉ mục gói apt
sudo apt-get cập nhật
- Tải các gói cho phép apt sử dụng kho lưu trữ trên HTTPS
sudo apt-get cài đặt apt-transport-https ca-chứng chỉ curl gnupg lsb-release
- Add key GPG of Docker
cuộn tròn -fsSL https. //Tải xuống. người đóng tàu. com/linux/ubuntu/gpg. sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring. gpg
- Thiết lập cho kho lưu trữ ổn định
echo “deb [arch=amd64 được ký bởi=/usr/share/keyrings/docker-archive-keyring. gpg] https. //Tải xuống. người đóng tàu. com/linux/ubuntu $[lsb_release -cs] ổn định”. sudo tee /etc/apt/sources. danh sách. d/docker. danh sách > /dev/null
- Cập nhật chỉ mục gói apt
sudo apt-get cập nhật
- Tải về phiên bản mới nhất của Docker Engine và containerd
sudo apt-get cài đặt docker-ce docker-ce-cli containerd. io
- Kiểm tra phiên bản Docker hiện tại
docker-version
- Quản lý Docker với tư cách là người dùng không root
- Tạo nhóm 'docker'
sudo groupadd docker
- Thêm người dùng vào docker nhóm
sudo usermod -aG docker
- Thoát
lối ra
- Đăng nhập lại vào terminal
- Xác thực việc bạn có thể chạy lệnh docker mà không cần sudo
docker chạy hello-world
- Sau khi chạy các lệnh ở trên, bạn sẽ thấy đầu ra như hình bên dưới
- Dưới đây là màn hình sau khi các lệnh ở trên được chạy
Docker hóa ứng dụng Nodejs trên phiên bản EC2
Sau khi tải về Docker, bước tiếp theo bạn cần ứng dụng “docker hóa” của bạn. Docker hóa một ứng dụng Nodejs có thể hiểu là viết một Dockerfile theo hướng dẫn để tạo một Docker Image
Ta sẽ cùng tạo một Dockerfile và một ví dụ mẫu cho ứng dụng Nodejs
- pwd
- cd /home/ubuntu/Nodejs-docker
- Tạo Dockerfile và dán đoạn sau vào đó, ngoài ra, bạn cũng có thể sao chép nội dung từ đây
vim Dockerfile
# Nút hình ảnh cơ sở. 12. 18. 4-núi cao
TỪ nút. 12. 18. 4-núi cao
# Đặt thư mục làm việc thành /app
WORKDIR / ứng dụng
#Đặt ĐƯỜNG /app/node_modules/. thùng rác
ĐƯỜNG ENV /ứng dụng/node_modules/. thùng rác. $PATH
#Sao chép gói. json trong ảnh
SAO CHÉP gói. json. /
#Cài đặt gói
CHẠY npm install express –save
CHẠY npm cài đặt mysql –save
#Sao chép ứng dụng
SAO CHÉP. . /
#Expose cổng ứng dụng
TIẾP XÚC 3000
#Khởi động ứng dụng
CMD [“nút”, “chỉ mục. js”]
- Tạo chỉ mục. js và dán vào phần sau, hoặc bạn có thể sao chép đoạn mã bên dưới. Đây sẽ là ví dụ mẫu cho ứng dụng Nodejs của bạn
chỉ số vim. js
const express = require['express'];
ứng dụng const = express[];
cổng const = 3000;
const mysql = yêu cầu['mysql'];
const con = mysql. tạo kết nối [{
chủ nhà.
“cơ sở dữ liệu-Nodejs của tôi. cụm-cxxjkzcl1hwb. eu-tây3. số thứ tự. amazonAWS. com”,
người sử dụng. "quản trị viên",
mật khẩu mở khóa. “quản trị1234”
}];
ứng dụng. get[‘/status’, [req, res] => res. gửi [{trạng thái. “Tôi đang chạy”}]];
ứng dụng. lắng nghe [cổng, [] => bảng điều khiển. log[`Ứng dụng Nodejs Dockerized đang lắng nghe trên cổng ${port}. `]];
ứng dụng. post[‘/insert’, [req, res] => {
nếu [yêu cầu. truy vấn. tên người dùng && yêu cầu. truy vấn. email && yêu cầu. truy vấn. tuổi tác] {
bảng điều khiển. log['Đã nhận lệnh gọi chèn'];
lừa đảo. kết nối [chức năng [err] {
lừa đảo. truy vấn [`CHÈN VÀO chính. người dùng [tên người dùng, email, tuổi] GIÁ TRỊ [‘${req. truy vấn. tên người dùng}', '${req. truy vấn. email}’, ‘${req. truy vấn. tuổi}']`, chức năng [err, kết quả, trường] {
nếu [err] res. gửi [lỗi];
nếu [kết quả] res. gửi [{tên người dùng. yêu cầu. truy vấn. tên người dùng, email. yêu cầu. truy vấn. email, tuổi. yêu cầu. truy vấn. tuổi tác}];
bảng điều khiển if [trường]. nhật ký [trường];
}];
}];
} khác {
bảng điều khiển. log['Đã xảy ra sự cố, Thiếu tham số'];
}
}];
ứng dụng. get[‘/list’, [req, res] => {
bảng điều khiển. log['Đã nhận cuộc gọi danh sách'];
lừa đảo. kết nối [chức năng [err] {
lừa đảo. truy vấn [`CHỌN * TỪ chính. người dùng`, chức năng [err, kết quả, trường]
{
nếu [err] res. gửi [lỗi];
nếu [kết quả] res. gửi [kết quả];
}];
}];
}];
Ở tệp phía trên, hãy thay thế giá trị của các biến dưới đây bằng một ứng dụng vào trong phiên bản RDS Amazon Aurora của bạn
- chủ nhà. “cơ sở dữ liệu-Nodejs của tôi. cụm-cxxjkzcl1hwb. eu-tây-3. số thứ tự. amazonAWS. com”
- người sử dụng. "quản trị viên"
- mật khẩu mở khóa. “quản trị1234”
- Tạo gói. json và dán vào phần sau, hoặc bạn có thể sao chép phần mã bên dưới
gói vim. json
{
"Tên". “Nodejs-docker”,
"phiên bản". “12. 18. 4",
"sự mô tả". “Nodejs trên ec2 sử dụng docker container”,
"chính". "mục lục. js”,
"kịch bản". {
"kiểm tra". “tiếng vang \”Lỗi. không có bài kiểm tra nào được chỉ định \” && thoát 1″
},
"tác giả". “Rahul Shivalkar”,
"giấy phép". "LÀ C"
}
Cập nhật AWS Security Group
Để truy cập vào ứng dụng, ta cần thêm một quy tắc vào trong Nhóm bảo mật để cho phép các kết nối vào cổng 3000. Như tôi đã nói ở trên, tôi có thể truy cập vào các ứng dụng trên cổng 3000, nhưng tôi không khuyến mãi. Bạn có thể đọc tiếp để hiểu rõ hơn về các khuyến nghị của người viết
- Truy cập vào Bảng điều khiển EC2, chọn phiên bản, chuyển sang phòng thí nghiệm “Bảo mật”, sau đó nhấn vào liên kết của Nhóm bảo mật
- Chọn tab “Quy tắc gửi đến” và nhấn vào nút “Chỉnh sửa quy tắc gửi đến”
- Add a rule [quy tắc] cho phép kết nối bên ngoài từ “Mylp” qua cổng “3000”
Triển khai server Nodejs trên EC2 Server [Instance]
- Ta sẽ cùng tạo một docker image từ đoạn mã đã có
- cd /home/ubuntu/Nodejs-docker
- xây dựng docker -t Nodejs
- Create a container using image ta vừa tạo và đưa nó sang cổng 3000.
docker run –name Nodejs -d -p 3000. 3000 nút
- You can see code is running
docker ps
- Bạn thậm chí có thể kiểm tra nhật ký của vùng chứa
nhật ký docker Nodejs
Giờ ta có Nodejs App Docker Container đang khởi động.
- Bạn có thể truy cập vào ứng dụng của mình thông qua trình duyệt trên cổng 3000
- Kiểm tra trạng thái của kết nối trên /status api sử dụng trình duyệt. //:3000/status
- Bạn có thể thêm một vài dữ liệu trong ứng dụng thông qua /chèn api sử dụng ứng dụng Người đưa thư bằng cách gọi yêu cầu POST.
//:3000/insert?username=abc&[email protected]&age=2
- Bạn có thể liệt kê các dữ liệu từ ứng dụng bằng cách sử dụng /list api từ trình duyệt. //:3000/list
- Hoặc bạn có thể sử dụng lệnh curl bên trong phiên bản EC2 để kiểm tra trạng thái, thêm dữ liệu, liệt kê dữ liệu
curl -XGET “//:3000/list”
curl -XPOST “//:3000/insert?username=abc&[email protected]&age=26″
- Stop and remove container
docker dừng Nodejs
docker rm Nodejs
Trong phần này, ta đã cố gắng kết nối trực tiếp các API có sẵn cho ứng dụng bằng cách sử dụng IP công cộng. Cổng của phiên bản EC2. Tuy nhiên, chúng tôi không khuyến khích việc tiếp xúc với các cổng không chuẩn hướng tới thế giới bên ngoài trong Security Group. Đồng thời, chúng tôi đã cố gắng truy cập ứng dụng thông qua giao thức HTTP, nghĩa là việc kết nối từ trình duyệt ứng dụng đến một cách không được bảo mật và bất kỳ kẻ tấn công nào cũng có thể đọc các gói mạng
Để tránh tình trạng này diễn ra, chúng tôi khuyên bạn nên sử dụng Nginx
Thiết lập Nginx
Chúng ta sẽ tạo một cấu hình Nginx sử dụng bên trong Nginx container thông qua Docker Volume. Đồng thời, ta sẽ tạo một tệp và sao chép các nội dung bên dưới vào trong
- cd /home/ubuntu/Nodejs-docker
- mkdir nginx-conf
- vim nginx-conf/nginx. conf
người phục vụ {
nghe 80;
nghe [. ]. 80;
vị trí ~ /. nổi tiếng/acme-thử thách {
chấp nhận tất cả;
gốc/var/www/html;
}
địa điểm / {
viết lại ^ https. //$host$request_uri?
}
}
người phục vụ {
nghe 443 ssl http2;
lắng nghe [. ]. 443 ssl http2;
server_name Nodejs. devopslee. com www. Nodejs. devopslee. com;
server_tokens tắt;
ssl_certificate /etc/letsencrypt/live/Nodejs. devopslee. com/chuỗi đầy đủ. pem;
ssl_certificate_key /etc/letsencrypt/live/Nodejs. devopslee. com/khóa riêng. pem;
ssl_buffer_size 8k;
ssl_dhparam /etc/ssl/certs/dhparam-2048. pem;
ssl_protocols TLSv1. 2 TLSv1. 1 TLSv1;
bật ssl_prefer_server_ciphers;
ssl_ciphers ECDH+AESGCM. ECDH+AES256. ECDH+AES128. DH+3DES. ADH. AECDH. MĐ5;
ssl_ecdh_curve secp384r1;
tắt ssl_session_tickets;
ssl_dập ghim vào;
ssl_stapling_verify bật;
giải quyết 8. 8. 8. số 8;
địa điểm / {
try_files $uri @Nodejs;
}
vị trí @Nodejs {
proxy_pass http. //Nodejs. 3000;
add_header X-Frame-Options luôn luôn “SAMEORIGIN”;
add_header X-XSS-Protection “1;
add_header X-Content-Type-Options “nosniff” luôn;
add_header Referrer-Policy luôn luôn “không giới thiệu-khi-hạ cấp”;
add_header Nội dung-Bảo mật-Chính sách “dữ liệu mặc định-src *. 'unsafe-eval' 'unsafe-inline'” luôn luôn;
}
gốc/var/www/html;
chỉ mục chỉ số. chỉ mục html. chỉ mục htm. nginx-debian. Html;
}
In the file on on, you can change at 3 line side under under. Replace subdomain section. tên miền, ví dụ như Nodejs. devopslee with you want
- server_name Nodejs. devopslee. com www. Nodejs. devopslee. com;
- ssl_certificate /etc/letsencrypt/live/Nodejs. devopslee. com/chuỗi đầy đủ. pem;
- ssl_certificate_key /etc/letsencrypt/live/Nodejs. devopslee. com/khóa riêng. pem;
Tại sao ta cần Nginx ở trước dịch vụ của nodejs?
Ứng dụng Nodejs sẽ chạy trên cổng 3000 không chuẩn. Nodejs cung cấp một lối đi cho phép ta sử dụng HTTPS;
Để giải quyết vấn đề này, ta cần có Nginx trước khi chấm dứt SSL và chuyển tiếp người dùng yêu cầu tới Nodejs. Nginx là một loại máy chủ đặc biệt có thể hoạt động như một proxy ngược, cân bằng tải [bộ cân bằng tải], proxy thư và bộ đệm HTTP. Tại đây, chúng ta sẽ sử dụng Nginx làm proxy ngược để chuyển hướng các yêu cầu về ứng dụng Nodejs và có kết thúc SSL
Tại sao ta không sử dụng Apache?
Apache cũng là một máy chủ web và có thể hoạt động như một proxy ngược. Nó cũng hỗ trợ chấm dứt SSL. Tuy nhiên, có một vài điểm khác biệt giữa Nginx và Apache. Làm một vài lý do, phần lớn mọi người sẽ chọn Nginx thay vì Apache. Chúng ta có thể xác định thông qua một vài lý do bên dưới
- Nginx có quy trình đơn giản, xử lý bất đồng bộ [không đồng bộ] và có kiến trúc dựa trên sự kiện. Trong khi đó Apache luôn cố gắng tạo ra quy trình mới, tạo ra luồng mới cho mọi yêu cầu trong mọi kết nối
- Nginx có dung lượng nhẹ, có thể mở rộng và dễ dàng cấu hình. Apache dù có nhiều tính năng tốt nhưng tương đối khó học
Docker-Soạn thư
Ở bước này, ta sẽ tải docker-compose
- Tải phần mở rộng mới nhất của Docker Compose
cuộn tròn sudo -L “https. //github. com/docker/soạn thảo/phát hành/tải xuống/1. 29. 2/docker-compose-$[uname -s]-$[uname -m]” -o /usr/local/bin/docker-compose
- Áp dụng các lệnh có thể thực thi cho docker-compose mà ta vừa tải xuống ở bước trên
Sudo chmod +x /usr/local/bin/docker-compose
- Kiểm tra xem ta đã tải xuống thành công chưa bằng cách kiểm tra phiên bản của docker-compose
docker-compose –version
- Tạo một tệp docker-compose. yaml, or you can sao chép các nội dung bên dưới
cd /home/ubuntu/Nodejs-docker
vim docker-soạn thảo. yml
phiên bản. '3'
dịch vụ
Nodejs
xây dựng
định nghĩa bài văn.
dockerfile. Dockerfile
hình ảnh. Nodejs
container_name. Nodejs
khởi động lại. trừ khi dừng lại
mạng lưới
– mạng ứng dụng
máy chủ web
hình ảnh. nginx. đường chính-alpine
container_name. máy chủ web
khởi động lại. trừ khi dừng lại
cổng
– “80. 80”
– “443. 443”
tập
– gốc web. /var/www/html
–. /nginx-conf. /etc/nginx/conf. d
– certbot-v.v. /etc/letsencrypt
– certbot-var. /var/lib/letsencrypt
– dhparam. /etc/ssl/certs
phụ thuộc
– Nodejs
mạng lưới
– mạng ứng dụng
certbot
hình ảnh. certbot/certbot
container_name. certbot
tập
– certbot-v.v. /etc/letsencrypt
– certbot-var. /var/lib/letsencrypt
– gốc web. /var/www/html
phụ thuộc
- máy chủ web
yêu cầu. certonly –webroot –webroot-path=/var/www/html –email [email được bảo vệ] –agree-tos –no-eff-email –staging -d Nodejs. devopslee. com -d www. Nodejs. devopslee. com
#yêu cầu. certonly –webroot –webroot-path=/var/www/html –email [email được bảo vệ] –agree-tos –no-eff-email –force-renewal -d Nodejs. devopslee. com -d www. Nodejs. devopslee. com
tập
certbot-vv
certbot-var
web-root
người lái xe. địa phương
driver_opts
loại hình. không ai
thiết bị. /home/ubuntu/Nodejs-docker/views/
o. trói buộc
dhparam
người lái xe. địa phương
driver_opts
loại hình. không ai
thiết bị. /home/ubuntu/Nodejs-docker/dhparam/
o. trói buộc
mạng lưới
mạng ứng dụng
người lái xe. cầu
In the file on on, you can change the lines under under. Change subdomain subdomain. tên miền, ví dụ như Nodejs. devopsleee với phần mà bạn muốn. Change IP to email of your own
–email EMAIL, Email dùng để đăng ký và liên hệ khôi phục
yêu cầu. certonly –webroot –webroot-path=/var/www/html –email [email được bảo vệ] –agree-tos –no-eff-email –staging -d Nodejs. devopslee. com -d www. Nodejs. devopslee. com
Cập nhật Nhóm bảo mật AWS
Lần này, ta sẽ chuyển cổng 80 và cận 443 trong nhóm bảo mật, gắn với phiên bản EC2. Đồng thời, loại bỏ cổng 3000 không còn cần thiết – lúc này ứng dụng của bạn đã hoạt động qua cổng 443
Bao gồm các thay đổi trong DNS
Tại đây, tôi đã tạo một tên miền phụ “Nodejs. devopslee. com” sẽ được sử dụng để truy cập ứng dụng mẫu Nodejs, sử dụng tên miền thay vì truy cập bằng IP
Bạn có thể tạo một tên miền phụ trên AWS nếu bạn đã có sẵn một tên miền
Tạo 2 “type A Recordsets” trên vùng đang quản trị với giá trị là IP công khai của phiên bản EC2. Một Recordset sẽ trở thành tên miền phụ. miền. com và cái còn lại sẽ là www. tên miền phụ. miền. com
Ở đây, tôi đã tạo ra Nodejs. devopslee. com và www. Nodejs. devopslee. com, cả hai đều trỏ về IP công khai của phiên bản EC2.
Lưu ý. Tôi đã không gán bất kỳ IP đàn hồi nào cho phiên bản EC2. Tôi khuyên bạn nên chỉ định một IP đàn hồi và sử dụng nó trong Recordset, sau đó khi bạn khởi động lại phiên bản EC2, bạn không cần phải cập nhật IP trong Recordset nữa, IP công khai thường sẽ thay đổi sau khi phiên bản EC2 được khởi động lại
Bây giờ, chúng ta sẽ sao chép giá trị của “Type NS Recordset”, thứ mà chúng ta sẽ cần trong các bước tiếp theo
Truy cập vùng lưu trữ của tên miền, tạo một “bản ghi” mới với tên miền phụ. miền. com, thêm các giá trị NS mà bạn sao chép vào bước trên
Bây giờ bạn đã có một tên miền phụ có thể truy cập vào ứng dụng của bạn
Trong trường hợp của tôi, tôi có thể sử dụng Nodejs. devopslee. com để truy cập vào ứng dụng Nodejs. Bước tiếp theo, ta sẽ đảm bảo an toàn cho ứng dụng web Nodejs
Bao gồm chứng chỉ SSL
Ta sẽ tạo một key có thể sử dụng trong Nginx
- cd /home/ubuntu/Nodejs-docker
- lượt xem mkdir
- mkdir dhparam
- Sudo openssl dhparam -out /home/ubuntu/Nodejs-docker/dhparam/dhparam-2048. phút 2048
Triển khai ứng dụng Nodejs trên phiên bản EC2
Chúng ta đã có sẵn để khởi động ứng dụng Nodejs bằng cách sử dụng docker-compose. Docker-compose sẽ khởi động ứng dụng Nodejs trên cổng 3000, Nginx với SSL trên cổng 80 và 443. Nginx sẽ điều hướng các yêu cầu về ứng dụng Nodejs khi được truy cập với tên miền. Nó cũng sẽ có một ứng dụng khách certbox cho phép sở hữu chứng chỉ
- docker-compose lên
Sau khi bạn nhập lệnh phía trên, bạn sẽ thấy các đầu ra như bên dưới. Bạn sẽ thấy một dòng tin nhắn với nội dung “Đã nhận được chứng chỉ thành công”
Lưu ý. command docker-compose side on sẽ làm cho các container chạy và gắn kết với thiết bị đầu cuối. Ta sẽ không sử dụng lựa chọn -d để tách chúng ta khỏi thiết bị đầu cuối
Giờ đây, bạn đã sẵn sàng. Vui lòng nhấn vào URL trên trình duyệt và bạn đã có sẵn ứng dụng Nodejs trên HTTPS
Bạn cũng có thể thử truy cập vào ứng dụng thông qua lệnh curl
- Listing data from application
cuộn tròn https. //Nodejs. devopslee. com/danh sách
- Add a entry into in application
cuộn tròn -XPOST “https. //Nodejs. devopslee. com/insert?username=abc&[email protected]&age=28“
- Một lần nữa, hãy liệt kê các dữ liệu để xác thực việc xem dữ liệu ở bước [2] đã được thêm vào hay chưa
cuộn tròn https. //Nodejs. devopslee. com/danh sách
- Kiểm tra trạng thái của ứng dụng
https. //Nodejs. devopslee. com/trạng thái
- Click vào URL trên trình duyệt để có một danh sách các mục nhập trong cơ sở dữ liệu
https. //Nodejs. devopslee. com/danh sách
Tự động gia hạn chứng chỉ SSL
Với chứng chỉ mà ta đã tạo, sử dụng Let's Encrypt, sẽ có giá trị trong 90 ngày. Do đó, ta cần có phương án để cập nhật chứng chỉ tự động, giúp ta thoát khỏi việc giữ chứng chỉ hết hiệu lực
Để tự động hóa quy trình này, ta sẽ tạo một tập lệnh giúp ta cập nhật chứng chỉ và một cronjob để lên lịch chạy tập lệnh
- Create a script with -dry-run to check script
chứng chỉ gia hạn vim. sh
#. /bin/bash
COMPOSE=”/usr/local/bin/docker-compose –no-ansi”
DOCKER=”/usr/bin/docker”
cd /home/ubuntu/Nodejs-docker/
$COMPOSE chạy certbot gia hạn –dry-run && $COMPOSE kill -s Máy chủ web SIGHUP
Hệ thống $DOCKER prune -af
- Thay quyền truy cập của script sang cho phép nó khởi động
chứng chỉ gia hạn chmod 774. sh
- Create a cronjob
Sudo crontab -e
*/5 * * * * /home/ubuntu/Nodejs-docker/renew-cert. sh >> /var/log/cron. nhật ký 2>&1
- Listing of the cronjobs
Sudo crontab -l
- Kiểm tra nhật ký của cronjob sau 5 phút, khi chúng ta đã cài đặt để cronjob hoạt động 5 phút một lần
đuôi -f /var/log/cron. lo
Trong ảnh chụp màn hình phía trên, bạn có thể thấy dòng tin nhắn “Mô phỏng gia hạn chứng chỉ hiện có…. ”. Đó là bởi vì ta đã nêu rõ lựa chọn “-dry-run” trong kịch bản
- Loại bỏ lựa chọn “–dry-run” trong tập lệnh
chứng chỉ gia hạn vim. sh
#. /bin/bash
COMPOSE=”/usr/local/bin/docker-compose –no-ansi”
DOCKER=”/usr/bin/docker”
cd /home/ubuntu/Nodejs-docker/
$COMPOSE chạy certbot gia hạn && $COMPOSE kill -s Máy chủ web SIGHUP
Hệ thống $DOCKER prune -af
Lần này, bạn không còn thấy tin nhắn kia nữa. Tập lệnh sẽ kiểm tra xem chúng ta có cần cập nhật chứng chỉ hay không, và nếu cần, nó sẽ tự động cập nhật or sẽ không hiển thị thông báo “Chứng chỉ chưa đến hạn gia hạn”
8. Bước tiếp theo sau khi triển khai ứng dụng Nodejs trên AWS?
Ta đã hoàn thành việc cài đặt ứng dụng Nodejs sử dụng Docker trên phiên bản AWS EC2. Tuy nhiên, có một vài điều ta cần lưu ý khi muốn phát triển các ứng dụng khác cho môi trường sản xuất hay bất kỳ môi trường nào khác. Ở bước tiếp theo, chúng ta sẽ sử dụng một Dàn nhạc như ECS hoặc EKS để quản lý ứng dụng Nodejs trong giai đoạn sản xuất. Nhân rộng, tự động mở rộng, cân bằng tải, định tuyến đường truyền, quản lý sức khỏe vùng chứa sẽ không tự động xuất hiện với Docker và Docker-compose. Để quản lý container và kiến trúc vi dịch vụ, bạn cần các công cụ điều phối container như ECS hay EKS
Ngoài ra, ta không sử dụng bất kỳ kho lưu trữ Docker nào để lưu trữ các Docker Image cho ứng dụng Nodejs. Bạn có thể sử dụng AWS ECR, một bộ chứa được quản lý hoàn toàn
Kết luận
Để phát triển ứng dụng Nodejs trên AWS, chúng ta không nhất thiết phải tạo một ứng dụng Nodejs và khai thác chúng trên phiên bản EC2 với một cơ sở dữ liệu tự quản lý. Có rất nhiều khía cạnh như Container hóa ứng dụng Nodejs, Chấm dứt SSL, tên miền cho ứng dụng sẽ cần phải cân nhắc khi bạn muốn tăng tốc cho giai đoạn phát triển giai đoạn phát triển phần mềm, bảo mật, tăng độ tin cậy và dự án dữ liệu
Trong bài viết này, ta đã cùng khám phá các bước để “docker hóa” một ứng dụng Nodejs mẫu, sử dụng AWS RDS Amazon Aurora và triển khai ứng dụng Nodejs trên phiên bản EC2 bằng Docker và Docker-compose. Kích hoạt SSL Termination to sub-domain để truy cập vào ứng dụng Nodejs. Ta cũng đi qua các bước để tự động hóa việc cấp phép cho tên miền và gia hạn chứng chỉ SSL sử dụng Certbox
Đây là bước cơ bản để bắt đầu với một ứng dụng mẫu Nodejs. Tuy nhiên, khi chúng ta cần ứng dụng thực tế, 100 giây của vi dịch vụ, 1000 giây của vùng chứa, khối lượng, mạng, bí mật, lối ra-vào, bạn sẽ cần đến công cụ điều phối vùng chứa. Có rất nhiều công cụ như Kubernetes, AWS ECS, AWS EKS giúp bạn nâng cao khả năng quản lý vòng đời của container trong ứng dụng thực tiễn
Về VTI Cloud
VTI Cloud là Đối tác cấp cao [Đối tác tư vấn nâng cao] của AWS, với đội ngũ kỹ sư hơn 50 tuổi về giải pháp được chứng nhận bởi AWS. Với mong muốn hỗ trợ khách hàng trong quá trình chuyển đổi số và dịch chuyển lên đám mây AWS, VTI Cloud tự hào là đơn vị tiên phong trong việc tư vấn giải pháp, phát triển phần mềm và khai thác hạ tầng AWS cho khách hàng
Xây dựng kiến trúc an toàn, hiệu suất cao, linh hoạt và chi phí tối ưu cho khách hàng là nhiệm vụ hàng đầu của VTI Cloud trong sứ mệnh công nghệ hóa doanh nghiệp