วันนี้เราจะมาทดลองติดตั้ง 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 จากตอนที่แล้วเป็นดังนี้
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
server { | |
listen 80; | |
sendfile off; | |
index index.php index.html; | |
root /usr/share/nginx/html; | |
server_name localhost; | |
location / { | |
try_files $uri $uri/ /blog/public/index.php$is_args$args; | |
} | |
location ~ \.php$ { | |
try_files $uri /blog/public/index.php =404; | |
fastcgi_pass phpfpm:9000; | |
fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
fastcgi_index index.php; | |
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; | |
include fastcgi_params; | |
} | |
} |
ใน 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 ที่ควรอ่านไว้ด้วยครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น