ตัวอย่างไฟล์ Laravel 5 + nginx + phpfpm บน k8s

DevOps Nov 27, 2018

*บทความยาวเน้อออ...

บทความนี้ผมจะมาแชร์ประสบการณ์ในการทำ CI/CD สำหรับเว็บไซต์ PHP Application จากที่ได้ลองทำมาหลาย Stack แล้ว ผมคิดว่า Stack ที่ผมทำปัจจุบันน่าจะ OK ที่สุดละ (เข้าข้างตัวเอง)

โดยจะขอยกตัวอย่างสำหรับ Laravel 5 ทำหน้าเว็บไซต์ ซึ่งถ้าเป็น php framework อื่นก็น่าจะแนวๆ เดียวกันได้

PHP on K8S Diagram

สังเกตุจาก diagram ด้านบนทำให้เราสามารถแยก scale เฉพาะ nignx หรือ phpfpm ได้เลย โดยผมได้ทำ code ตัวอย่างไว้ให้แล้วตามนี้

https://gitlab.com/twin-opensource/laravel-nginx-phpfpm-k8s

สามารถ clone มาลองดูได้

หลังจาก clone มาแล้วผมจะทำการอธิบายเพิ่มสำหรับไฟล์ข้างในว่าส่วนไหนไว้ทำอะไร แต่ผมจะยังไม่ลงลึกถึงการเขียนไฟล์ .gitlab-ci.yml นะ ไว้คราวหลังจะมาอธิบายแยกอีกครั้ง


โครงสร้าง Project

.
├── config/
├── Dockerfile-nginx
├── Dockerfile-php
├── .git
├── .gitignore
├── .gitlab-ci.yml
├── k8s/
├── laravel/
└── README.md
  • config/ โฟลเดอร์นี้ไว้เก็บ config ไฟล์ของ nginx และ php
  • k8s/ โฟลเดอร์นี้ไว้เก็บไฟล์ deployment และ service ของ k8s
  • laravel/ โพลเดอร์นี้ไว้เก็บ app ของเรา ด้านในจะเป็น code ของ laravel
  • dockerfile-nginx และ dockerfile-php จะเป็นการทำ docker image
  • .gitlab-ci.yml ไว้เขียน CI/CD บน gitlab

โฟลเดอร์ k8s/

k8s/
├── deploy.yml
└── svc.yml

ในนี้ผมจะเก็บไฟล์ yml ของ k8s ไว้โดยจะมีสองไฟล์คือ deploy.yml และ svc.yml

โฟลเดอร์ config/

config/
├── nginx/
│   └── default.conf
└── php/
    └── php.ini

ในนี้ผมจะแยกไฟล์ config ไว้ของ nginx และ php โดยจุดสังเกตุที่จะให้ดูก็คือในส่วนของ nginx/default.conf เพราะผมได้ทำการเขียนแบบ upstream เอาไว้โดยให้วิ่งไปหา nginx service ของ k8s ดังโค็ดด้านล่าง

upstream phpfpm { 
    server svc-laravel-nginx-phpfpm-k8s-php:9000; 
}
server {

    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    server_name _;

...

location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass phpfpm;

...

สังเกตุ fastcgi_pass phpfpm; จะชื่อตรงกับ upstream phpfpm แล้วค่าใน upstream จะเป็นชื่อของ service php ตามด้วย port 9000

ไฟล์ .gitlab-ci.yml

เป็นไฟล์ที่เอาไว้เขียน ci/cd บน gitlab ซึ่งถ้าเรา push ขึ้น gitlab เมื่อไรมันจะทำการอ่านไฟล์นี้เสมอ

Gitlab Pipeline

อย่างที่ได้กล่าวไว้แล้ว ผมจะไม่อธิบายโค็ดในไฟล์นี้เพราะมันเยอะ ไว้ค่อยทำบทความแยกออกมาอีก แต่จะให้ดูไฟล์รูปด้านบน ผมได้ทำการเขียนไว้มี 2 stages สำหรับ project นี้คือ

  • Build ไว้สำหรับทำการติดตั้ง component ของพวก composer และ npm จากนั้นทำ caching folder พวก vendor/ และ node_modules/ ไว้
  • Release ไว้สำหรับสร้าง Docker image แยกเลยสำหรับ nginx และ php โดยแต่ละ Job จะทำการโหลด caching folder ที่ผมทำการแยกไว้ Build stage มาด้วย

จริงๆ ต้องมี Deploy stage ด้วยแต่เอาไว้ก่อน ตอนนี้เรามา deploy เองด้วยมือกัน

วิธีใช้งาน

สร้าง deployment และ service

⚡ kubectl create -f k8s/

ทดสอบเรียกหน้าเว็บ

⚡ kubectl port-forward svc/svc-laravel-nginx-phpfpm-k8s-nginx 8080:80

จากนั้นเข้า http://localhost:8080 จะเจอหน้า laravel พื้นฐาน

Arnon Kijlerdphon

IT manager & DevOps @Twin Synergy Co.,Ltd

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.