[Update] การตั้งค่าที่จำเป็นเพื่อ Deploy Laravel ใน Elastic Beanstalk
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
การ Deploy Laravel ใน Elastic Beanstalk อาจเกิน Error ในขณะที่เราใช้งานโปรเจกต์ Laravel ที่รันบน Elastic Beanstalk ดังนั้นแนะนำให้ตั้งค่าดังต่อไปนี้
เตรียมสภาพแวดล้อมสำหรับสร้างไฟล์ ZIP
-
ติดตั้ง Extention Remote – SSH ใน VSCode และทดลองใช้งาน EC2 โดยตรงใน VSCode แล้ว
-
ติดตั้ง Laravel บน EC2 (Amazon Linux 2023) แล้ว
เพิ่มการตั้งค่าของ NGINX
เปิดโปรเจกต์ Laravel ใน Visual Studio Code ตาม Path นี้
/var/www/html/
สร้างโฟลเดอร์และไฟล์ตาม Path ".platform/nginx/conf.d/elasticbeanstalk/laravel.conf" แล้ว NGINX จะเริ่มต้นระบบหลังจากมีไฟล์สำหรับการตั้งค่า NGINX ในขณะที่ Deploy ซึ่งในส่วนนี้เป็นการตั้งค่าสำหรับ Laravel โดยเฉพาะ ดังนั้นให้ดำเนินการตั้งค่าดังต่อไปนี้
สร้าง: ".platform/nginx/conf.d/elasticbeanstalk/laravel.conf
" และคัดลอก Code ด้านล่างนี้วางในไฟล์ laravel.conf
location / {
try_files $uri $uri/ /index.php?$query_string;
}
เกี่ยวกับ laravel.log
ถ้าไม่มี storage/logs/ ในไฟล์ zip ที่จะทำการ Deploy ตอนที่สร้าง log ก็จะเกิด Error และถ้าไม่ได้รับการอนุญาตให้เขียนข้อมูลก็จะเกิด Error เช่นกัน ในทางกลับกันถ้า laravel.log มีข้อมูลเหลืออยู่ก่อนที่จะทำการ Deploy ก็จะเป็นสาเหตุทำให้ Error ได้เหมือนกัน ดังนั้นควรเคลียร์ข้อมูลออกให้หมดก่อน ซึ่งหมายความว่าก่อนที่จะสร้างไฟล์ zip ให้ทำการรันคำสั่งดังต่อไปนี้ก่อนครับ
เมื่อรันคำสั่งนี้แล้ว laravel.log จะมีขนาดไฟล์เป็น 0 พูดง่ายๆคือเป็นการเคลียร์ข้อมูลใน laravel.log นั่นเอง นอกจากนี้ไม่ว่าจะเป็น User แบบไหนก็สามารถดำเนินการคำสั่งนี้ได้ครับ
\cp -f /dev/null storage/logs/laravel.log
chmod 666 storage/logs/laravel.log
ล้างแคชต่างๆ ของ laravel
รันคำสั่งล้างแคชต่างๆ เตรียมไว้
php artisan optimize:clear
ไฟล์ที่รวมอยู่ในไฟล์ ZIP และไม่รวมอยู่ในไฟล์ ZIP
โดยปกติแล้วไฟล์ในโปรเจกต์ laravel ควรจะรวมไว้ในไฟล์ ZIP ทั้งหมด แล้วก็จะมี [Folder
] และ [File
] ที่จะไม่ทำการรวมอยู่ในไฟล์ ZIP ด้วย
Folder
ที่ยกเว้นมีดังนี้
.git
vendor
node_modules
public/build
public/hot
public/storage
storage/framework/sessions
storage/framework/views
File
ที่ยกเว้นมีดังนี้
storage/*.key
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.idea
.vscode
.env
*.zip
ในกรณีที่สร้างไฟล์ด้วยคำสั่ง ZIP ไฟล์ Dot (.
จะเป็นชื่อไฟล์เริ่มต้น) เนื่องจากว่าได้รับการยกเว้น ดังนั้นจำเป็นต้องเพิ่มอย่างระมัดระวัง
รันคำสั่งสร้างไฟล์ ZIP
รันคำสั่งด้านล่างนี้เพื่อสร้างไฟล์ zip ตามสิ่งที่เขียนไว้ข้างต้นนี้ (*เปลี่ยน "[deploy_file_name.zip]" ให้เป็นชื่อไฟล์ของคุณ เช่น "laravel10-sample.zip" เป็นต้น)
zip -r
: คำสั่งสร้างไฟล์ zip-x
: คำสั่งยกเว้นโฟลเดอร์หรือไฟล์เพื่อไม่ให้รวมใน zip
zip -r [deploy_file_name.zip] * .editorconfig .styleci.yml .ebextensions .platform -x \*/.git/\* vendor/\* node_modules/\* public/build/\* public/hot/\* public/storage/\* storage/\*.key storage/framework/sessions/\* storage/framework/views/\* Homestead.json Homestead.yaml npm-debug.log yarn-error.log .idea .vscode .env \*.zip
แล้ว Download ไฟล์ ZIP เพื่อเตรียม Deploy แต่ก่อนที่จะ Deploy ให้ตรวจสอบเนื้อหาในโปรเจกต์ก่อน เมื่อเปิดไฟล์มาแล้วจะแสดงหน้าจอแบบนี้
การตั้งค่าอื่นๆ ที่แนะนำ
การตั้งค่าอื่นๆ ที่แนะนำตามลิงก์ด้านล่างนี้เป็นวิธีการตั้งค่า Elastic Beanstalk environment ในขณะที่ Deploy โดยจะทำหรือไม่ทำก็ได้ แต่ทางเราขอแนะนำให้ลองทำดูครับ เนื่องจากอำนวยความสะดวกในการตั้งค่าสำหรับการเพิ่มประสิทธิภาพ Memory และการเปรียบเทียบข้อมูลเกี่ยวกับเวลาตาม Timezone ที่เราใช้งานในสภาพแวดล้อมของเรา
Deploy โปรเจกต์ Laravel ใน Elastic Beanstalk
เมื่อเตรียมไฟล์ ZIP เสร็จแล้ว ทำการ Deploy โปรเจกต์ Laravel โดยดูตัวอย่างด้านล่างนี้ได้เลย
ข้อควรระวัง: เราต้องทำการเปลี่ยน "APP_DEBUG" ให้เป็น
false
เพราะว่าถ้าเผยแพร่เป็น "APP_DEBUG = true" ก็จะทำให้เป็น Security Hole ซึ่งจะทำให้เว็บไซต์เกิดช่องโหว่และไม่ปลอดภัยนั่นเอง ดังนั้นเราควรใส่เป็น [APP_DEBUG = false
] ครับ
เพียงเท่านี้การตั้งค่าที่จำเป็นในการ Deploy Laravel ด้วย Elastic Beanstalk ก็เสร็จเรียบร้อยแล้วครับ
สรุป
การตั้งค่านี้มีความจำเป็นอย่างมาก เพราะถ้า Deploy ไปยัง Elastic Beanstalk โดยที่ไม่ได้ทำการตั้งค่าเหล่านี้ อาจทำให้โปรเจกต์มีปัญหาหรือเกิด Error ในขณะรันโปรเจกต์บน Elastic Beanstalk ได้นั่นเอง หากเราป้องกันไม่ให้เกิด Error เกี่ยวกับ Permission ได้ก็จะทำให้งานราบรื่นครับ
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !