{"id":1293,"date":"2015-04-15T00:00:00","date_gmt":"2015-04-15T00:00:00","guid":{"rendered":"https:\/\/www.mcloud.rs\/wordpress-high-availability-complete-setup-2\/"},"modified":"2025-10-31T14:56:55","modified_gmt":"2025-10-31T14:56:55","slug":"wordpress-high-availability-complete-setup","status":"publish","type":"post","link":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/","title":{"rendered":"The Complete High Availability WordPress setup"},"content":{"rendered":"<h2>Intro<\/h2>\n<p>In this text we will describe how to setup high available WordPress on your own, using CentOS, distributed filesystem GlusterFS and Percona XtraDB Cluster. Commands that you need to run are displayed blue, their output is white, and\u00a0part of commands that is colored red need to be adjusted to your environment.\u00a0If there is prompt\u00a0[ALL]# then you need to run that command on every server, otherwise the name of the server and curent directory are\u00a0specified inside [] brackets. Pay attention to here-doc cat commands spanning multiple lines and ending with keyword END.<\/p>\n<h2>Setting up\u00a0mCloud mServer SSD1\u00a0servers<\/h2>\n<p>We will start with 3 <a href=\"https:\/\/portal.mcloud.rs\/cart&amp;action=default&amp;languagechange=English\" target=\"_blank\" rel=\"noopener\">mCloud SSD servers<\/a>, with\u00a01GB RAM and 2 CPUs. We will choose Centos 7 template.<\/p>\n<figure id=\"attachment_3067\" aria-describedby=\"caption-attachment-3067\" style=\"width: 1019px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/portal.mcloud.rs\/cart&amp;action=default&amp;languagechange=English\"><img decoding=\"async\" class=\"wp-image-3067 size-full\" src=\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png\" alt=\"order servers\" width=\"1019\" height=\"670\" \/><\/a><figcaption id=\"caption-attachment-3067\" class=\"wp-caption-text\">Order your mCloud SSD servers for WordPress high availability<\/figcaption><\/figure>\n<p>We will name them like mns-wp-N.ha.rs\u00a0and note the assigned IP addresses.<\/p>\n<figure id=\"attachment_2974\" aria-describedby=\"caption-attachment-2974\" style=\"width: 538px\" class=\"wp-caption alignnone\"><img decoding=\"async\" class=\"wp-image-2974 size-full\" src=\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/servers-1.png\" alt=\"servers\" width=\"538\" height=\"217\" \/><figcaption id=\"caption-attachment-2974\" class=\"wp-caption-text\">Take note of the IP addresses of your mCloud SSD servers for WordPress high availability<\/figcaption><\/figure>\n<p>On every machine we will install some usual packets. Not all of them are necessary, but they can be handy:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">yum -y install bash bc bind-utils elinks ftp htop html2text iotop iptraf joe jwhois logwatch lsof lynx mailx man man-pages mytop net-snmp net-snmp-utils nfs-utils ntp openssh-clients rsync screen strace sysstat tcpdump tcptraceroute vim vim-enhanced wget wireshark yum-plugin-security yum-utils pciutils dmidecode telnet attr net-tools https:\/\/download.fedoraproject.org\/pub\/epel\/7\/x86_64\/e\/epel-release-7-5.noarch.rpm<\/span><\/pre>\n<p>For start, we will allow all communications between machines. We do this on every machine.<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">iptables -I INPUT -s <span style=\"color: #ff0000;\">87.237.205.1\/32<\/span> -j ACCEPT<\/span>\n[ALL]# <span style=\"color: #99ccff;\">iptables -I INPUT -s <span style=\"color: #ff0000;\">87.237.205.2\/32<\/span> -j ACCEPT<\/span>\n[ALL]# <span style=\"color: #99ccff;\">iptables -I INPUT -s <span style=\"color: #ff0000;\">87.237.205.3\/32<\/span> -j ACCEPT<\/span>\n[ALL]# <span style=\"color: #99ccff;\">iptables-save &gt; \/etc\/sysconfig\/iptables<\/span>\n[ALL]# <span style=\"color: #99ccff;\">echo 'iptables-restore &lt; \/etc\/sysconfig\/iptables' &gt;&gt; \/etc\/rc.local<\/span>\n[ALL]# <span style=\"color: #99ccff;\">chmod +x \/etc\/rc.local\n<\/span><\/pre>\n<h2>Installing and configuring GlusterFS<\/h2>\n<p>On every machine we will configure hosts file with names and addresses of every machine:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">cat &gt;&gt; \/etc\/hosts &lt;&lt;\"END\"<\/span>\n<span style=\"color: #ff0000;\">87.237.205.1 mns-wp-1.ha.rs mns-wp-1<\/span>\n<span style=\"color: #ff0000;\">87.237.205.2 mns-wp-2.ha.rs mns-wp-2<\/span>\n<span style=\"color: #ff0000;\">87.237.205.3 mns-wp-3.ha.rs mns-wp-3<\/span>\n<span style=\"color: #99ccff;\">END\n<\/span><\/pre>\n<p>Install and start glusterfs:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">wget -P \/etc\/yum.repos.d https:\/\/download.gluster.org\/pub\/gluster\/glusterfs\/LATEST\/CentOS\/glusterfs-epel.repo<\/span>\n[ALL]# <span style=\"color: #99ccff;\">yum -y install glusterfs glusterfs-fuse glusterfs-server<\/span>\n[ALL]# <span style=\"color: #99ccff;\">systemctl start glusterd\n<\/span><\/pre>\n<p>Enable it and check status:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">systemctl enable glusterd<\/span>\n[ALL]# <span style=\"color: #99ccff;\">systemctl status glusterd<\/span>\nglusterd.service - GlusterFS, a clustered file-system server\n   Loaded: loaded (\/usr\/lib\/systemd\/system\/glusterd.service; <span style=\"color: #00ff00;\">enabled<\/span>)\n   Active: <span style=\"color: #00ff00;\">active (running)<\/span> since Fri 2015-04-03 15:46:31 CEST; 3min 47s ago\n  Process: 11199 ExecStart=\/usr\/sbin\/glusterd -p \/var\/run\/glusterd.pid (code=exited, status=0\/SUCCESS)\n Main PID: 11200 (glusterd)\n   CGroup: \/system.slice\/glusterd.service\n           \u2514\u250011200 \/usr\/sbin\/glusterd -p \/var\/run\/glusterd.pid\n<\/pre>\n<p>Connect all servers into gluster pool. It&#8217;s enough to run this on one of the servers.<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster peer probe<\/span> <span style=\"color: #ff0000;\">mns-wp-2<\/span>\npeer probe: success.\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster peer probe<\/span> <span style=\"color: #ff0000;\">mns-wp-3<\/span>\npeer probe: success.\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster peer probe<\/span> <span style=\"color: #ff0000;\">mns-wp-1<\/span>\npeer probe: success. Probe on localhost not needed\n<\/pre>\n<p>Now we can check the pool status:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">gluster pool list<\/span>\nUUID                                    Hostname        State\na32d208c-7966-4af2-80d0-a42ec3568bbe    mns-wp-2        <span style=\"color: #00ff00;\">Connected<\/span>\n6ed8f0c7-01f2-4951-a663-5e73dba405b1    mns-wp-3        <span style=\"color: #00ff00;\">Connected<\/span>\nc96c8c8e-5b30-448f-8177-a7ef0d9a325e    localhost       <span style=\"color: #00ff00;\">Connected\n<\/span><\/pre>\n<p>On one of the machines we will make glusterfs volume with 3 replicas. We use parameter force because our choosen directory \/srv\/vol0\u00a0is not on a separate filesystem:<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster volume create <span style=\"color: #ff0000;\">vol0<\/span> rep 3 transport tcp<\/span> <span style=\"color: #ff0000;\">mns-wp-1<span style=\"color: #99ccff;\">:<\/span>\/srv\/vol0 mns-wp-2<span style=\"color: #99ccff;\">:<\/span>\/srv\/vol0 mns-wp-3<span style=\"color: #99ccff;\">:<\/span>\/srv\/vol0<\/span> <span style=\"color: #99ccff;\">force<\/span>\nvolume create: vol0 success\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster volume start<\/span> <span style=\"color: #ff0000;\">vol0<\/span>\nvolume start: vol0: success\n<\/pre>\n<p>Then we can check the status of the new volume. All bricks and Self-heal\u00a0daemons should be online.<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster vol status<\/span> <span style=\"color: #ff0000;\">vol0<\/span>\nStatus of volume: vol0\nGluster process                                         Port    Online  Pid\n------------------------------------------------------------------------------\nBrick mns-wp-1:\/srv\/vol0                                49152   <span style=\"color: #00ff00;\">Y<\/span>       1316\nBrick mns-wp-2:\/srv\/vol0                                49152   <span style=\"color: #00ff00;\">Y<\/span>       1899\nBrick mns-wp-3:\/srv\/vol0                                49152   <span style=\"color: #00ff00;\">Y<\/span>       859\nNFS Server on localhost                                 N\/A     N       N\/A\nSelf-heal Daemon on localhost                           N\/A     <span style=\"color: #00ff00;\">Y<\/span>       2593\nNFS Server on mns-wp-2                                  N\/A     N       N\/A\nSelf-heal Daemon on mns-wp-2                            N\/A     <span style=\"color: #00ff00;\">Y<\/span>       1997\nNFS Server on mns-wp-3                                  N\/A     N       N\/A\nSelf-heal Daemon on mns-wp-3                            N\/A     <span style=\"color: #00ff00;\">Y<\/span>       871\n\nTask Status of Volume vol0\n------------------------------------------------------------------------------\nThere are no active volume tasks\n<\/pre>\n<p>Since glusterfs servers are at the same time also clients, we can use localhost on every machine to mount the glusterfs volume:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">mkdir -p \/var\/www\/html\/<\/span>\n[ALL]# <span style=\"color: #99ccff;\">mount -t glusterfs localhost<\/span><span style=\"color: #ff0000;\"><span style=\"color: #99ccff;\">:\/<\/span>vol0<\/span><span style=\"color: #99ccff;\"> \/var\/www\/html<\/span>\n[ALL]# <span style=\"color: #99ccff;\">echo \"<span style=\"color: #ff0000;\"><span style=\"color: #99ccff;\">localhost:\/<\/span>vol0<\/span> \/var\/www\/html glusterfs defaults,_netdev 0 0\" &gt;&gt; \/etc\/fstab\n<\/span><\/pre>\n<p>Recommended switches for better performance:<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster vol set <span style=\"color: #ff0000;\">vol0<\/span> performance.quick-read on<\/span>\nvolume set: success\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster vol set <span style=\"color: #ff0000;\">vol0<\/span> performance.read-ahead on<\/span>\nvolume set: success\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster vol set <span style=\"color: #ff0000;\">vol0<\/span> performance.io-cache on<\/span>\nvolume set: success\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster vol set <span style=\"color: #ff0000;\">vol0<\/span> performance.cache-size 256MB<\/span>\nvolume set: success\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster vol set <span style=\"color: #ff0000;\">vol0<\/span> performance.stat-prefetch on<\/span> \nvolume set: success \n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster vol set <span style=\"color: #ff0000;\">vol0<\/span> performance.write-behind-window-size 4MB<\/span> \nvolume set: success \n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">gluster vol set <span style=\"color: #ff0000;\">vol0<\/span> performance.flush-behind on<\/span> \nvolume set: success<\/pre>\n<p>You can check these options with volume information:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">gluster vol info <span style=\"color: #ff0000;\">vol0<\/span><\/span>\nVolume Name: vol0\nType: Replicate\nVolume ID: c8cf45c4-bff5-42fb-b065-516de82ebb03\nStatus: Started\nNumber of Bricks: 1 x 3 = 3\nTransport-type: tcp\nBricks:\nBrick1: mns-wp-1:\/srv\/vol0\nBrick2: mns-wp-2:\/srv\/vol0\nBrick3: mns-wp-3:\/srv\/vol0\nOptions Reconfigured:\nperformance.write-behind-window-size: 4MB\nperformance.flush-behind: on\nperformance.stat-prefetch: on\nperformance.io-cache: on\nperformance.read-ahead: on\nperformance.quick-read: on\nperformance.cache-size: 256MB\n<\/pre>\n<h2>Installing and configuring\u00a0Percona XtraDB Cluster<\/h2>\n<p>We will install Percona XtraDB Cluster and setup a basic my.cnf file on every server:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">yum -y install https:\/\/www.percona.com\/downloads\/percona-release\/redhat\/0.1-3\/percona-release-0.1-3.noarch.rpm<\/span>\n[ALL]# <span style=\"color: #99ccff;\">yum -y install Percona-XtraDB-Cluster-56<\/span>\n[ALL]# <span style=\"color: #99ccff;\">cat &gt; \/etc\/my.cnf &lt;&lt;END\n[mysqld]\ndatadir=\/var\/lib\/mysql\nuser=mysql\n# Path to Galera library\nwsrep_provider=\/usr\/lib64\/libgalera_smm.so\n# Cluster connection URL contains the IPs of node#1, node#2 and node#3\nwsrep_cluster_address=gcomm:\/\/<span style=\"color: #ff0000;\">87.237.205.1<\/span>,<span style=\"color: #ff0000;\">87.237.205.2<\/span>,<span style=\"color: #ff0000;\">87.237.205.3<\/span>\n# In order for Galera to work correctly binlog format should be ROW\nbinlog_format=ROW\n# MyISAM storage engine has only experimental support\ndefault_storage_engine=InnoDB\n# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera\ninnodb_autoinc_lock_mode=2\n# SST method\nwsrep_sst_method=xtrabackup-v2\n# Cluster name\nwsrep_cluster_name=<span style=\"color: #ff0000;\">my_wordpress_cluster<\/span>\n# My name\nwsrep_node_name=$(hostname -s)\n# Authentication for SST method\nwsrep_sst_auth=\"<span style=\"color: #ff0000;\">sstuser<\/span>:<span style=\"color: #ff0000;\">s3cr3t<\/span>\"\n# Try to replicate even MyISAM\nwsrep_replicate_myisam=1\nEND\n<\/span><\/pre>\n<p>On one of the servers we will start bootstrap procedure of the XtraDB cluster:<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">systemctl start mysql@bootstrap.service\n<\/span><\/pre>\n<p>For state transfer of data between cluster members we will use separate mysql user. You should choose some complicated password here.<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">mysql -e 'CREATE USER \"<span style=\"color: #ff0000;\">sstuser<\/span>\"@\"localhost\" IDENTIFIED BY \"<span style=\"color: #ff0000;\">s3cr3t<\/span>\";'<\/span>\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">mysql -e 'GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO \"<span style=\"color: #ff0000;\">sstuser<\/span>\"@\"localhost\";'<\/span><\/pre>\n<p>On other servers we just start mysql service after installing Percona XtraDB Cluster and configuring my.cnf:<\/p>\n<pre>[mns-wp-2 ~]# <span style=\"color: #99ccff;\">systemctl start mysql<\/span>\n[mns-wp-3 ~]# <span style=\"color: #99ccff;\">systemctl start mysql\n<\/span><\/pre>\n<p>On every machine we will enable mysql service to start automaticaly:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">systemctl enable mysql<\/span><\/pre>\n<p>WordPress should have it&#8217;s own mysql user, choose some complicated password here:<\/p>\n<pre>[mns-wp-1 ~]#<span style=\"color: #99ccff;\"> mysql -e 'CREATE DATABASE <span style=\"color: #ff0000;\">wordpress<\/span>;'<\/span>\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">mysql -e 'CREATE USER \"<span style=\"color: #ff0000;\">wpuser<\/span>\"@\"%\" IDENTIFIED BY \"<span style=\"color: #ff0000;\">mojavrloduGcka_iKOmplik0v4na_sifra<\/span>\";'<\/span>\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">mysql -e 'GRANT ALL PRIVILEGES ON <span style=\"color: #ff0000;\">wordpress<\/span>.* TO \"<span style=\"color: #ff0000;\">wpuser<\/span>\"@\"<span style=\"color: #ff0000;\">%<\/span>\";'<\/span><\/pre>\n<p>For health checks of nodes in cluster, we can use command clustercheck which uses username\u00a0&#8220;clustercheckuser&#8221; and password\u00a0&#8220;clustercheckpassword!&#8221; by default. It&#8217;s recommended to change that password.<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">mysql -e 'GRANT PROCESS ON *.* TO `<span style=\"color: #ff0000;\">clustercheckuser<\/span>`@`<span style=\"color: #ff0000;\">localhost<\/span>` IDENTIFIED BY \"<span style=\"color: #ff0000;\">clustercheckpassword!<\/span>\";'<\/span>\n[ALL]# <span style=\"color: #99ccff;\">clustercheck<\/span>\nHTTP\/1.1 200 OK\nContent-Type: text\/plain\nConnection: close\nContent-Length: 40\n\nPercona XtraDB Cluster Node is synced.\n<\/pre>\n<p>Parameters and status of the cluster can be seen in system variables whose names start with wsrep:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">mysql -e 'show status like \"wsrep_cluster_size\";'<\/span>\n+--------------------+-------+\n| Variable_name      | Value |\n+--------------------+-------+\n| wsrep_cluster_size | 3     |\n+--------------------+-------+\n[ALL]# <span style=\"color: #99ccff;\">mysql -e 'show status like \"wsrep_cluster_status\";'<\/span>\n+----------------------+---------+\n| Variable_name        | Value   |\n+----------------------+---------+\n| wsrep_cluster_status | Primary |\n+----------------------+---------+\n[ALL]# <span style=\"color: #99ccff;\">mysql -e 'show status like \"wsrep_local_state_comment\";'<\/span>\n+---------------------------+--------+\n| Variable_name             | Value  |\n+---------------------------+--------+\n| wsrep_local_state_comment | Synced |\n+---------------------------+--------+\n<\/pre>\n<p>Also, it&#8217;s recommended to secure your mysql installation by disabling anonymous access and by setting the password for the mysql root user:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">mysql_secure_installation<\/span><\/pre>\n<h2>Installing WordPress with NginX, PHP-FPM, WP-CLI<\/h2>\n<p>We will install basic PHP packets. We have already imported\u00a0EPEL repository needed for some of those packets.<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">yum -y install \n        php-common              \n        php-fpm                 \n        php-gd                  \n        php-cli                 \n        php-pdo                 \n        php-mysqlnd             \n        php-bcmath              \n        php-mcrypt              \n        php-xml                 \n        php-mbstring            \n        php-xmlrpc              \n        php-pecl-memcache       \n        php-pecl-memcached      \n        php-pecl-apc            \n        php-devel               \n        php-dba                 \n        php-odbc                \n        php-pecl-amqp           \n        php-pgsql               \n        php-pspell              \n        php-recode              \n        php-redis               \n        php-snmp                \n        php-soap                \n        php-tidy                \n        php-pecl-mongo          \n        php-pecl-solr           \n        php-pecl-sphinx\n<\/span><\/pre>\n<p>We will add system user wpuser and group\u00a0wpuser. WordPress files will belong to this user.<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">useradd -d \/var\/www\/html\/wordpress -m <span style=\"color: #ff0000;\">wpuser<\/span><\/span>\n[mns-wp-1 ~]# <span style=\"color: #99ccff;\">chmod go+rx \/var\/www\/html\/wordpress\n<\/span><\/pre>\n<p>For installing WordPress we&#8217;ll use WP-CLI run as wpuser:<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">cd \/var\/www\/html\/<\/span>\n[mns-wp-1 \/var\/www\/html]# <span style=\"color: #99ccff;\">wget https:\/\/raw.githubusercontent.com\/wp-cli\/builds\/gh-pages\/phar\/wp-cli.phar<\/span>\n[ALL]# <span style=\"color: #99ccff;\">sudo -u <span style=\"color: #ff0000;\">wpuser<\/span> php \/var\/www\/html\/wp-cli.phar --info<\/span>\nPHP binary:     \/usr\/bin\/php\nPHP version:    5.4.16\nphp.ini used:   \/etc\/php.ini\nWP-CLI root dir:        phar:\/\/wp-cli.phar\nWP-CLI global config:\nWP-CLI project config:\nWP-CLI version: 0.18.0\n\n[ALL]# <span style=\"color: #99ccff;\">echo alias wp='\"sudo -u <span style=\"color: #ff0000;\">wpuser<\/span> php \/var\/www\/html\/wp-cli.phar\"' &gt;&gt; ~\/.bashrc<\/span>\n[ALL]# <span style=\"color: #99ccff;\">source ~\/.bashrc<\/span>\n<\/pre>\n<p>Install and configure WordPress:<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">cd \/var\/www\/html\/wordpress<\/span>\n[mns-wp-1 \/var\/www\/html\/wordpress]# <span style=\"color: #99ccff;\">wp core download<\/span>\n<span style=\"color: #00ff00;\">Success<\/span>: WordPress downloaded.\n[mns-wp-1 \/var\/www\/html\/wordpress]# <span style=\"color: #99ccff;\">wp core config --dbname=<span style=\"color: #ff0000;\">wordpress<\/span> --dbuser=<span style=\"color: #ff0000;\">wpuser<\/span> --dbpass=<span style=\"color: #ff0000;\">mojavrloduGcka_iKOmplik0v4na_sifra<\/span><\/span>\n<span style=\"color: #00ff00;\">Success<\/span>: Generated wp-config.php file.\n[mns-wp-1 \/var\/www\/html\/wordpress]# <span style=\"color: #99ccff;\">wp core install --url=<span style=\"color: #ff0000;\">wp.ha.rs<\/span> --title=<span style=\"color: #ff0000;\">MyHAWP<\/span> --admin_user=<span style=\"color: #ff0000;\">wpadmin<\/span> --admin_password=<span style=\"color: #ff0000;\">drugaduGack4_iCooomplikv4na_fra<\/span> --admin_email=<span style=\"color: #ff0000;\">marko@ha.rs<\/span><\/span>\n<span style=\"color: #00ff00;\">Success<\/span>: WordPress installed successfully.\n[mns-wp-1 \/var\/www\/html\/wordpress]# <span style=\"color: #99ccff;\">wp option update home <span style=\"color: #ff0000;\">https:\/\/wp.ha.rs<\/span><\/span>\n<span style=\"color: #00ff00;\">Success<\/span>: Updated 'home' option.\n[mns-wp-1 \/var\/www\/html\/wordpress]# <span style=\"color: #99ccff;\">wp option update siteurl <span style=\"color: #ff0000;\">https:\/\/wp.ha.rs<\/span><\/span>\n<span style=\"color: #00ff00;\">Success<\/span>: Updated 'siteurl' option.\n<\/pre>\n<p>Although WordPress does not use PHP sessions, many plugins do, so we will use memcache for central session storage:<\/p>\n<pre>[ALL]#<span style=\"color: #99ccff;\"> yum -y install memcached\n<\/span>[ALL]#<span style=\"color: #99ccff;\"> systemctl enable memcached\n<\/span>[ALL]#<span style=\"color: #99ccff;\"> systemctl start memcached\n<\/span>[ALL]#<span style=\"color: #99ccff;\"> cat &gt;&gt; \/etc\/php.d\/memcache.ini &lt;&lt;END\nsession.save_handler=memcache\nsession.save_path='tcp:\/\/<span style=\"color: #ff0000;\">87.237.205.1<\/span>:11211, tcp:\/\/<span style=\"color: #ff0000;\">87.237.205.2<\/span>:11211, tcp:\/\/<span style=\"color: #ff0000;\">87.237.205.3<\/span>:11211'\nEND<\/span><\/pre>\n<p>For security, we will not execute PHP-FPM as user\u00a0wpuser, but as user\u00a0apache, and group\u00a0wpuser. That way the user wpuser will be able to configure group permissions for writing where needed. Also we will configure timezone, enable php-fom service and start it:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">sed -i 's\/group = apache\/group = <span style=\"color: #ff0000;\">wpuser<\/span>\/' \/etc\/php-fpm.d\/www.conf<\/span>\n[ALL]# <span style=\"color: #99ccff;\">sed -i 's\/;date.timezone.*\/date.timezone = Europe\/Belgrade\/g' \/etc\/php.ini<\/span>\n[ALL]# <span style=\"color: #99ccff;\">systemctl enable php-fpm<\/span>\nln -s '\/usr\/lib\/systemd\/system\/php-fpm.service' '\/etc\/systemd\/system\/multi-user.target.wants\/php-fpm.service'\n# <span style=\"color: #99ccff;\">systemctl start php-fpm<\/span>\n<\/pre>\n<p>After that, we should see php-fpm\u00a0process in ps output:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">ps -Leo pid,user,group,args | grep php-fpm<\/span>\n17464 root     root     php-fpm: master process (\/etc\/php-fpm.conf)\n17465 apache   wpuser   php-fpm: pool www\n17466 apache   wpuser   php-fpm: pool www\n17467 apache   wpuser   php-fpm: pool www\n17468 apache   wpuser   php-fpm: pool www\n17469 apache   wpuser   php-fpm: pool www\n18576 root     root     grep --color=auto php-fpm\n<\/pre>\n<p>We will install the newest nginx:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">yum -y install https:\/\/nginx.org\/packages\/rhel\/7\/noarch\/RPMS\/nginx-release-rhel-7-0.el7.ngx.noarch.rpm<\/span>\n[ALL]# <span style=\"color: #99ccff;\">yum -y install nginx\n<\/span><\/pre>\n<p>And configure it by the standard recommendations for WordPress \u00a0(ex. on <a href=\"https:\/\/github.com\/Romke-vd-Meulen\/nginx-config\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/Romke-vd-Meulen\/nginx-config<\/a> ):<\/p>\n<pre>[ALL]#<span style=\"color: #99ccff;\"> echo 'fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;' &gt;&gt; \/etc\/nginx\/fastcgi_params\n<\/span>[ALL]#<span style=\"color: #99ccff;\"> echo 'fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;' &gt;&gt; \/etc\/nginx\/fastcgi_params<\/span>\n[ALL]#<span style=\"color: #99ccff;\"> cat &gt; \/etc\/nginx\/nginx.conf &lt;&lt;\"END\"\n# Generic startup file.\nuser nginx <span style=\"color: #ff0000;\">wpuser<\/span>;\nworker_processes  2;\nerror_log  \/var\/log\/nginx\/error.log;\npid        \/var\/run\/nginx.pid;\nevents {\n        worker_connections  1024;\n}\n\nhttp {\n        include       \/etc\/nginx\/mime.types;\n        default_type       application\/octet-stream;\n        access_log         \/var\/log\/nginx\/access.log;\n        sendfile           on;\n#       tcp_nopush         on;\n        keepalive_timeout  3;\n#       tcp_nodelay        on;\n        gzip               on;\n        # php max upload limit cannot be larger than this\n        client_max_body_size 32m;\n        index              index.php index.html index.htm;\n\n        # Upstream to abstract backend connection(s) for PHP.\n        upstream php {\n                #this should match value of \"listen\" directive in php-fpm pool\n#               server unix:\/tmp\/php-fpm.sock;\n                server 127.0.0.1:9000;\n        }\n\n    include \/etc\/nginx\/conf.d\/*.conf;\n}\nEND\n<\/span><\/pre>\n<p>Default virtual host will include other configuration files:<\/p>\n<pre>[ALL]#<span style=\"color: #99ccff;\"> cat &gt; \/etc\/nginx\/conf.d\/default.conf &lt;&lt;\"END\"\nserver {\n        server_name  _;\n        listen 0.0.0.0:8080;\n        rewrite ^ $scheme:\/\/<span style=\"color: #ff0000;\">wp.ha.rs<\/span>$request_uri redirect;\n}\n\nserver {\n        server_name <span style=\"color: #ff0000;\">wp.ha.rs<\/span>;\n        listen 0.0.0.0:8080;\n        root \/var\/www\/html\/wordpress;\n\tindex index.php;\n        include global\/restrictions.conf;\n        # Additional rules go here.\n\n\t# Only include one of the files below.\n        include global\/wordpress.conf;\n#        include global\/wordpress-ms-subdir.conf;\n#        include global\/wordpress-ms-subdomain.conf;\n}\nEND\n<\/span><\/pre>\n<p>File\u00a0<strong>restrictions.conf<\/strong>:<\/p>\n<pre>[ALL]#<span style=\"color: #99ccff;\"> mkdir -p \/etc\/nginx\/global\n<\/span>[ALL]#<span style=\"color: #99ccff;\"> cat &gt; \/etc\/nginx\/global\/restrictions.conf &lt;&lt;\"END\"\n# Global restrictions configuration file.\n# Designed to be included in any server {} block.\nlocation = \/favicon.ico {\n        log_not_found off;\n        access_log off;\n}\n\nlocation = \/robots.txt {\n        allow all;\n        log_not_found off;\n        access_log off;\n}\n\n# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).\n# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)\nlocation ~ \/. {\n        deny all;\n}\n\n# Deny access to any files with a .php extension in the uploads directory\n# Works in sub-directory installs and also in multisite network\n# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)\nlocation ~* \/(?:uploads|files)\/.*.php$ {\n        deny all;\n}\nEND<\/span><\/pre>\n<p>File\u00a0<strong>wordpress.conf<\/strong>:<\/p>\n<pre>[ALL]#<span style=\"color: #99ccff;\"> cat &gt; \/etc\/nginx\/global\/wordpress.conf &lt;&lt;\"END\"\n# WordPress single blog rules.\n# Designed to be included in any server {} block.\n\n# This order might seem weird - this is attempted to match last if rules below fail.\n# https:\/\/wiki.nginx.org\/HttpCoreModule\nlocation \/ {\n        try_files $uri $uri\/ \/index.php?$args;\n}\n\n# Add trailing slash to *\/wp-admin requests.\nrewrite \/wp-admin$ $scheme:\/\/$host$uri\/ permanent;\n\n# Directives to send expires headers and turn off 404 error logging.\nlocation ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {\n       access_log off; log_not_found off; expires max;\n}\n\n# Uncomment one of the lines below for the appropriate caching plugin (if used).\n#include global\/wordpress-wp-super-cache.conf;\n#include global\/wordpress-w3-total-cache.conf;\n\n# Pass all .php files onto a php-fpm\/php-fcgi server.\nlocation ~ [^\/].php(\/|$) {\n        fastcgi_split_path_info ^(.+?.php)(\/.*)$;\n        if (!-f $document_root$fastcgi_script_name) {\n                return 404;\n\t}\n\t# This is a robust solution for path info security issue and works with \"cgi.fix_pathinfo = 1\" in \/etc\/php.ini (default)\n        include fastcgi_params;\n        fastcgi_index index.php;\n#        fastcgi_intercept_errors on;\n        fastcgi_pass php;\n}\nEND\n<\/span><\/pre>\n<p>After that we can enable and start nginx:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">systemctl enable nginx<\/span>\nln -s '\/usr\/lib\/systemd\/system\/nginx.service' '\/etc\/systemd\/system\/multi-user.target.wants\/nginx.service'\n[ALL]# <span style=\"color: #99ccff;\">systemctl start nginx\n<\/span><\/pre>\n<h2>Install and configure HAProxy<\/h2>\n<p>We will use HAProxy as both nginx and mysql proxy.<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">yum -y install haproxy<\/span>\n[ALL]# <span style=\"color: #99ccff;\">cat &gt; \/etc\/haproxy\/haproxy.cfg &lt;&lt;\"END\"\nglobal\n    log         127.0.0.1 local2\n    chroot      \/var\/lib\/haproxy\n    pidfile     \/var\/run\/haproxy.pid\n    maxconn     4000\n    user        haproxy\n    group       haproxy\n    daemon\n    stats socket \/var\/lib\/haproxy\/stats\n\ndefaults\n    mode                    http\n    log                     global\n    option                  httplog\n    option                  dontlognull\n    option http-server-close\n    option forwardfor       except 127.0.0.0\/8\n    option                  redispatch\n    retries                 3\n    timeout http-request    10s\n    timeout queue           1m\n    timeout connect         10s\n    timeout client          1m\n    timeout server          1m\n    timeout http-keep-alive 10s\n    timeout check           10s\n    maxconn                 3000\n\nlisten stats :9090\n    mode http\n    stats enable\n    stats realm Haproxy\n    stats uri \/\n    stats auth <span style=\"color: #ff0000;\">wpha<\/span>:<span style=\"color: #ff0000;\">wphahapr0<\/span>\n\nfrontend  main *:80\n    default_backend             app\nbackend app\n    balance    roundrobin\n\u00a0   option     forwardfor\n\u00a0   option     httpchk GET \/<span style=\"color: #ff0000;\">hacheck.php<\/span> HTTP\/1.1rnHost:<span style=\"color: #ff0000;\">wp.ha.rs<\/span>\n\u00a0   http-check expect string <span style=\"color: #ff0000;\">OK<\/span>\n    server  <span style=\"color: #ff0000;\">mns-wp-1<\/span> <span style=\"color: #ff0000;\">87.237.205.1<\/span>:8080 check\n    server  <span style=\"color: #ff0000;\">mns-wp-2<\/span> <span style=\"color: #ff0000;\">87.237.205.2<\/span>:8080 check\n    server  <span style=\"color: #ff0000;\">mns-wp-3<\/span> <span style=\"color: #ff0000;\">87.237.205.3<\/span>:8080 check\nlisten mysql-cluster 0.0.0.0:<span style=\"color: #ff0000;\">3307<\/span>\n\u00a0   mode tcp\n\u00a0   balance roundrobin\n    option httpchk\n    server mns-wp-1 <span style=\"color: #ff0000;\">87.237.205.1<\/span>:3306 check port 9200 inter 12000 rise 3 fall 3\n    server mns-wp-2 <span style=\"color: #ff0000;\">87.237.205.2<\/span>:3306 check port 9200 inter 12000 rise 3 fall 3\n    server mns-wp-3 <span style=\"color: #ff0000;\">87.237.205.3<\/span>:3306 check port 9200 inter 12000 rise 3 fall 3\nEND<\/span>\n<\/pre>\n<p>Setup\u00a0haproxy check for\u00a0nginx and php-fpm:<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">echo -n '&lt;?php echo \"<span style=\"color: #ff0000;\">OK<\/span>\";?&gt;' &gt; \/var\/www\/html\/wordpress\/<span style=\"color: #ff0000;\">hacheck.php<\/span><\/span><\/pre>\n<p>Setup haproxy check for database:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">echo 'mysqlchk 9200\/tcp # mysqlchk' &gt;&gt; \/etc\/services\n<\/span>[ALL]#<span style=\"color: #99ccff;\"> yum -y install xinetd\n<\/span>[ALL]#<span style=\"color: #99ccff;\"> cat &gt; \/etc\/xinetd.d\/mysqlchk &lt;&lt;\"END\"\n# default: on\n# description: mysqlchk\nservice mysqlchk\n{\n disable = no\n flags = REUSE\n socket_type = stream\n port = 9200\n wait = no\n user = nobody\n server = \/usr\/bin\/clustercheck\n log_on_failure += USERID\n only_from = 87.237.205.1 87.237.205.2 87.237.205.3\n per_source = UNLIMITED\n}\nEND<\/span><\/pre>\n<p>Enable and start xinetd<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">systemctl enable xinetd<\/span>\n[ALL]# <span style=\"color: #99ccff;\">systemctl start xinetd<\/span><\/pre>\n<p>Setup WordPress\u00a0to connect to HAProxy:<\/p>\n<pre>[mns-wp-1 ~]# <span style=\"color: #99ccff;\">sed -i \"s\/'DB_HOST', 'localhost'\/'DB_HOST', '127.0.0.1:3307'\/\" \/var\/www\/html\/wordpress\/wp-config.php<\/span><\/pre>\n<p>Enable and start haproxy:<\/p>\n<pre>[ALL]# <span style=\"color: #99ccff;\">systemctl enable haproxy<\/span>\n[ALL]# <span style=\"color: #99ccff;\">systemctl start haproxy<\/span><\/pre>\n<h2>Install and activate W3 Total Cache<\/h2>\n<pre>[mns-wp-1 \/var\/www\/html\/wordpress]#<span style=\"color: #99ccff;\"> wp plugin install https:\/\/downloads.wordpress.org\/plugin\/w3-total-cache.0.9.4.1.zip\n<\/span>Downloading install package from https:\/\/downloads.wordpress.org\/plugin\/w3-total-cache.0.9.4.1.zip...\nUnpacking the package...\nInstalling the plugin...\nPlugin installed successfully.\n[mns-wp-1 \/var\/www\/html\/wordpress]#<span style=\"color: #99ccff;\"> wp plugin list\n<\/span>+----------------+----------+-----------+---------+\n| name           | status   | update    | version |\n+----------------+----------+-----------+---------+\n| akismet        | inactive | available | 3.0.4   |\n| hello          | inactive | none      | 1.6     |\n| w3-total-cache | inactive | none      | 0.9.4.1 |\n+----------------+----------+-----------+---------+\n[mns-wp-1 \/var\/www\/html\/wordpress]#<span style=\"color: #99ccff;\"> wp plugin activate w3-total-cache\n<\/span>Success: Plugin 'w3-total-cache' activated.\n<\/pre>\n<p>Setup\u00a0W3 Total Cache on the standard way and use all three memcached servers. Also configure all three memcached servers for Object cache.<\/p>\n<p><strong>Finished! Happy\u00a0HAWPing! \ud83d\ude42<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro In this text we will describe how to setup high available WordPress on your own, using CentOS, distributed filesystem GlusterFS and Percona XtraDB Cluster. Commands that you need to&hellip;<\/p>\n","protected":false},"author":16,"featured_media":1294,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1131,1116],"tags":[],"class_list":["post-1293","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tehnologija-en","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to setup high available WordPress on your own? I mCloud<\/title>\n<meta name=\"description\" content=\"In our new blog we will describe how to setup high available WordPress on your own, using CentOS, GlusterFS and Percona XtraDB Cluster.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to setup high available WordPress on your own? I mCloud\" \/>\n<meta property=\"og:description\" content=\"In our new blog we will describe how to setup high available WordPress on your own, using CentOS, GlusterFS and Percona XtraDB Cluster.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/\" \/>\n<meta property=\"og:site_name\" content=\"mCloud - Beograd\" \/>\n<meta property=\"article:published_time\" content=\"2015-04-15T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-31T14:56:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1019\" \/>\n\t<meta property=\"og:image:height\" content=\"670\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Marko Uskokovi\u0107\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marko Uskokovi\u0107\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/\"},\"author\":{\"name\":\"Marko Uskokovi\u0107\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/#\/schema\/person\/92eae5b20049b6a263162371f003a22d\"},\"headline\":\"The Complete High Availability WordPress setup\",\"datePublished\":\"2015-04-15T00:00:00+00:00\",\"dateModified\":\"2025-10-31T14:56:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/\"},\"wordCount\":753,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png\",\"articleSection\":[\"Tehnologija\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/\",\"url\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/\",\"name\":\"How to setup high available WordPress on your own? I mCloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png\",\"datePublished\":\"2015-04-15T00:00:00+00:00\",\"dateModified\":\"2025-10-31T14:56:55+00:00\",\"description\":\"In our new blog we will describe how to setup high available WordPress on your own, using CentOS, GlusterFS and Percona XtraDB Cluster.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#primaryimage\",\"url\":\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png\",\"contentUrl\":\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png\",\"width\":1019,\"height\":670},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.mcloud.rs\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Complete High Availability WordPress setup\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/#website\",\"url\":\"https:\/\/www.mcloud.rs\/en\/\",\"name\":\"mCloud\",\"description\":\"Najbolji SSD Cloud hosting servis u Srbiji\",\"publisher\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.mcloud.rs\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/#organization\",\"name\":\"mCloud\",\"url\":\"https:\/\/www.mcloud.rs\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/12\/mcloud2.png\",\"contentUrl\":\"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/12\/mcloud2.png\",\"width\":470,\"height\":126,\"caption\":\"mCloud\"},\"image\":{\"@id\":\"https:\/\/www.mcloud.rs\/en\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/#\/schema\/person\/92eae5b20049b6a263162371f003a22d\",\"name\":\"Marko Uskokovi\u0107\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.mcloud.rs\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a83da3608d2bac6cf64660de82e0938008f091611b64122e9cc90d121a9e02e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a83da3608d2bac6cf64660de82e0938008f091611b64122e9cc90d121a9e02e5?s=96&d=mm&r=g\",\"caption\":\"Marko Uskokovi\u0107\"},\"url\":\"https:\/\/www.mcloud.rs\/en\/blog\/author\/marko\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to setup high available WordPress on your own? I mCloud","description":"In our new blog we will describe how to setup high available WordPress on your own, using CentOS, GlusterFS and Percona XtraDB Cluster.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/","og_locale":"en_US","og_type":"article","og_title":"How to setup high available WordPress on your own? I mCloud","og_description":"In our new blog we will describe how to setup high available WordPress on your own, using CentOS, GlusterFS and Percona XtraDB Cluster.","og_url":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/","og_site_name":"mCloud - Beograd","article_published_time":"2015-04-15T00:00:00+00:00","article_modified_time":"2025-10-31T14:56:55+00:00","og_image":[{"width":1019,"height":670,"url":"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png","type":"image\/png"}],"author":"Marko Uskokovi\u0107","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Marko Uskokovi\u0107","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#article","isPartOf":{"@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/"},"author":{"name":"Marko Uskokovi\u0107","@id":"https:\/\/www.mcloud.rs\/en\/#\/schema\/person\/92eae5b20049b6a263162371f003a22d"},"headline":"The Complete High Availability WordPress setup","datePublished":"2015-04-15T00:00:00+00:00","dateModified":"2025-10-31T14:56:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/"},"wordCount":753,"commentCount":0,"publisher":{"@id":"https:\/\/www.mcloud.rs\/en\/#organization"},"image":{"@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png","articleSection":["Tehnologija"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/","url":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/","name":"How to setup high available WordPress on your own? I mCloud","isPartOf":{"@id":"https:\/\/www.mcloud.rs\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#primaryimage"},"image":{"@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png","datePublished":"2015-04-15T00:00:00+00:00","dateModified":"2025-10-31T14:56:55+00:00","description":"In our new blog we will describe how to setup high available WordPress on your own, using CentOS, GlusterFS and Percona XtraDB Cluster.","breadcrumb":{"@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#primaryimage","url":"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png","contentUrl":"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/11\/order-1-eng.png","width":1019,"height":670},{"@type":"BreadcrumbList","@id":"https:\/\/www.mcloud.rs\/en\/blog\/wordpress-high-availability-complete-setup\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mcloud.rs\/en\/"},{"@type":"ListItem","position":2,"name":"The Complete High Availability WordPress setup"}]},{"@type":"WebSite","@id":"https:\/\/www.mcloud.rs\/en\/#website","url":"https:\/\/www.mcloud.rs\/en\/","name":"mCloud","description":"Najbolji SSD Cloud hosting servis u Srbiji","publisher":{"@id":"https:\/\/www.mcloud.rs\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mcloud.rs\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.mcloud.rs\/en\/#organization","name":"mCloud","url":"https:\/\/www.mcloud.rs\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mcloud.rs\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/12\/mcloud2.png","contentUrl":"https:\/\/www.mcloud.rs\/wp-content\/uploads\/2024\/12\/mcloud2.png","width":470,"height":126,"caption":"mCloud"},"image":{"@id":"https:\/\/www.mcloud.rs\/en\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.mcloud.rs\/en\/#\/schema\/person\/92eae5b20049b6a263162371f003a22d","name":"Marko Uskokovi\u0107","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mcloud.rs\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a83da3608d2bac6cf64660de82e0938008f091611b64122e9cc90d121a9e02e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a83da3608d2bac6cf64660de82e0938008f091611b64122e9cc90d121a9e02e5?s=96&d=mm&r=g","caption":"Marko Uskokovi\u0107"},"url":"https:\/\/www.mcloud.rs\/en\/blog\/author\/marko\/"}]}},"_links":{"self":[{"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/posts\/1293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/comments?post=1293"}],"version-history":[{"count":2,"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/posts\/1293\/revisions"}],"predecessor-version":[{"id":8999,"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/posts\/1293\/revisions\/8999"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/media\/1294"}],"wp:attachment":[{"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/media?parent=1293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/categories?post=1293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mcloud.rs\/en\/wp-json\/wp\/v2\/tags?post=1293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}