วันอาทิตย์ที่ 27 พฤศจิกายน พ.ศ. 2559

Docker #2 Laravel 5.3 on LEMP stack

Laravel 5.3 on LEMP stack

วันนี้เราจะมาทดลองติดตั้ง Laravel 5.3 บน LEMP stack บน Docker

ให้ติดตั้ง PHP7 และ Composer ก่อนใน windows ให้เรียบร้อยก่อน จากนั้นให้สร้าง Laravel project ตั้งชื่อว่า blog  โดยใช้คำสั่ง

d:\docker\www> composer create-project --prefer-dist laravel/laravel blog

สร้าง blog project ใน folder ที่เป็น root directory ของ nginx (ใน production server ควรจะ map root directory ไว้ใน folder www\blog\public ซึ่งจะกำหนดของ nginx เป็น

    ...
    root /usr/share/nginx/html/blog/public;  
    server_name localhost;

    location / {              
try_files $uri $uri/ /index.php$is_args$args;          
    }
    ....

แต่ผมขอ Map ไว้ที่ \www เพื่อจะได้ทดสอบ php script อื่น ๆ หรือว่า สร้าง Laravel project อื่น ๆ ได้ ใน web server ตัวเดียวกัน)

รอจน composer download ไฟล์ต่าง ๆ ที่เกี่ยวข้องเรียบร้อย ก็จะได้ blog project มา
แก้ไข nginx configure จากตอนที่แล้วเป็นดังนี้

จะสังเกตสิ่งที่เพิ่มขึ้นคือ
ใน try_files $uri จะมีการเอา uri ที่ได้ไปค้นหาใน /usr/share/nginx/html ว่าเจอหรือไม่ ถ้าไม่เจอ ก็ไปเปรียบเทียบกับ $uri/ หมายถึง folder ถ้าไม่เจอ ให้เปลี่ยนใหม่เป็น /blog/public/index.php?$is_args$args  (กว่าผมจะทราบว่าต้องใส่ "/blog/public/" ไว้ข้างหน้า เพื่ออ้างอิง folder เล่นเอาหมดเวลาไปหลายชั่วโมง แต่ก็แลกกับเข้าใจ debug mode ของ nginx และ การทำงานของ docker มากขึ้น )

เมื่อ rewrite URL ใหม่ เป็น index.php แล้ว nginx ก็จะโยน URL ที่ได้ไปให้ทำใน location ~ \.php$   อีกที  (.php$ หมายถึง URL อะไรก็ได้ที่ลงท้ายด้วย .php) เมื่อมาทำงานใน block นี้ ก็ตรวจสอบอีกครั้งว่าเจอไฟล์ index.php หรือไม่ ถ้าไม่เจอ ก็ใส่ 404 Not Found ไปให้ แต่ถ้าเจอก็ทำงานต่อ fastcgi_* ทั้งหมด กำหนด container ที่จะประมวล PHP ที่เชื่อมต่อกันผ่านทาง port 9000, ตัดแบ่ง path ได้ถูกต้องหรือไม่ และ กำหนดไฟล์ index และ ตำแหน่งของไฟล์ที่จะถูกเรียกมาทำงาน

หาก container run  ค้างอยู่ใช้คำสั่ง  docker rm -f  $(docker ps -aq) เพื่อลบหยุดการทำงานและลบ container ออก จากนั้นสั่ง start container ที่เกี่ยวข้องทั้งหมด 4 ตัว (จากตอนที่แล้ว) ตอนที่เรียกใช้คำสั่งให้อยู่ที่ root folder ที่เรา map มาตอนที่ share folder นะ (d:\docker)

docker run --name mysql -v $(pwd)/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7.4

docker run --name phpfpm --link mysql:5.7.4 -v $(pwd)/www:/usr/share/nginx/html -d php:7-fpm

docker run --name nginx --link phpfpm:7-fpm -v $(pwd)/www:/usr/share/nginx/html -v $(pwd)/conf.d:/etc/nginx/conf.d -p 80:80 -d nginx:1.11

docker run --name myadmin -e PMA_HOST=mysql -d --link mysql -p 8080:80 phpmyadmin/phpmyadmin:4.6.4-1 -e MYSQL_ROOT_PASSWORD=password

หากไม่มีขั้นตอนใดผิดพลาดก็สามารถเรียก URL ได้เป็น
http://192.168.99.100/blog/public/index.php
หรือ
http://192.168.99.100/index.php



สามารถดู access log ของ nginx container ได้จาก docker logs nginx

เนื่องจาก error log ของ nginx container จะถูก redirect ไปที่ /dev/stderr หากต้องการ debug error ลงไฟล์สามารถ กำหนดใน /conf.d/default.conf ได้ โดยการเพิ่ม

error_log /var/logs/localhost.error.log debug;

อย่าลืม เพิ่ม -v เพื่อ map error log เข้าไปใหม่ แล้ว สั่ง docker restart nginx ให้ refresh configuration ใหม่อีกครั้ง

ก่อนจบ ขอฝาก nginx configuration ที่ควรอ่านไว้ด้วยครับ

ไม่มีความคิดเห็น: