วิธีการติดตั้ง Laravel บน EC2 (Amazon Linux 2)

การติดตั้ง Laravel ลงใน EC2 (Amazon Linux 2) จะทำให้โปรเจกต์ Laravel ของเรามีประสิทธิภาพในการใช้งานที่ทรงพลังจากการประมวลผลของ EC2 ยิ่งไปกว่านั้นยังเป็นการใช้งาน Server ผ่าน Nginx ที่รวดเร็วที่สุด และเป็นที่นิยมในตอนนี้อีกด้วย

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

สวัสดีครับ ครั้งนี้ผมจะมาอธิบายเกี่ยวกับ วิธีการติดตั้ง Laravel บน EC2 (Amazon Linux 2)

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

หมายเหตุ: ผมจะเรียงบทความที่ต้องทำตามลำดับขั้นตอนไว้ที่ด้านล่างนี้ ซึ่งจะมีบทความที่แปะลิงก์ซ้ำกันอยู่ในแต่ละบทความ เช่น บทความ 「【Update】วิธีติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY」 เป็นต้น ถ้าผู้อ่านเห็นบทความที่ซ้ำกันก็ให้ข้ามขั้นตอนนั้นๆไปได้เลยครับ ! ถ้าอ่าน หมายเหตุ จบแล้วเรามาเริ่มกันเลยครับ

สิ่งที่จะทำในบทความนี้
ติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
ตั้งค่า Time Zone ใน Amazon Linux 2 ของ EC2
Restart EC2 Instance (Amazon Linux 2)
เรียกใช้ PHP โดยใช้ Nginx บน EC2 (Amazon Linux 2)
ติดตั้ง MySQL 8 และสร้าง Database ใน Amazon Linux 2
ติดตั้ง Composer ใน EC2 (Amazon Linux 2)

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

การติดตั้ง EC2 Instance (Amazon Linux 2) ในครั้งนี้ ต้องใช้ Instance type: t3a.micro หรือ Instance type ที่มี Memory 1 GiB ขึ้นไป เพื่อรองรับการติดตั้ง MySQL8 สามารถอ่านรายละเอียดเพิ่มเติมได้โดยคลิกที่ ข้อควรระวัง นี้ครับ

ทำการติดตั้ง EC2 Instance (Amazon Linux 2) เพื่อใช้ในการติดตั้ง Laravel และแอปพลิเคชันต่างๆ โดยดูตามลิงก์ด้านล่างนี้เป็นตัวอย่างได้เลยครับ

ตัวอย่างการตั้งค่าการติดตั้ง EC2 Instance (Amazon Linux 2) ในบทความนี้

Create Key pairs
» Name:tinnakorn-test
» Private key file format:.ppk

Launch instances
※Name and tags
» Name:tinnakorn-test

※Application and OS Images (Amazon Machine Image)
» Amazon Machine Image (AMI):Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type(Default)

※Instance type
» Instance type:t3a.micro

※Key pair (login)
» Key pair name - required:tinnakorn-test

※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, 0.0.0.0/0)
» Type:ssh ▼| Source type:My IP ▼| Source:xxx.xxx.x.xxx/32 ✕

※Configure storage
» 1x:8GiBgp2 ▼Root volume (Default)


ตั้งค่า Time Zone ใน Amazon Linux 2 ของ EC2

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

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

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

date

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


Restart EC2 Instance (Amazon Linux 2)

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

shutdown -r now

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

รันคำสั่งนี้เพื่อเข้าใช้งานในฐานะผู้ใช้ที่มีสิทธิ์ root อีกครั้ง

sudo su -

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

ทำการเรียกใช้ PHP โดยใช้ Nginx บน EC2 ตามขั้นตอนของลิงก์ด้านล่างนี้ครับ ↓


ติดตั้ง MySQL 8 และสร้าง Database ใน Amazon Linux 2

เมื่อทำการเรียกใช้ PHP โดยใช้ Nginx บน EC2 เสร็จเรียบร้อยแล้ว ให้รันคำสั่งด้านล่างนี้เพื่อกลับมาที่ root

cd ~/

Output (example)

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 html]# cd ~/
[root@ip-172-31-27-236 ~]#


จากนั้นทำการติดตั้ง MySQL 8 ตามขั้นตอนของลิงก์ด้านล่างนี้ครับ ↓ (ถ้าเราใช้งานในฐานะผู้ใช้งานสิทธิ์ root อยู่แล้ว ให้ข้ามขั้นตอนรันคำสั่ง sudo su - ไปได้เลยครับ)

เมื่อทำตามขั้นตอนทุกอย่างของการติดตั้ง MySQL 8 และสร้าง Database ใน Amazon Linux 2 เสร็จแล้ว ก็ถือว่าเราสามารถใช้งาน MySQL 8 ได้ครับ

ขั้นตอนถัดไปผมจะสร้าง Database:laravelสำหรับใช้ในการเชื่อมต่อกับ DB เช่น phpMyAdmin โดยมีรายละเอียดข้อมูลการตั้งค่า MySQL 8 เบื้องต้นดังนี้ครับ

hostname: localhost (127.0.0.1)
User: root
Password: P@ssW0ld


การสร้าง Database Laravel สำหรับใช้ในการเชื่อมต่อกับ DB
รันคำสั่งนี้เพื่อเข้าไปยัง Prompt ของ MySQL (เปลี่ยน P@ssW0ld ให้เป็น Password ของคุณ)

mysql -u root -pP@ssW0ld mysql -h localhost


รันคำสั่งนี้เพื่อสร้าง Database:laravelสำหรับใช้ในการเชื่อมต่อกับ DB (รันโดยไม่ต้องทำการเปลี่ยนแปลงอะไรครับ)

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


รันคำสั่งนี้เพื่อแสดงชื่อ Database ใน MySQL

show databases;

Output (example)
จะเห็นว่ามีชื่อ Database:laravelแสดงขึ้นมา ซึ่งเราสามารถใช้ Database laralvel นี้ไปเชื่อมต่อกับ DB อื่นๆได้ เช่น phpMyAdmin เป็นต้น

root@ip-172-31-27-236:~

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
| tinnakorn-mysql8   |
+--------------------+
6 rows in set (0.01 sec)


รันคำสั่งนี้เพื่อออกจาก Prompt ของ MySQL จากนั้นให้ทำขั้นตอนถัดไปได้เลยครับ

quit

Output (example)

root@ip-172-31-27-236:~

mysql> quit
Bye
[root@ip-172-31-27-236 ~]#

ติดตั้ง Composer ใน EC2 (Amazon Linux 2)

ทำการติดตั้ง Composer ใน EC2 ตามขั้นตอนของลิงก์ด้านล่างนี้ครับ ↓

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

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

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

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


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

rm -rf /var/www/html


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

cd /var/www

Output (example)

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 ~]# cd /var/www
[root@ip-172-31-27-236 www]#


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

composer create-project laravel/laravel html


เมื่อติดตั้ง Laravel เสร็จแล้ว รันคำสั่งนี้เพื่อเปิดการใช้งานขั้นสูงให้กับโฟลเดอร์ html

chmod -R 777 /var/www/html


ต่อไปรันคำสั่งนี้เพื่อเข้ามาที่/var/www/html

cd html

Output (example)

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 www]# cd html
[root@ip-172-31-27-236 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ของด้านล่างนี้เลยครับ
Output (example)

root@ip-172-31-27-236:~

"...ตัด 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 ที่แป้นพิมพ์


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

root@ip-172-31-27-236:~

"...ตัด 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


เมื่อเข้ามาที่ไฟล์ php.conf แล้วทำการลบสิ่งที่เขียนไว้ในไฟล์นี้ทั้งหมดโดยการกดปุ่ม d ที่แป้นพิมพ์ 2 ครั้งไปเรื่อยๆจนหมด จากนั้นกดปุ่มiเพื่อที่จะทำการแก้ไข แล้ว Copy 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 แล้ว Copy Code นี้ลงในไฟล์โดยกดปุ่มiเพื่อแก้ไขและวางเหมือนกับขั้นตอนที่แล้วได้เลยครับ

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

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


รันคำสั่งนี้เพื่อ Restart Nginx

systemctl restart nginx


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

vi .env


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

DB_PASSWORD=P@ssW0ld

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


จากนั้นให้รันคำสั่งนี้เพื่อทำการเชื่อมโยงข้อมูลกับ DB เพื่อนำไปใช้กับฐานข้อมูลที่เราต้องการครับ

php artisan migrate:fresh

Output (example)

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 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-172-31-27-236 html]#

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

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

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

สรุป

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

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