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.
Menyiapkan direktori kerja untuk semua layanan terkait WordPress
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.