วันนี้เราจะมาทดลองติดตั้ง 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 ที่ควรอ่านไว้ด้วยครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น