GNU/Linux >> Belajar Linux >  >> Linux

Cara Menghosting Sendiri Beberapa Situs WordPress di Server yang Sama Dengan Docker

Menginstal WordPress bukanlah masalah besar. Anda dapat menginstalnya menggunakan server LAMP untuk pengembangan lokal. Anda juga dapat menerapkannya untuk dunia nyata pada server Linux yang menghadap publik yang tepat.

Server cloud seperti Linode, DigitalOcean dll juga menyediakan opsi untuk menggunakan server Linux baru yang telah dikonfigurasi dengan WordPress. Lebih mudah lagi, kan?

Tetapi bagaimana jika Anda ingin menginstal lebih dari satu WordPress di satu server?

Cara mudah adalah dengan menggunakan layanan seperti ServerPilot. Tidak hanya memperbarui server Anda secara otomatis, ini juga memungkinkan Anda dengan mudah menerapkan beberapa instance WordPress di server yang sama.

Itu akan menghabiskan lebih banyak uang dan jika Anda tidak menginginkannya, Anda dapat menggunakan Docker untuk menerapkan beberapa instance WordPress.

Melalui panduan ini, Anda akan mempelajari cara mudah menyiapkan penyiapan WordPress ganda yang berjalan dari wadah masing-masing dan menambahkan lebih banyak instance!

Prasyarat

Ini tidak wajib, tetapi tutorialnya akan lebih mudah Anda ikuti jika Anda memiliki:

  • Pengetahuan tentang perintah dasar Linux
  • Beberapa pengetahuan tentang Docker
  • Memahami Docker Compose

Anda akan menerapkan WordPress di balik wadah proxy terbalik, dengan domain dan subdomain berkemampuan SSL.

Terlepas dari pengetahuan topikal yang disebutkan di atas, Anda memerlukan persyaratan infrastruktur berikut:

  • Sebuah Server Ubuntu Linux yang menghadap publik . Anda dapat menggunakan penyedia layanan cloud seperti Linode. Server Nano dengan RAM 1 GB akan cukup untuk penerapan ini. Namun jika Anda berencana untuk menghosting sendiri lebih banyak instance WordPress, pertimbangkan untuk memutakhirkannya.
  • Akses ke domain/subdomain Anda dan setelan DNS-nya
  • Docker dan Docker Compose terinstal di server Linux Anda.

Jika Anda membutuhkan bantuan, Anda dapat mengikuti panduan kami di:

  • Menginstal Docker di Ubuntu
  • Menginstal penulisan Docker di Ubuntu
  • Pembalikan penyiapan buruh pelabuhan proxy

Di semua tutorial kami yang lain berdasarkan aplikasi web hosting mandiri dengan Docker, saya telah membahas penerapan wadah Nginx dan wadah Aplikasi Web secara terpisah. Namun kali ini, saya akan menggunakan Docker Compose untuk menyiapkan beberapa wadah WordPress, semuanya berdasarkan pada satu file yml.

Jadi ini juga merupakan contoh untuk menunjukkan kepada Anda bagaimana Anda dapat mengintegrasikan konfigurasi Nginx dengan Aplikasi Web yang Anda pertimbangkan untuk diterapkan, melalui satu file Docker Compose.

Saya akan menggunakan domain.com sebagai contoh untuk blog WordPress pertama dan wordpress.domain.com sebagai blog self-host kedua. Pada akhirnya, saya juga akan menjelaskan cara menambahkan lebih banyak instance WordPress berdasarkan konfigurasi yang akan saya bahas di sini.

Buat direktori dan aktifkan. Sebut saja multi-wordpress .

mkdir multi-wordpress

Dan kemudian beralih ke direktori yang baru dibuat ini menggunakan perintah cd:

cd multi-wordpress

Tetapkan batas upload file WordPress ke 512 MB

Di dalam direktori ini, kami akan menyimpan uploads.ini file yang memiliki konfigurasi unggah yang diperlukan untuk mengunggah file berukuran hingga 512 MB. Masukkan perintah berikut di terminal:

[email protected]:~/multi-wordpress$ printf "file_uploads = On\nmemory_limit = 512M\nupload_max_filesize = 512M\npost_max_size = 512M\nmax_execution_time = 600" > uploads.ini

Tetapkan batas upload file untuk Nginx

Sebagai tindakan tambahan, buat juga file bernama client_max_upload_size.conf dan simpan di direktori yang sama untuk dipasang ke wadah Nginx. Demi itu, saya menetapkannya sebagai 1 GB. Ini berguna untuk mengonfigurasi aplikasi lain di masa mendatang.

[email protected]:~/multi-wordpress$ printf "client_max_body_size 1G;" > client_max_upload_size.conf

Pengalihan WWW melalui Nginx (Memperbarui CNAME tidak diperlukan)

Jika Anda ingin menggunakan pengalihan non-www ke www dengan WordPress, Anda dapat mengatur pengalihan dengan perintah cat di server Linux Anda:

[email protected]:~/multi-wordpress$ cat >> domain.com
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;

Tekan enter lalu Ctrl+D untuk menyimpannya. Kami tidak menggunakan printf di sini karena $1 tidak akan disimpan dalam file seperti yang ditunjukkan di atas. Ini dapat menyebabkan masalah di masa mendatang dengan URL, karena kami ingin pengalihan berfungsi di semua kasus. Misalnya, domain.com/test harus selalu mengarahkan ulang ke www.domain.com/test .

Pengalihan non-WWW melalui Nginx (Memperbarui CNAME tidak diperlukan)

Jika Anda ingin menggunakan pengalihan www ke non-www, ulangi langkah serupa untuk melakukan yang sebaliknya:

[email protected]:~/multi-wordpress$ cat >> www.domain.com
rewrite ^/(.*)$ https://domain.com/$1 permanent;

Buat jaringan Docker eksternal

Saya akan menggunakan jaringan yang disebut net untuk tutorial ini. Oleh karena itu, saya membuatnya dengan perintah berikut:

docker network create net

Menyiapkan satu file Docker Compose yang siap untuk diterapkan

Dengan konfigurasi berikut dalam satu docker-compose.yml Anda dapat mengatur semuanya sekaligus dengan keenam wadah yang sesuai dengan tujuan Anda, mulai dari proxy terbalik hingga wadah WordPress terakhir. Mari kita lihat layanan demi layanan sebelum akhirnya menggabungkan semuanya menjadi satu file tunggal:

Kontainer Proxy Terbalik Nginx

Pasang kedua file client_max_upload_size.conf dan www.domain.com dalam mode hanya baca dan tentukan jaringan net yang dibuat secara manual.

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf:ro
      - ./www.domain.com:/etc/nginx/vhost.d/www.domain.com:ro
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

Mari Enkripsi Penampung untuk Sertifikat SSL

Perhatikan bahwa saya menggunakan rw untuk certs volume, tidak seperti ro di bagian sebelumnya. Ini penting untuk membuat sertifikat SSL dan memperbarui volume yang sesuai saat dibuat. Juga, atur email default untuk notifikasi dari Let's Encrypt dan tentukan “net . yang sama ” jaringan.

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: lets-encrypt-proxy-companion
    depends_on:
      - "nginx-proxy"
    volumes:
      - certs:/etc/nginx/certs:rw
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      DEFAULT_EMAIL: [email protected]
    restart: always
    networks:
      - net

Penampung database untuk situs WordPress pertama

Berdasarkan konfigurasi WordPress Docker Compose resmi, atur variabel lingkungan yang diperlukan seperti yang ditunjukkan di bawah ini dan tentukan jaringan internal (dilihat sebagai mysqldb0 di sini, digunakan untuk nama layanan dan nama volume juga).

Jaringan ini hanya akan terlihat oleh wadah basis data dan wadah WordPress terkaitnya. Saat Anda menerapkannya, database MySQL akan dibuat dengan kredensial yang ditunjukkan seperti di bawah:

  mysqldb0:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db0
      MYSQL_USER: db0user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb0:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb0

Wadah WordPress pertama

Saat Anda menerapkan wadah WordPress, itu akan menggunakan konfigurasi database yang ditentukan di bagian sebelumnya di atas. Perhatikan bahwa selain jaringan internal yang sama terlihat oleh database (mysqldb0 ), layanan WordPress ini juga harus melihat jaringan Nginx yang disebut net karena ini adalah aplikasi frontend untuk dunia luar.

  wordpress0:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb0
      WORDPRESS_DB_USER: db0user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db0
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: domain.com,www.domain.com
      LETSENCRYPT_HOST: domain.com,www.domain.com
    volumes:
      - 'wordpress0:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb0
    networks:
      - mysqldb0
      - net

Pada titik ini, Anda memiliki konfigurasi untuk menyiapkan satu Instance WordPress. Untuk menyiapkan lebih banyak, ulangi langkah 3 dan 4 dengan nama baru.

Ini dia:

Penampung database untuk situs WordPress kedua

  mysqldb1:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db1
      MYSQL_USER: db1user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb1:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb1

Wadah WordPress kedua

  wordpress1:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb1
      WORDPRESS_DB_USER: db1user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db1
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: wordpress.domain.com
      LETSENCRYPT_HOST: wordpress.domain.com
    volumes:
      - 'wordpress1:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb1
    networks:
      - mysqldb1
      - net

Dengan editor favorit Anda, buat docker-compose.yml file dengan semua konten yang dibahas hingga saat ini (parameter tambahan telah disertakan di bawah). Anda perlu mengedit nama domain dan data kredensial lainnya yang sesuai. Di sini, saya menggunakan Nano.

nano docker-compose.yml
version: '3.7'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
      - ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: lets-encrypt-proxy-companion
    depends_on:
      - "nginx-proxy"
    volumes:
      - certs:/etc/nginx/certs:rw
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      DEFAULT_EMAIL: [email protected]
    restart: always
    networks:
      - net

  mysqldb0:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db0
      MYSQL_USER: db0user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb0:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb0


  wordpress0:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb0
      WORDPRESS_DB_USER: db0user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db0
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: domain.com,www.domain.com
      LETSENCRYPT_HOST: domain.com,www.domain.com
    volumes:
      - 'wordpress0:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb0
    networks:
      - mysqldb0
      - net

  mysqldb1:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db1
      MYSQL_USER: db1user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb1:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb1


  wordpress1:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mariadb1
      WORDPRESS_DB_USER: db1user   
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db1
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: wordpress.linuxhindi.com
      LETSENCRYPT_HOST: wordpress.linuxhindi.com
    volumes:
      - 'wordpress1:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb1
    networks:
      - mysqldb1
      - net

volumes:
  certs:
  html:
  vhost:
  dhparam:
  mysqldb0:
  wordpress0:
  mysqldb1:
  wordpress1:

networks:
  mysqldb0:
    internal: true
  mysqldb1:
    internal: true
  net:
    external: true

Perhatikan bahwa saya telah menetapkan jaringan internal tertentu hanya untuk setiap database dan wadah WordPress yang sesuai. Wadah database tidak perlu melihat Nginx net jaringan. net diperlukan hanya untuk wadah WordPress frontend.

Dalam artikel kami sebelumnya tentang Wacana, saya menggunakan --volumes-from tandai untuk menggunakan nginx-proxy volume container dengan letsencrypt . Dengan cara yang sama, padanan untuk flag yang sama adalah volumes_from , dihapus oleh Docker beberapa waktu lalu. Oleh karena itu, saya telah secara eksplisit menentukan volume umum untuk kontainer Nginx dan Let's Encrypt di dalam docker-compose.yml file – yaitu, sertifikat , html , vhost dan /var/run/docker.sock .

Sekarang, terapkan pengaturan dengan docker-compose berikut ini perintah dari multi-wordpress yang sama direktori yang kita buat di awal:

docker-compose up -d

Anda akan mendapatkan konfirmasi berikut:

Creating network "multi-wordpress_mysqldb0" with the default driver
Creating network "multi-wordpress_mysqldb1" with the default driver
Creating volume "multi-wordpress_certs" with default driver
Creating volume "multi-wordpress_html" with default driver
Creating volume "multi-wordpress_vhost" with default driver
Creating volume "multi-wordpress_dhparam" with default driver
Creating volume "multi-wordpress_mysqldb0" with default driver
Creating volume "multi-wordpress_wordpress0" with default driver
Creating volume "multi-wordpress_mysqldb1" with default driver
Creating volume "multi-wordpress_wordpress1" with default driver
Creating multi-wordpress_mysqldb0_1   ... done
Creating nginx-proxy                  ... done
Creating multi-wordpress_mysqldb1_1 ... done
Creating multi-wordpress_wordpress1_1 ... done
Creating multi-wordpress_wordpress0_1 ... done
Creating lets-encrypt-proxy-companion ... done

Dua yang pertama adalah jaringan internal, diikuti oleh volume dan akhirnya wadah. Jaringan eksternal kami net sudah ada, karena saya membuatnya secara manual di awal tutorial ini.

Tunggu beberapa saat. Buka browser Internet Anda dan ketik www.domain.com . Ini akan dialihkan ke domain.com dan Anda akan melihat wizard penyiapan WordPress menunggu Anda:

Pilih bahasa pilihan Anda, klik lanjutkan dan lanjutkan dengan mengklaim administrasi situs Anda.

Untuk wordpress.domain.com , Anda akan mendapatkan hasil yang sama. Anda dapat menambahkan lebih banyak situs WordPress dengan mengulangi langkah 5 (layanan database) dan 6 (layanan WordPress), sesuai dengan sintaks yang sama seperti yang ditunjukkan untuk wadah yang ada. Juga, jangan lupa untuk merevisi volumes dan networks bagian dalam file YAML yang sesuai.

Untuk setiap situs baru, wadah WordPress baru dan wadah database MySQL yang sesuai akan dibuat. Jika Anda ingin mengetahui persamaan baris perintah dari file docker-compose.yml di atas, Anda dapat menjelajahinya di sini.

Kiat untuk memelihara instans WordPress yang dihosting sendiri

Berikut adalah beberapa tip yang akan membantu Anda dalam mempertahankan instans WordPress Anda dalam jangka panjang:

Pantau Log WordPress secara Real-time

Jika Anda ingin memeriksa log wadah WordPress (misalnya yang pertama dijelaskan dalam tutorial ini) saat digunakan secara real time, Anda dapat menjalankan:

docker logs -f multi-wordpress_wordpress0_1

Jika Anda ingin memecahkan masalah atau mempelajari apa yang terjadi di dalam setiap wadah lain yang relevan untuk penerapan ini, menggunakan Log Docker secara efisien dapat menjadi sangat penting:

Cadangkan dan Pulihkan Volume WordPress tanpa Waktu Henti

Menggunakan pendekatan cloud + lokal, Anda dapat mencadangkan dan memulihkan volume WordPress tanpa waktu henti.

Perbarui Kontainer WordPress tanpa Waktu Henti

Dengan --scale flag di Docker Compose, Anda dapat membuat wadah baru berdasarkan WordPress versi terbaru. Setelah selesai, Anda dapat menghapus yang lama. Ini menghasilkan nol waktu henti.

Semoga artikel ini bermanfaat bagi Anda. Jika Anda memiliki pemikiran, umpan balik, atau saran untuk dibagikan, beri tahu kami di komentar di bawah.


Linux
  1. Cara mengkonfigurasi beberapa situs web dengan server web Apache

  2. Cara Menginstal WordPress dengan Docker di Ubuntu

  3. Cara Menyebarkan Server DNS Dinamis dengan Docker di Debian 10

  1. Cara Mengatur Beberapa SSL pada Satu IP Dengan Nginx

  2. Bagaimana Cara Menggunakan Alias ​​​​Ssh yang Sama Dengan Beberapa Alamat Host/port/dll.?

  3. beberapa antarmuka fisik dengan IP pada subnet yang sama

  1. Cara Mengelola Kontainer Docker dengan Rancher di Ubuntu

  2. CentOS / RHEL 6:Cara memaksa sinkronisasi NTP dengan server NTP

  3. Bagaimana cara mengarahkan subdomain ke port lain di server yang sama?