การติดตั้ง Laravel บน EC2 (Amazon Linux 2023)
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
ครั้งนี้จะมาแนะนำการติดตั้ง Laravel ลงใน EC2 (Amazon Linux 2023) โดยใช้งาน Server ผ่าน Nginx
ซึ่งการใช้ Laravel บน Amazon EC2 ช่วยให้เราสามารถสร้างและดูแลระบบเว็บแอปพลิเคชันได้อย่างมีประสิทธิภาพ
สิ่งที่ต้องมี
หมายเหตุ: อาจมีบทความที่แปะลิงก์ซ้ำกันอยู่ หากเจอบทความที่เคยทำไปแล้วให้ข้ามไปได้เลยครับ
สิ่งที่ต้องทำก่อนติดตั้ง Laravel
- ติดตั้ง Amazon Linux 2023 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
- ตั้งค่า Time Zone ใน Amazon Linux 2 ของ EC2
- Restart EC2 Instance (Amazon Linux 2023)
- เรียกใช้ PHP โดยใช้ Nginx บน EC2 (Amazon Linux 2023)
- ติดตั้ง MariaDB และสร้าง Database ใน Amazon Linux 2023
- ติดตั้ง Composer ใน EC2
- ติดตั้ง MySQL Improved Extension
ติดตั้ง 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
GiBgp2
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 ~/
Output
[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 ได้ครับ
Output
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| laravel |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.000 sec)
MariaDB [(none)]>
แล้วรันคำสั่งออกจาก Prompt ของ MySQL และทำขั้นตอนถัดไปได้เลยครับ
quit
Output
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
Output
[root@ip-xx-xx-xx-xx ~]# cd /var/www
[root@ip-xx-xx-xx-xx www]#
แล้วรันคำสั่งติดตั้ง Laravel ลงในโฟลเดอร์ html
(html = example-app) แล้วพิมพ์ yes
- "html" นี้คือชื่อโฟลเดอร์ที่จะถูกสร้างหลังจากรันคำสั่งนี้ไปและโปรเจกต์ Laravel จะถูกบันทึกลงในนี้อัตโนมัติ เช่นจาก /var/www ก็จะเป็น /var/www/html)
- หากไม่กำหนดเวอร์ชัน
^10.0
ก็จะได้เป็น Laravel เวอร์ชันล่าสุดที่มีให้)
composer create-project laravel/laravel:^10.0 example-app
แล้วรันคำสั่งเปลี่ยนแปลงสิทธิ์การเข้าถึงให้กับโฟลเดอร์ html
chmod -R 777 /var/www/html
เนื่องจากตอนนี้กำลังอยู่ใน path /var/www/
ก็ให้รันคำสั่งเข้ามาที่ path html
cd html
Output
[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
ของด้านล่างนี้เลยครับ
Output
"...ไม่ได้แสดง 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 เพื่อบันทึก
Output
"...ไม่ได้แสดง 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
Output
[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) ครับ !
บทความที่เกี่ยวข้อง
- วิธีติดตั้ง Amazon Linux 2023 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
- วิธีตั้งค่า Time Zone ใน Amazon Linux 2 ของ EC2
- เรียกใช้ PHP 8.2 โดยใช้ Nginx ใน EC2 (Amazon Linux 2023) บน AWS
- [เกร็ดความรู้] การติดตั้ง MySQL Server บน Amazon Linux 2023
- การติดตั้ง Composer ใน EC2 (Amazon Linux 2, Amazon Linux 2023)
- มาทำความรู้จัก Laravel กัน