Wednesday, September 18, 2024

ย้าย wordpress site sub ด้านหลัง https domain name เข้ามาใน container >> https://www.site.com/th/

  • หัดทำ wordpress ใน docker container
  • โดยไม่ใช้ image ของ wordpress
  • แต่ใช้ php7.4+apache และ mysql image ใช้ 2 container
  • คือจะเอา wordpress site ซึ่ง อยู่ใน physical server พาธจริง LAMP (PHP7.4) Ubuntu ย้ายเข้าไปใน container
  • โดยจะใช้ apache reverse proxy https domain จริง เข้ามาใน localhost:port ที่กำหนดใน container 
  • เพื่อลดความเสื่ยงและจำกัดความเสียหายให้น้อยที่สุด ต่อภาพรวม เมื่อโดนเล่นงาน

Env

  • Ubuntu 18.04
  • Host จริง enable mod_rewrite

Step

  • ติดตั้ง docker ให้เรียบร้อย
  • คอนฟิก apache host https จริง ให้ /etc/apache2/sites-available/www.site.com-le-ssl.conf

<IfModule mod_ssl.c>

<VirtualHost *:443>

ServerAdmin admin@site.com

ServerName www.site.com

...

ProxyPreserveHost on

ProxyPass / http://localhost:8080/

ProxyReverse / http://localhost:8080/

RequestHeader set X-Forwarded-Proto "https"


Include /etc/.../ssl-apache.conf

SSLCertificateFile...

SSLCertificateKeyFile...

...

</VirtualHost>

</IfModule>

  • คอนฟิก apache host http จริง ให้ /etc/apache2/sites-available/www.site.com.conf

<VirtualHost *:80>

ServerAdmin admin@site.com

ServerName www.site.com

...

ProxyPreserveHost on

ProxyPass / http://localhost:8080/

ProxyReverse / http://localhost:8080/

RequestHeader set X-Forwarded-Proto "https"

</VirtualHost>

  • จากนั้น enable site ทั้ง 2

$ sudo a2ensite www.site.com.conf

$ sudo a2ensite www.site.com.le-ssl.conf

$ systemctl restart apache2

  • ที่นี้มาสร้าง container กัน

$ mkdir -p /home/myuser/public_html/mysql_data

$ mkdir -p /home/myuser/public_htmlapp

$ cd app

  •  ให้เราเอา wordpress site folder มาวางใน app ได้เลย

$ cp -rf th /home/myuser/public_html/app/th

$ cd /home/myuser/public_html

 

          $ nano php.ini

; Set the maximum upload file size

upload_max_filesize = 64M

; Set the maximum POST size

post_max_size = 64M

          memory_limit = 512M          

 

$ nano Dockerfile

# load image php:<version>-apache

FROM php:7.4-apache

# Install PHP extensions

RUN docker-php-ext-install pdo pdo_mysql mysqli

# Use the official PHP-Apache image from Docker Hub

#FROM php:8.1-apache

# Install dependencies if needed

#RUN apt-get update && apt-get install -y \

#    libpng-dev \

#    libjpeg-dev \

#    libfreetype6-dev \

#    && docker-php-ext-configure gd --with-freetype --with-jpeg \

#    && docker-php-ext-install gd

  • สร้างไฟล์ docker-compose.yml

$ cd /home/myuser/public_html

$ nano docker-compose.yml

version: '3.3'

services:

  apache:

    build: .

    # image: webdevops/php-apache:8.2

    container_name: apache

    ports:

      - "8080:80"

              command: bash -c "a2enmod rewrite && apache2-foreground"

              restart: always 

    volumes:

      - ./app:/var/www/html

                - ./php.ini:/usr/local/etc/php/php.ini

    # depends_on:

    #   - mysql

    networks:

      - lamp-network


  mysql:

    image: mysql:latest

    container_name: mysql

    environment:

      MYSQL_ROOT_PASSWORD: rootpassword

      MYSQL_DATABASE: wordpress_site

      MYSQL_USER: wordpress

      MYSQL_PASSWORD: wordpresspassword

    #ports:

    #  - "3306:3306"

    volumes:

      - ./mysql_data:/var/lib/mysql

    networks:

      - lamp-network


 ## optional สำหรับเพิ่มตัวจัดการ database

 phpmyadmin:

    image: phpmyadmin/phpmyadmin:latest

    container_name: phpmyadmin

    environment:

      PMA_HOST: db

      MYSQL_ROOT_PASSWORD: rootpassword

    ports:

      - "8081:80"

    # depends_on:

    #   - mysql

    networks:

      - lamp-network


networks:

  lamp-network:

    driver: bridge


  • จากนั้นสั่ง สร้าง container ด้วยคำสั่ง

$ docker-compose up -d

  • สร้างเสร็จตรวจสอบ จะได้ container 2 อัน

$ docker ps 

  • จากนั้นให้เราใช้นำเข้า file.sql ที่เรา dump ออกมาจากระบบเดิม นำเข้า wordpress_site ใน container ด้วยคำสั่ง

$ docker exec -i <container_id|name> mysql -u<username> -p<password> <database_name> < /path/file.sql

  • หรืออีกวิธีคือคัดลอกไฟล์จาก host เข้าไปใน child ก่อนโดย

$ docker cp /path/file.sql <container_id|name>:/tmp/file.sql

$ docker exec -it <container_id|name> bash

container$ cd /tmp

container$ mysql -u <username> -p <database_name> < file.sql

  • คอนฟิก wordpress นิดหน่อย wp-config.php (ถ้ายังไม่มีก็ cp จาก sample ได้เลย)
  • ตั้งค่า db host เป็น mysql (ชื่อ server db ของ container mysql เรา ซึ่งเราใช้ชื่อ  service แบบใหนก็ได้ตามใจชอบโดยไม่ต้องเป็น mysql ก็ได้)
  • ตั้งค่า db name, user, pass ตามที่ตั้งค่าเริ่มต้นใน compose file นั่นแหละ
  • จากนั้นเพิ่มคอนฟิกแบบนี้ ก่อน คำสั่งสุดท้าย

...

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {

    $_SERVER['HTTPS'] = 'on';

}

...

/** Sets up WordPress vars and included files. */

require_once(ABSPATH . 'wp-settings.php');

  • table wp_options  column siteurl, home ก็ใช้ค่าเดิม https://www.mysite.com/th ใช้แบบ url ตาม domain หลักก่อน reverse เข้ามาเหมือนเดิม นั่นแหละ

  • stop และ remove container โดย

$ docker-compose down

  • หรือกรณีเราแก้ไข docker-compose จะให้ใช้ คอนฟิกใหม่ก็สั่ง (ทั่วไปใช้แบบนี้ กรณีแก้ไข docker-compose.yml ใช้ -d ก็พอ เร็วดี)

$ docker-compose up -d

  •  หรือเพิ่ม --build แต่จะใช้เวลานาน (ในกรณีที่มีการแก้ไข Dockerfile ควรใช้ --build ใหม่)

$ docker-compose up --build

  • กรณีเราไม่ใส่ networks ให้ service แต่ละตัวก็ได้ มันจะสร้าง network default interface ให้อัตโนมัติเอง ใช้ depends_on แทนได้เช่นกันเอาไว้ผูก service
  • https reverse proxy wordpress ทำไมมันทำเยอะจังกว่าจะรันได้ปกติ เหลือ เรื่อง permission folder upload อีก ปรับให้ถูกต้องด้วย
  • สังเกต restart: always เราใส่ไว้เผื่อเราเข้าไป อัพเดทคอนฟิก 
  • $ docker exec -it apache bash 
  • container$ a2enmod rewrite && service apache2 restart
  • แล้ว ทำให้ container หยุดทำงาน ถ้าเราไม่ใส่ค่านี้ เราต้องสั่ง $ docker start apache เสมอ
  • สุดท้ายเรื่อง permission ใน wp-content/uploads เราจะสามารถจัดการ permission ได้จาก parent host หรือ child. ก็ได้ permission มันเปลี่ยนตามได้หมดเลยแฮะ
Related

  • https://juuier.blogspot.com/2024/09/reverse-proxy-direct-apache-ubuntu-2204.html
  • https://juuier.blogspot.com/2023/05/reverse-proxy-to-multi-endpoint-nginx.html

Ref

  • https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04

No comments:

Post a Comment