Quay lại

Thực Hành: Triển khai Ứng Dụng Laravel Với Auto Scaling Và Load Balancing Trên AWS Chuyên mục EC2 Service - Elastic Load Balancing & Auto Scaling Group    2024-04-30    11 Lượt xem    10 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận    capacity-filled Sidebar

   

Trong thời đại số hóa ngày nay, việc xây dựng và triển khai các ứng dụng web đòi hỏi sự linh hoạt và hiệu quả cao, đặc biệt là khi xử lý tải lớn và đáp ứng nhanh chóng với sự thay đổi của nhu cầu người dùng. Trên môi trường cloud của Amazon Web Services (AWS), việc sử dụng dịch vụ Auto Scaling và Load Balancing là một phương pháp hiệu quả để tăng cường khả năng mở rộng và độ tin cậy của ứng dụng của bạn.

Bài viết này sẽ hướng dẫn bạn qua quá trình triển khai ứng dụng Laravel trên AWS, sử dụng các dịch vụ Auto Scaling và Load Balancing. Chúng ta sẽ tìm hiểu cách thiết lập một môi trường triển khai linh hoạt và tự động, giúp ứng dụng của bạn có thể tự động mở rộng hoặc thu nhỏ dựa trên yêu cầu của người dùng.

Nội dung:

  1. Chuẩn bị Môi trường Triển khai:

    • Hướng dẫn cách tạo và cấu hình một môi trường triển khai Laravel trên AWS, bao gồm việc thiết lập EC2 instances, và cài cắm packages, dependencies..
  2. Triển khai Ứng dụng Laravel:

    • Hướng dẫn cách triển khai ứng dụng Laravel lên môi trường AWS, bao gồm cài đặt, cấu hình và quản lý mã nguồn của ứng dụng trên các EC2 instances.
  3. Cấu hình Auto Scaling và Load Balancing:

    • Hướng dẫn cách cấu hình các dịch vụ Auto Scaling và Load Balancing để tự động điều chỉnh số lượng và phân phối tải giữa các EC2 instances.

Môi trường Triển khai

Để triển khai được ứng dụng này chúng ta sẽ cùng nhau tạo ra 2 servers với OS là ubuntu bản 20.04, 1 server cho Database sử dụng mariaDB server, và 1 server cho Application của chúng ta. Các bước mà chúng ta sẽ lần lượt thực hiện như sau:

Server Database:

  • Cài đặt mariaDB:
    1. sudo apt update
    2. sudo apt install mariadb-server
    3. sudo systemctl start mariadb.service
    4. sudo mysql_secure_installation
    5. mysql -u root -p
  • Tạo mariaDB user:
    • CREATE USER 'username'@'%' IDENTIFIED BY 'password';
  • Tạo Database cho ứng dụng:
    • create database your_database;
  • Phân quyền cho user:
    • GRANT ALL PRIVILEGES ON `ten_cơ_sở_dữ_liệu`.* TO 'username'@'%' WITH GRANT OPTION;
      
    • SELECT user, host FROM mysql.user;
  • Thiết lập ra ngoài internet:
    1. vim /etc/mysql/mariadb.conf.d/50-server.cnf
    2. // sửa bind-address = 127.0.0.1 thành
      bind-address = 0.0.0.0
    3. sudo systemctl restart mariadb
    4. Kiểm tra xem có chạy được ngoài internet hay chưa:
      • netstat -tuln
      • Hoặc check bên máy chủ ứng dụng
      • telnet <IP_address> <port>:

Server Ứng dụng:

  • OS: Ubuntu 20.04
  • Development Tool:
    • LEMP Stack (Linux + Nginx + + PHP)
      • PHP 8.1 (cli)
      • Nginx version
    • Git version 2.18.1 (Linux)
    • Composer 2
  • Editor: Vim

Cài đặt PHP

    • Cập nhật hệ thống Ubuntu: Cập nhật hệ thống Ubuntu để bắt đầu quá trình cài đặt PHP 8.1 trên Ubuntu 20.04 bằng cách đảm bảo rằng hệ thống đã được cập nhật và nâng cấp.
      • sudo apt update && sudo apt -y upgrade
    • Thêm kho lưu trữ PPA của Ondřej Surý: Đối với Ubuntu 20.04, các gói nhị phân PHP 8.1 có sẵn trong kho lưu trữ PPA của Ondřej Surý. Kho lưu trữ này cần được thêm vào hệ thống một cách thủ công bằng cmd dưới đây:
      • sudo apt update
        sudo apt install lsb-release ca-certificates apt-transport-https software-properties-common -y
        sudo add-apt-repository ppa:ondrej/php
        sudo apt update
    • Install PHP 8.1 on Ubuntu 20.04: 
      1. Chúng ta giờ đã có thể install PHP 8.1 trên máy Linux Ubuntu 20.04. Chạy lệnh sau:
        • Lưu ý: Khi cài lệnh dưới nó có hỏi muốn cài Apache không thì các bạn chọn No nhé, vì chúng ta sẽ sử dụng Nginx, Nếu các bạn nhập Yes, nó sẽ hiện thị giao diện của Apache đó, trong khi lại đang dùng Nginx, để không bị hiểu nhầm nên các bạn chú ý chỗ cài này.
        • sudo apt install php8.1
      2. Kiểm tra version:
        • php --version
    • Cài đặt các package đi kèm PHP 8.1:
      1. sudo apt install php8.1-{bcmath,xml,fpm,mysql,zip,intl,ldap,gd,cli,bz2,curl,mbstring,pgsql,opcache,soap,cgi}
      2. php --modules
    • Kiểm tra php-fpm đã được chạy chưa: Nếu sử dụng PHP với máy chủ web Nginx, đảm bảo dịch vụ php-fpm đã được bật và chạy hay chưa:
      • systemctl status php*-fpm.service
      • Cấu hình mặc định của PHP-FPM để thiết lập socket listener, user và thông tin khác được đặt trong:
        • $ ls  -1 /etc/php/8.1/fpm/
          conf.d
          php-fpm.conf
          php.ini
          pool.d
          $ sudo vim /etc/php/8.1/fpm/pool.d/www.conf
          $ sudo vim /etc/php/8.1/fpm/php-fpm.conf

Cài đặt Nginx

    • sudo apt update
      sudo apt install nginx
      sudo systemctl enable nginx
      sudo systemctl enable  php8.1-fpm
    • systemctl status nginx
    • Sau khi các bạn cài đặt xong và copy IP lên browser mà chạy được như hình bên dưới là thành công

Cài đặt Composer và Git

  • Cài đặt Git:
    • sudo apt update
    • sudo apt install git
    • git --version
    • git config --global user.name "Your Name"
      git config --global user.email "youremail@domain.com"
      git config --list
  • Cài đặt composer:
    • sudo apt update
      cd ~
    • curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
    • HASH=`curl -sS https://composer.github.io/installer.sig`
    • echo $HASH
    • php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    • sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
    • Output
      All settings correct for using Composer
      Downloading...
      
      Composer (version 2.3.5) successfully installed to: /usr/local/bin/composer
      Use it: php /usr/local/bin/composer
    • composer

Triển khai Ứng dụng Laravel

  1. Tạo thư mục cho Laravel app trên server:
    1. sudo su -
      cd /var/www/html
      
    2. Tạo thư mục cho dự án của bạn. Ở đây mình đặt là laravel-app, các bạn có thể đặt theo dự án của các bạn. Sau đó mình sẽ clone dự án của mình vào trong folder này ở bước sau.
      • sudo mkdir laravel-app
    3. Clone source code
      • Link github source code: Link vào thư mục laravel-app.
    4. Cài đặt:
      1. cp .env.example .env
        chmod 644 .env
        php artisan key:generate
        chmod -Rf 775 storage/
      2. composer install
      3. Nếu dự án của bạn cần chạy thêm lệnh gì. Thì cứ chạy như bình thường nhé! Ví dụ:
        • php artisan migrate
          php artisan db:seed
    5. Check health and IP
      1. Route::get('/health-check', function () {
            return response()->json(['status' => 'OK'], 200);
        });
        
        Route::get('/get-ip', function (Request $request) {
            $clientIp = $request->header('X-Forwarded-For');
            
            return response()->json(['ip' => $clientIp], 200);
        });
  2. Tạo user deploy:
    Trước khi các bạn làm theo các bước bên dưới hãy kiếm tra giúp mình hiện tại Nginx của các bạn đang sử dụng user nào và nhóm nào bằng lệnh sau:
    sudo vim /etc/php/8.1/fpm/pool.d/www.conf​

    Các bạn sẽ thấy ở dòng này:

    listen.owner = www-data //user của Nginx
    listen.group = www-data // group của Nginx
    ;listen.mode = 0660
    

    1. Tạo ra một user deployer để chuyên phục vụ deploy code cho dự án.
      • sudo adduser deployer
    2. Laravel cần quyền đọc ghi dữ liệu để lưu cache file và upload file. Do đó, các thư mục tạo bởi deployer phải có quyền đọc ghi qua Nginx web server. Thêm nhóm quyền www-data của Nginx vào user deployer bằng command sau:
      • sudo usermod -aG www-data deployer
    3. Tiếp theo, cần cấu hình mặc định quyền khi tạo mới file, folder bằng user deployer là 644 (file) và 755 (folder). Điều này giúp cho deployer có thể đọc và ghi file, trong khi các nhóm hoặc user khác có thể đọc được. Thực hiện cấu hình này bằng lệnh umask =022 như sau:
      • sudo chfn -o umask=022 deployer
    4. Source code upload lên server sẽ lưu ở /var/www/html/laravel-app, nên chúng ta cần đổi ownership của folder cho user deployer và nhóm người dùng của Nginx là www-data.
      • sudo chown deployer:www-data /var/www/html/laravel-app
    5. User deployer cần quyền sửa các file và folder trong /var/www/html/laravel-app ngay cả khi được tạo sau này. Như vậy mọi file, folder, sub-folder được tạo trong folder đều kế thừa permission của folder cha. Thực hiện câu lệnh sau để set group id cho folder:
      • sudo chmod g+s /var/www/html/laravel-app
  3. Cấu hình Nginx cho dự án:
    1. Tạo nginx config: Hãy thay example.com.confg thành domain của các bạn trong demo này mình sẽ dùng với tên là laravel-app.com.conf
      • sudo nano /etc/nginx/sites-available/example.com.conf 
    2. Sau khi tạo xong thì các bạn copy đoạn config nginx dưới đây và thay thế root path folder đến dự án của bạn:
      • server {
            listen 80;
            server_name _;
            root /var/www/html/project_name/public;
        
            add_header X-Frame-Options "SAMEORIGIN";
            add_header X-XSS-Protection "1; mode=block";
            add_header X-Content-Type-Options "nosniff";
        
            index index.html index.htm index.php;
        
            charset utf-8;
        
            location / {
                try_files $uri $uri/ /index.php?$query_string;
            }
        
            location = /favicon.ico { access_log off; log_not_found off; }
            location = /robots.txt  { access_log off; log_not_found off; }
        
            error_page 404 /index.php;
        
            location ~ \.php$ {
                fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
                include fastcgi_params;
                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 $scheme;
            }
        
            location ~ /\.(?!well-known).* {
                deny all;
            }
        }
    3. Tạo symbolic link đến folder sites-enabled:
      • sudo ln -s /etc/nginx/sites-available/laravel-app.com.conf /etc/nginx/sites-enabled/
    4. Kiểm tra xem cấu hình:
      •  sudo nginx -t
    5. Restart Nginx:
      • sudo systemctl restart nginx
    6. Lưu ý:
      1. Khi cài Nginx mặc định 1 file default đc tạo trong /sites-available và nó đang sử dụng cổng 80, khi các bạn tạo 1 file mới như trên mà cũng sử dụng cổng 80 thì nó sẽ bị conflict, Vì thế bạn có thể xóa file default đó đi.

Auto Scaling và Load Balancing

Để cấu hình được Auto Scaling và Load Balancing các bạn xem trong video nhé! Vì nội dung khá dài nên mình không thể viết chi tiết được các bạn thông cảm cho mình nhé!

Kết luận

Với sự kết hợp của AWS, Auto Scaling và Load Balancing, bạn có thể xây dựng một môi trường triển khai linh hoạt và đáng tin cậy cho ứng dụng Laravel của mình. Hãy bắt đầu hành trình của bạn với hướng dẫn này để tối ưu hóa hiệu suất và khả năng mở rộng của ứng dụng của bạn trên môi trường cloud của AWS.

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday