Published on

ลองสร้าง project php หลายตัวใส่ใน nginx ใน docker

ลองสร้าง project php หลายตัวใส่ใน nginx ใน docker
ลองสร้าง project php หลายตัวใส่ใน nginx ใน docker

สวัสดีคุณผู้อ่านทุกท่านเน้อครับ บทความวันนี้จะเป็นบทความเกี่ยวกับการสร้าง Project php หลาย ๆ ตัวใส่ใน nginx ใน Docker วิธีการทำจะต้องทำอย่างไร มาเริ่มกันเลยดีกว่าครับ

มาเริ่มกันเลย

เจมส์จะสร้างเป็น Project เปล่า ๆ ขึ้นมาก่อนเลยเน้อครับ โดย Project นี้เจมส์จะตั้งชื่อว่า learning-to-create-multiple-php-project-in-nginx

mkdir learning-to-create-multiple-php-project-in-nginx
cd ./learning-to-create-multiple-php-project-in-nginx

ตอนนี้เราอยู่ใน directory learning-to-create-multiple-php-project-in-nginx แล้วเน้อครับ

ให้เราสร้าง directory ชื่อ project1 ขึ้นมาครับ

mkdir project1

จากนั้นให้เข้าไปใน project1 แล้วสร้าง Dockerfile ขึ้นมาครับ

cd ./project1
touch Dockerfile

โดยให้ใส่โค้ดใน Dockerfile ดังนี้ครับ

project1/Dockerfile
FROM php:8.0.2-fpm

WORKDIR /var/www/project1

และสร้างไฟล์ index.php ขึ้นมา

touch index.php

โดยเราจะให้แสดงผลว่า Project 1

project1/index.php
<?php echo "Project 1"; ?>

ในส่วน Project 2 จะทำเหมือน Project 1 เลยครับ

เพียงแต่เราจะให้แสดงผลเป็น Project 2 แทน ซึ่งเราจะใช้คำสั่ง copy project1 เป็น project2 แล้วก็แก้ไขไฟล์ index.php ของ Project2

cp -r ../project1 ../project2

จากนั้นให้ย้อนไปอยู่ที่ root directory แล้วก็แก้ไขไฟล์ index.php ใน project2

cd ..

แก้ให้ index.php ใน project2 แสดงผลเป็น Project 2

project2/index.php
<?php echo "Project 2"; ?>

และแก้ Dockerfile ใน project2 ให้เป็นแบบนี้ครับ

project2/Dockerfile
FROM php:8.0.2-fpm

WORKDIR /var/www/project2

จากนั้นให้เราสร้าง directory ชื่อ nginx-config ที่ root project ครับ

mkdir nginx-config

แล้วก็เข้าไปใน directory nginx-config

cd ./nginx-config

จากนั้นให้สร้างไฟล์ชื่อ nginx.conf ขึ้นมาครับ แล้วใส่โค้ดลงไปดังนี้ครับ

nginx-config/nginx.conf
server {
    listen 80;
    server_name project1;
    index index.php;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    error_page 404 /index.php;
    root /var/www/project1;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass project1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

server {
    listen 81;
    server_name project2;
    index index.php;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    error_page 404 /index.php;
    root /var/www/project2;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass project2:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

จากนั้นให้เราย้อนกลับไปที่ root project อีกครั้ง

cd ..

ให้เราสร้างไฟล์ docker-compose.yaml ขึ้นมาครับ

touch docker-compose.yaml

จากนั้นให้ใส่คำสั่งดังโค้ดด้านล่างลงไปครับ

docker-compose.yaml
version: '3'
services:
  project1:
    build:
      context: ./project1
      dockerfile: Dockerfile
    container_name: project1-container
    restart: always
    working_dir: /var/www/project1
    volumes:
      - ./project1:/var/www/project1

  project2:
    build:
      context: ./project2
      dockerfile: Dockerfile
    container_name: project2-container
    restart: always
    working_dir: /var/www/project2
    volumes:
      - ./project2:/var/www/project2

  nginx:
    image: nginx:1.19-alpine
    container_name: nginx-container
    restart: always
    ports:
      - 8081:80
      - 8082:81
    volumes:
      - ./nginx-config:/etc/nginx/conf.d
      - ./project1:/var/www/project1
      - ./project2:/var/www/project2

เมื่อลอง Run คำสั่ง docker-compose up

เมื่อลองเข้า http://localhost:8081 จะพบว่าแสดงข้อความ Project 1 ขึ้นมา

เมื่อลองเข้า http://localhost:8082 จะพบว่าแสดงข้อความ Project 2 ขึ้นมา

การที่มันทราบว่า 8081 เป็น project1 และ 8082 เป็น project2 เนื่องจากไฟล์ nginx.conf ที่เราตั้งค่า ว่าในไฟล์นั้นเรา config ไว้ 2 port คือ 80 และ 81 โดยเมื่อเราเข้า 8081 มันจะไปที่ port 80 โดยดูจากไฟล์ docker-compose.yaml ซึ่ง port 80 เราตั้ง root project จะไปที่ /var/www/project1 (ใน nginx.conf) โดยจะตรงกับ /var/www/project1 ที่เรา mount อยู่เรียบร้อยแล้วในไฟล์ docker-compose.yaml ใน project1

ข้อควรระวัง ลองสังเกตใน nginx.conf ตรง fastcgi_pass project1:9000; ในส่วนที่เป็น project1 ตรงนี้ต้องตรงกับชื่อ service ใน docker-compose.yaml ด้วย ไม่งั้นเมื่อเข้า http://localhost:8081 จะแสดงข้อความว่า file not found

เรียบร้อยแล้วครับ หากบทความนี้มีส่วนไหนผิดพลาดประการใดก็ขออภัยมา ณ ที่นี้ด้วยครับ หรือหามีส่วนไหนเพิ่มเติมก็สามารถพิมพ์ คอมเม้นท์ทิ้งไว้ได้นะครับ

Github: https://github.com/jame3032002/learning-to-create-multiple-php-project-in-nginx

Reference