Có nhiều công cụ hoặc dịch vụ trên internet có thể giúp tạo ra máy chủ đám mây. Hầu hết chúng đều dễ sử dụng với các framework front-end như React, Angular và Astro. Cũng có những công cụ khác dành cho các framework back-end. Tuy nhiên, bài viết này sẽ đưa ra nhiều hướng dẫn hữu ích để giúp bạn có thể tìm hiểu về cách mà máy chủ hoạt động hoặc để thực hành trở thành devops. Bên cạnh đó, những công cụ này hữu ích khi bạn mới bắt đầu hoặc đang thực hành. Nhưng nếu bạn đang làm việc trên nhiều dự án, chúng sẽ nhanh chóng trở nên đắt đỏ. Trong những trường hợp đó, tốt hơn là bạn nên tự xây dựng hệ thống máy chủ đám mây của riêng mình và định cấu hình để phù hợp với nhu cầu của riêng bạn.
Thông số kỹ thuật cho một small server
- Một máy chủ đám mây nhỏ dùng để triển khai các trang web hoặc dịch vụ khác nhau như API, trang web, lệnh, v.v.
- Chúng có thể được phát triển bằng bất kỳ công nghệ và ngôn ngữ nào như: PHP, Python, JavaScript và HTML; cùng với bất kỳ framework nào như: React, Laravel, Django, WordPress, v.v.
- Có hoặc không có bất kỳ loại cơ sở dữ liệu nào.
- Có nhiều tên miền hoặc tên miền phụ.
- Kết nối với bất kỳ dịch vụ AWS nào khác như S3, RDS (cơ sở dữ liệu), CloudFront (để tạo CDN), SES (để gửi thông báo qua email), v.v. Máy chủ đám mây này có thể lưu trữ từ 5 đến 10 dự án khác nhau. Tất nhiên, điều này sẽ tùy thuộc vào các dự án mà bạn triển khai.
Yêu cầu
- Một tài khoản AWS.
- Đã mua ít nhất một tên miền.
- Có ít nhất một dự án được phát triển.
- Docker và Github/Bitbucket/GitLab.
Các bước thực hiện
1. Đầu tiên hãy Dockerize dự án
Docker container có thể được sử dụng cho bất kỳ dự án nào. Không quan trọng ngôn ngữ hoặc framework nào được sử dụng. Tuy nhiên, mỗi framework hoặc dự án có một phương pháp khác nhau để dockerize nó.
Ví dụ, một Dự án React cần một máy chủ web để chạy cho nó. Bởi vì khi dự án được xây dựng (npm run build), nó sẽ trở thành một trang web HTML. Điều đó có nghĩa là, dự án lỗ hổng sẽ là một tệp index.html với một loạt hình ảnh, CSS và hai hoặc ba gói JS. Đây là cách ReactJS hoạt động. Đó là lý do tại sao bạn sẽ cần một máy chủ web để chạy htm này khi trình duyệt yêu cầu.
Do đó, trong trường hợp của một dự án ReactJS, bạn cần thêm máy chủ Apache hoặc NGINX vào container.
Để dockerize bất kỳ dự án nào, bạn chỉ cần một Dockerfile. Đây là một tệp có tên là “Dockerfile” (không có phần mở rộng), có danh sách các hướng dẫn bên trong. Tệp này cho Docker biết cách xây dựng hình ảnh và những việc cần làm khi container chạy.
Ví dụ: lấy nodeJS, sao chép “package.json”, cài đặt các phụ thuộc, xây dựng ứng dụng react, v.v. Cấu hình máy chủ NGINX và hiển thị nó trên cổng 80.
Dockerfile phải được đặt trong thư mục gốc của dự án, bên cạnh “package.json”.
Đây là ví dụ cụ thể hơn về Dockerfile với Nginx và ReactJS.
### STAGE 1: Build ###
FROM node:20 as build
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install --silent
COPY . /usr/src/app
RUN npm run build ### STAGE 2: Production Environment ###
FROM nginx:1.21.0-alpine
COPY --from=build /usr/src/app/build /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/nginx.conf /etc/nginx/conf.d
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Bên cạnh Dockerfile này, NGINX yêu cầu một tệp có tên là “nginx.conf” để cấu hình. Tạo một thư mục có tên là “nginx" và đặt tệp này vào bên trong:
server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; # to redirect all the requests to index.html, # useful when you are using react-router try_files $uri /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
Trước khi chuyển sang AWS hoặc bất kỳ máy chủ nào, bạn nên kiểm tra cục bộ tất cả các thứ. Có thể xây dựng hình ảnh và chạy container trong máy cục bộ:
#building the docker image
docker build -t myimage . #running the container
docker run -t -d -i --name=mycontainer -p 8000:80 myimage
Nếu mọi việc diễn ra tốt đẹp, trang web sẽ chạy trên http://localhost:8000 trong bất kỳ trình duyệt web nào.
Mỗi lần bạn chạy một container, bạn phải chỉ định nó sẽ chạy trên cổng nào. Do đó, có thể chạy nhiều container, mỗi container trên các cổng khác nhau: 8000, 8001, 8002, v.v. Điều này hữu ích vì nó cho phép cùng một máy chủ có nhiều dự án đang chạy.
2. Xây dựng và cấu hình Cloud Server của bạn
Bước tiếp theo là tạo máy EC2 trong AWS.
AWS có nhiều công cụ. Họ gọi chúng là Services. EC2 là máy ảo được tạo ra với các thông số kỹ thuật phần cứng mong muốn và phần mềm cần thiết. AWS có nhiều hình ảnh dựng sẵn: Ubuntu, Cent, Alpine hoặc thậm chí là Windows.
Lưu ý: Hãy cẩn thận, vì phần cứng hoặc phần mềm bạn chọn liên quan đến mức giá mà bạn phải trả. Lời khuyên của tôi là hãy bắt đầu với các loại phần mềm nhỏ nhất và chỉ nâng cấp lên nếu bạn cần.
Ví dụ, tôi sẽ sử dụng loại nhỏ nhất (Nano), phần mềm này sẽ hữu ích cho 5 đến 10 trang web mà không có vấn đề gì và sẽ giúp chúng ta thực hiện mục đích hướng dẫn này.
3. Triển khai code lên máy EC2
Có ba cách để triển khai mã dự án tới bất kỳ máy EC2 nào:
- Bằng SSH nếu máy EC2 có kết nối mở.
- Kéo một hình ảnh Docker đã được xây dựng sẵn.
- Sao chép và kéo kho lưu trữ git vào máy EC2.
Tải tệp lên bằng SSH là lựa chọn đầu tiên. Nhưng nó không quá thoải mái. Để kéo và đẩy hình ảnh Docker, cần có Docker Hug. Docker Hug là kho lưu trữ trực tuyến giống như GitHub, nhưng dành cho hình ảnh Docker. AWS có một dịch vụ trung tâm có tên là ECR. Nó có thể được sử dụng để tải hình ảnh lên và kéo chúng vào EC2 đang chạy của bạn.
Tuy nhiên, cũng có thể sao chép kho lưu trữ git trong EC2 rồi xây dựng hình ảnh docker để chạy container. Đây là cách dễ nhất và cũng hữu ích; vì đôi khi các lập trình viên đang làm việc trên mã không phải là người triển khai trang web. Bên cạnh đó, có một thông lệ thường xuyên sử dụng GitHub, BitBucket hoặc GitLab; vì vậy, bất kỳ ai cũng có mã đã tải lên đó.
Nghe thì có vẻ dễ dàng, tuy nhiên, máy EC2 cần phải được chuẩn bị trước vì nó không được cài đặt Docker, Git hoặc NGINX.
Kết nối với EC2 của bạn theo cách sau:
#connecting to EC2
ssh -i /path/of/key/downloaded ubuntu@public.ip.address # this command give you full server access
sudo su
Cài đặt Docker.
#update your repositories
apt-get update #install Docker
apt-get install docker.io -y #start Docker daemon
systemctl start Docker #Check if everything is fine
docker –version #Enable Docker to start automatically when the instance starts
systemctl enable docker
Và cài đặt git:
# install git
apt install git #Check if everything is fine
git –version #configure git
git config --global user.name "Your Name"
git config --global user.email "youremail@domain.com"
Sau khi cài đặt GIT và Docker, máy EC2 đã sẵn sàng để tiếp nhận kho lưu trữ.
#clone repository
git clone myreposytoryurl
cd myreposytoryname #build the image
docker build -t myimage . #running the container
docker run -t -d -i --name=mycontainer -p 8000:80 myimage
Vậy là Container đầu tiên hiện đang chạy, nhưng bạn có thể chạy nhiều kho lưu trữ tương tự hoặc từ bất kỳ kho lưu trữ nào khác.
#running another container
docker run -t -d -i --name=mycontainer -p 8001:80 myimage
#running another container
docker run -t -d -i --name=mycontainer -p 8002:80 myimage
#running another container
docker run -t -d -i --name=mycontainer -p 8003:80 myimage
Lưu ý rằng container đầu tiên đang chạy trên cổng 8000 và container thứ hai trên cổng 8001, và container thứ ba trên cổng 8002. Trong trường hợp này, cả ba đều giống nhau. Tuy nhiên, điều này hữu ích khi có các dự án khác nhau trên mỗi cổng. Hãy xem lệnh đang chạy:
docker run -t -d -i --name=mycontainer -p 8003:80 myimage
“-p” flag kết nối cổng EC2 bạn muốn sử dụng trên máy chủ với cổng container được hiển thị. Số bên phải là chính container, tức là những gì container được hiển thị trong hình ảnh Docker; số bên trái là cổng máy EC2 sẽ sử dụng.
#testing the container
curl localhost:8001
Điều này phải phản hồi với tệp index.html của dự án ReatJS được tạo ở bước một.
Các container đã được tạo và các dự án đang chạy. Tuy nhiên, nếu ai đó cố gắng kết nối từ trình duyệt, họ sẽ không thấy gì cả. Bước tiếp theo là kết nối các miền với mỗi container.
4. Tạo sự cân bằng
Trong EC2 này sẽ có nhiều dự án bên trong. Mỗi dự án sẽ là một container và nó sẽ chạy trên một cổng khác nhau. Dự án đầu tiên chạy trên cổng 8000, dự án tiếp theo là 8001, 8002, v.v. Mỗi dự án có thể có các tên miền khác nhau: Myproject1.com, myproject2.com, v.v. Hoặc cũng có thể là một tên miền phụ khác: subdomain1.projects.com, subdomain2.projects.com.
Trong cả hai trường hợp, tên miền hoặc tên miền phụ phải được chuyển hướng đến IP công khai EC2.
Nó sẽ là lệnh chuyển hướng A đơn giản đến số IP. Tuy nhiên, lệnh này cũng không có tác dụng, vì container đầu tiên được tạo không chạy trên cổng 80 hoặc 443.
Vì vậy, EC2 cần một trình cân bằng nhận các yêu cầu của trình duyệt và chuyển hướng đến container đang chạy đúng.
Với mục đích này, có thể cài đặt máy chủ NGINX và sử dụng nó như một proxy ngược. Nginx này sẽ nhận tất cả các yêu cầu cho máy EC2 này và chuyển hướng đến container đúng.
#installing nginx
apt update
apt install nginx
Nếu mọi thứ đều ổn, IP công khai trong trình duyệt web sẽ hiển thị trang Welcome-to-Nginx:
Bất kỳ tên miền hoặc tên miền phụ nào được chuyển hướng đến IP này cũng phải hiển thị trang này.
Bất cứ khi nào một dự án mới được thêm vào, NGINX phải được cấu hình để biết phải làm gì với chúng. NGINX có một tệp cấu hình cho mỗi dự án và phải sao chép hai lần; lần đầu tiên vào “/etc/nginx/sites-available”, và cùng một tệp vào “/etc/nginx/sites-enabled/”. Tên của tệp là tên của tên miền hoặc tên miền phụ. Ví dụ: “subdomain.mydomain.com”
Đây là ví dụ cơ bản của tập tin.
server { root /var/www/subdomain.mydomain.com/html; index index.html index.htm index.nginx-debian.html; server_name subdomain.mydomain.com; location /{ proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Host $host; }
}
Hãy xem tệp ở trên.: Dòng thứ tư chỉ ra Nginx rằng khi bản kiến nghị đến từ subdomain.mydomain.com. Nó phải chuyển hướng đến http://127.0.0.1:8000 . Điều đó có nghĩa là container chạy trên cổng 8000. Tên miền hoặc tên miền phụ chỉ cần khớp với container cổng chạy dự án.
Sau khi tạo các tập tin, NGINX cần khởi động lại.
Kiểm tra xem các tập tin đã được tạo tốt chưa
Sử dụng lệnh nginx-t
-
Khởi động lại NGINX Dùng lệnh systemctl khởi động lại nginx
-
Tải lại NGINX nếu bị lỗi Sau khi khởi động lại NGINX, dự án sẽ được công khai. Và bất kỳ ai cũng có thể truy cập từ trình duyệt web.
Máy chủ đám mây này dành cho 10 hoặc 20 dự án. Nếu một dự án cần cơ sở dữ liệu, có thể kết nối với bất kỳ dịch vụ AWS nào như RDS hoặc DocumentDB. Tuy nhiên, cũng có thể chạy một container khác với cơ sở dữ liệu trên cùng một máy EC2.
EC2 cũng có thể kết nối với S3 hoặc bất kỳ dịch vụ AWS nào cần thiết.
Các bước tương tự phải được lặp lại để thêm bất kỳ dự án mới nào. Và EC2 có một phần giám sát trong bảng điều khiển AWS để biết máy chủ có bị bão hòa hay có dung lượng trống cho nhiều dự án hơn không.
Cảm ơn các bạn đã theo dõi bài viết vừa rồi.