การติดตั้ง Laravel บน EC2 (Amazon Linux 2023)

การใช้ Laravel บน Amazon EC2 (Amazon Linux 2023) ช่วยให้เราสามารถสร้างและดูแลระบบเว็บแอปพลิเคชันได้อย่างมีประสิทธิภาพ และเป็นทางเลือกที่ดีสำหรับการพัฒนาและการขยายขนาดโปรเจกต์ของเราในอนาคต

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

ครั้งนี้จะมาแนะนำการติดตั้ง Laravel ลงใน EC2 (Amazon Linux 2023) โดยใช้งาน Server ผ่าน Nginx
ซึ่งการใช้ Laravel บน Amazon EC2 ช่วยให้เราสามารถสร้างและดูแลระบบเว็บแอปพลิเคชันได้อย่างมีประสิทธิภาพ

สิ่งที่ต้องมี

หมายเหตุ: อาจมีบทความที่แปะลิงก์ซ้ำกันอยู่ หากเจอบทความที่เคยทำไปแล้วให้ข้ามไปได้เลยครับ

สิ่งที่ต้องทำก่อนติดตั้ง Laravel

ติดตั้ง Amazon Linux 2023 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY

การติดตั้ง EC2 Instance (Amazon Linux 2023) ครั้งนี้ ต้องใช้ Instance type: t3a.micro หรือ Instance type ที่มี Memory 1 GiB ขึ้นไป เพื่อรองรับการติดตั้ง MariaDB

ดูตัวอย่างการสร้าง Amazon Linux 2023 ได้ที่ลิงก์บทความด้านล่างนี้ (ลิงก์บทความด้านล่างนี้เป็นแค่ตัวอย่าง ซึ่งมีการตั้งค่าบางส่วนที่แตกต่างกัน แนะนำให้ดู ตัวอย่างการสร้าง EC2 Instance ประกอบด้วย)

ตัวอย่างการสร้าง EC2 Instance

Region: Singapore

※Launch instances
Name and tags
Name: tinnakorn-test (ตั้งชื่อที่ต้องการ)

Application and OS Images (Amazon Machine Image)
Amazon Machine Image (AMI): Amazon Linux 2023 AMI

Instance type
Instance type: t3a.micro (เลือกสเปคตามต้องการ)

Key pair (login)
Key pair name - required: tinnakorn-test (ตัวอย่างนี้จะเลือกเป็น .ppk)

Network settings
Firewall (security groups)
Security group name - required: tinnakorn-test (ตั้งชื่อที่ต้องการ)
Description - required: tinnakorn-test (ป้อนตามต้องการ)
Inbound security groups rules
Security group rule 1 (TCP, 22, xxx.xxx.xxx.xxx/32)
Type: ssh | Source type: My IP | Source: xxx.xxx.xxx.xxx/32

Configure storage
1x: 8 GiB gp2 Root volume (Default)

ตั้งค่า Time Zone ใน EC2 Instance

รันคำสั่งเปลี่ยน Time Zone จาก UTC ให้เป็น +07

ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime


รันคำสั่งตรวจสอบวันที่และเวลาปัจจุบัน

date

อ่านรายละเอียดเพิ่มเติมได้ที่บทความด้านล่างนี้

Restart EC2 Instance

เมื่อเปลี่ยน Time Zone เสร็จแล้ว ให้รันคำสั่งด้านล่างนี้เพื่อ Restart EC2 Instance

shutdown -r now


ในส่วนของ PuTTY จะถูกตัดการเชื่อมต่อ ก็ให้คลิกขวาที่แถบด้านบนของ PuTTY แล้วเลือก Restart Session


รันคำสั่งเข้าสู่ระบบผู้ใช้ระดับสูงสุดหรือ root (Superuser) อีกครั้ง

sudo su -

เรียกใช้ PHP โดยใช้ Nginx บน EC2 (Amazon Linux 2023)

ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้

ติดตั้ง MariaDB และสร้าง Database ใน Amazon Linux 2023

ต่อไปรันคำสั่งกลับมาที่ path root

cd ~/

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx html]# cd ~/
[root@ip-xx-xx-xx-xx ~]#


ต่อไปติดตั้ง MariaDB ตามขั้นตอนลิงก์ด้านล่างนี้โดยยังไม่ต้องสร้าง Database

สร้าง Database สำหรับ Laravel

ต่อไปเราจะสร้าง Database laravel สำหรับ Data migration โดยมีรายละเอียดข้อมูลการตั้งค่า MariaDB เบื้องต้นดังนี้

Hostname: localhost (127.0.0.1)
User: root
Password: P@ssW0rd


รันคำสั่ง Login เข้าไปยัง Prompt ของ MariaDB (หาก Login ไว้อยู่แล้ว ข้ามไปได้เลย)

mysql -u root -h localhost


แล้วรันคำสั่งเปลี่ยนรหัสผ่าน โดยในตัวอย่างนี้จะใช้เป็นรหัส P@ssW0rd (เปลี่ยน "P@ssW0rd" ในคำสั่งให้เป็นรหัสผ่านของคุณ)

SET PASSWORD FOR 'root'@localhost = PASSWORD("P@ssW0rd");
ALTER USER 'root'@'localhost' IDENTIFIED BY 'P@ssW0rd';


แล้วรันคำสั่งออกจาก Prompt ของ MariaDB

quit


แล้วทดสอบ Login เข้าไปยัง Prompt ของ MariaDB อีกครั้งโดยป้อนรหัสผ่านใหม่ของคุณ

mysql -u root -pP@ssW0rd -h localhost


ต่อไปรันคำสั่งสร้าง Database laravel สำหรับ Data migration (รันโดยไม่ต้องทำการเปลี่ยนแปลงอะไร)

CREATE DATABASE IF NOT EXISTS laravel DEFAULT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';


แล้วรันคำสั่งแสดงรายการ Database ใน MariaDB

show databases;

จะเห็นว่ามีชื่อ Database laravel แสดงขึ้นมา ซึ่งเราสามารถใช้ Database laralvel นี้เป็นฐานข้อมูลสำหรับโปรเจกต์ Laravel ได้ครับ

root@ip-xx-xx-xx-xx:~

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.000 sec)

MariaDB [(none)]>


แล้วรันคำสั่งออกจาก Prompt ของ MySQL และทำขั้นตอนถัดไปได้เลยครับ

quit

root@ip-xx-xx-xx-xx:~

MariaDB [(none)]> quit
Bye
[root@ip-xx-xx-xx-xx ~]#

ติดตั้ง Composer ใน EC2 Instance

ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้

ติดตั้ง MySQL Improved Extension

MySQLi (MySQL Improved) เป็นส่วนขยายของ PHP ที่ช่วยให้ PHP เชื่อมต่อและทำงานกับฐานข้อมูล MySQL ได้ ส่วนขยายนี้มีฟังก์ชันและความสามารถที่มากกว่า MySQL extension ที่ใช้กับ PHP 5.5.0 ขึ้นไป

ต่อไปรันคำสั่งติดตั้ง MySQLi

yum install php-mysqli -y

ดูรายละเอียดเกี่ยวกับ MySQLi เพิ่มเติมได้ที่ลิงก์ด้านล่างนี้
MySQL Improved Extension

แก้ไข EC2 Instance ไม่ตอบสนองระหว่างดำเนินการ

หากติดตั้ง MySQL Improved Extension แล้ว EC2 Instance ไม่ตอบสนอง ให้ทำตามขั้นตอนนี้

ระหว่างที่เรากำลังใช้งานหรือรันคำสั่งใน Server Instance ผ่าน SSH อยู่ แล้วหาก EC2 Instance ไม่ตอบสนองหรือหยุดทำงานไปแบบกะทันหัน เป็นเพราะ Instance Type ที่เราใช้งานไม่เพียงพอในการประมวลผล ซึ่งมักจะเกิดขึ้นหลังจากติดตั้งแอปพลิเคชันต่างๆ ที่มีการประมวลผลเกี่ยวกับ Server Database หรือแพคเกจที่ใช้กับ MySQL Database ใน PHP เช่น "MySQL Improved Extension", "MariaDB Server", "MySQL Server" เป็นต้น

เราสามารถแก้ไขปัญหานี้ได้โดยการ Stop/Start EC2 Instance ตามด้วย เปลี่ยน Instance Type หรือทำ Swap Memory ได้ตามลิงก์ด้านล่างนี้เลย (เลือกทำอย่างใดอย่างหนึ่ง)

เปลี่ยน Instance Type

Swap Memory

ติดตั้ง Laravel ใน EC2 (Amazon Linux 2023)

ในบทความนี้เราจะมาเน้นที่การติดตั้ง Laravel ใน EC2 กันครับ
ถ้าเราทำตามขั้นตอนในหัวข้อ สิ่งที่ต้องมี ทั้งหมดโดยที่ไม่ติดปัญหาเลย ก็ให้เริ่มทำขั้นตอนในหัวข้อการติดตั้ง Laravel ใน EC2 ได้เลยครับ

รันคำสั่งติดตั้งฟังก์ชัน XML Documents และ mbstring

yum install php-dom -y
yum install php-mbstring -y


รันคำสั่งลบโฟลเดอร์ html ออก

rm -rf /var/www/html


รันคำสั่งเข้ามาที่ path /var/www

cd /var/www

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx ~]# cd /var/www
[root@ip-xx-xx-xx-xx www]#


แล้วรันคำสั่งติดตั้ง Laravel ลงในโฟลเดอร์ html แล้วพิมพ์ yes ("html" นี้คือชื่อโฟลเดอร์ที่จะถูกสร้างหลังจากรันคำสั่งนี้ไปและโปรเจกต์ Laravel จะถูกบันทึกลงในนี้อัตโนมัติ ก็จะเป็น /var/www/html)

composer create-project laravel/laravel html


แล้วรันคำสั่งเปลี่ยนแปลงสิทธิ์การเข้าถึงให้กับโฟลเดอร์ html

chmod -R 777 /var/www/html


เนื่องจากตอนนี้กำลังอยู่ใน path /var/www/ ก็ให้รันคำสั่งเข้ามาที่ path html

cd html

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx www]# cd html
[root@ip-xx-xx-xx-xx html]#

แก้ไขไฟล์ nginx.conf เพื่อใช้สำหรับ Laravel

รันคำสั่งแก้ไขไฟล์ nginx.conf

vi /etc/nginx/nginx.conf


เมื่อเข้ามาที่ไฟล์ nginx.conf แล้ว แก้ไขดังนี้:
» กดปุ่ม i ให้คำว่า "/etc/nginx/nginx.conf" ที่อยู่ด้านล่างซ้ายเปลี่ยนเป็น -- INSERT --
» เลื่อนลงมาด้านล่างจนเจอคำว่า server
» มาที่บรรทัด root ใน server แล้วเพิ่ม /public ต่อท้าย /var/www/html ก็จะเป็น /var/www/html/public; เหมือนกับตัวอย่างด้านล่าง
» แล้ว Comment error_page 404 และ error_page 500 โดยการใส่ # ข้างหน้าโค้ดตามที่มาร์คไว้ในบรรทัดที่ 15,16,17 | 19,20,21 ของด้านล่างนี้เลยครับ

root@ip-xx-xx-xx-xx:~

"...ไม่ได้แสดง Code ส่วนบน..."

    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/html/public;    # เพิ่ม /public ที่นี่

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

#        error_page 404 /404.html;
#        location = /404.html {
#        }

#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
    }

"...ไม่ได้แสดง Code ส่วนล่าง..."

-- INSERT --                                           48,31         40%    # กดปุ่ม i ที่แป้นพิมพ์


เมื่อเปลี่ยน path root และ comment error_page เสร็จแล้วทำการ Save ตามนี้:
» กดปุ่ม Esc ให้คำว่า -- INSERT -- ที่อยู่ด้านล่างซ้ายหายไป
» พิมพ์ :x หรือ :wq + Enter เพื่อบันทึก

root@ip-xx-xx-xx-xx:~

"...ไม่ได้แสดง Code ส่วนบน..."

    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/html/public;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

#        error_page 404 /404.html;
#        location = /404.html {
#        }

#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
    }

"...ไม่ได้แสดง Code ส่วนล่าง..."

:x

แก้ไขไฟล์ php.conf เพื่อใช้สำหรับ Laravel

รันคำสั่งแก้ไขไฟล์ php.conf

vi /etc/nginx/default.d/php.conf


แล้วลบสิ่งที่เขียนไว้ในไฟล์นี้ทั้งหมดโดยกดปุ่ม d ที่แป้นพิมพ์ 2 ครั้งไปเรื่อยๆจนหมด และกดปุ่ม i เพื่อแก้ไข แล้วคัดลอก Code ด้านล่างนี้ทั้งหมดวางลงไปได้เลย

index index.php index.html index.htm;

location ~ \.(php|phar)(/.*)?$ {
    fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

    fastcgi_intercept_errors on;
    fastcgi_index  index.php;

    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  REQUEST_SCHEME     $scheme;
    fastcgi_param  HTTPS              $https if_not_empty;

    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;

    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    200;

    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_pass   php-fpm;
}

เมื่อแก้ไขไฟล์ php.conf เสร็จแล้ว ให้บันทึกการตั้งค่าโดยพิมพ์ :x หรือ :wq + Enter ได้เลยครับ

สร้างไฟล์ laravel.conf เพื่อใช้สำหรับ Laravel

รันคำสั่งสร้างไฟล์ laravel.conf

vi /etc/nginx/default.d/laravel.conf


เมื่อเข้ามาที่ไฟล์ laravel.conf แล้ว กดปุ่ม i เพื่อแก้ไข แล้วคัดลอก Code ด้านล่างนี้และวางลงในไฟล์

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

เมื่อวาง Code ลงในไฟล์ laravel.conf เสร็จแล้ว ให้บันทึกการตั้งค่าโดยพิมพ์ :x หรือ :wq + Enter ได้เลยครับ

ต่อไปรันคำสั่ง Restart Nginx

systemctl restart nginx


แล้วรันคำสั่งแก้ไขไฟล์ .env เพื่อแก้ไข Password ของ Database

vi .env


เมื่อเข้ามาที่ไฟล์ .env แล้ว กดปุ่ม i เพื่อแก้ไข แล้วค้นหา DB_PASSWORD และป้อน Password ของเราลงไป (Password ในตัวอย่างนี้คือ P@ssW0rd)

DB_PASSWORD=P@ssW0rd

เมื่อแก้ไข Password เสร็จแล้ว ให้บันทึกการตั้งค่าโดยพิมพ์ :x หรือ :wq + Enter ได้เลยครับ

แล้วรันคำสั่ง migrate ข้อมูลสำหรับโปรเจกต์ Laravel

php artisan migrate:fresh

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx html]# php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (31.78ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (30.32ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (30.78ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (51.01ms)
[root@ip-xx-xx-xx-xx html]#

ตรวจสอบหน้าเว็บไซต์ Laravel

เมื่อทำตามขั้นตอนทุกอย่างเสร็จเรียบร้อยแล้ว คัดลอก Public IPv4 address จากหน้าจอ EC2 Instance ของเรา แล้วนำไปเปิดบนเว็บเบราว์เซอร์ที่เราใช้งาน ก็จะแสดงหน้าจอเหมือนกับรูปด้านล่างนี้ครับ

เพียงเท่านี้เราก็มีสภาพแวดล้อมสำหรับสร้างโปรเจกต์ Laravel ใน EC2 ของเราแล้วครับ

สรุป

การสาธิตนี้เราจะเน้นไปที่การติดตั้งโปรเจกต์ Laravel ลงใน EC2 และติดตั้งแอปพลิเคชันต่างๆ เสริมเพื่อใช้งานกับ Laravel และการใช้งาน Laravel ใน EC2 นั้น จะเพิ่มประสิทธิภาพการดำเนินการโปรเจกต์ Laravel ของเราทั้งในด้านการพัฒนาหรือในสภาพแวดล้อมใช้งานจริงได้เป็นอย่างดี ซึ่งจะมีความรวดเร็วมากๆ นั่นเป็นเพราะว่าเป็นการประมวลผลของ EC2 นั่นเองครับ

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง