Table of Contents
Introduction
Setting up WordPress with Vagrant has become a go-to solution for developers seeking a reliable, consistent, and portable environment for web development. Vagrant simplifies the process of creating and configuring virtual environments, ensuring that your WordPress projects are not only portable but also identical across various systems. This guide walks you through the step-by-step process of setting up WordPress Vagrant, from basic installation to advanced configurations.
In this tutorial, I’m set up a WordPress Vagrant, using vagrant box ubuntu with Nginx + MariaDB + WordPress. Vagrant the essential for DevOps Roles.
Benefits of Using Vagrant for WordPress Development
1. Consistent Environments
- Ensures uniformity between development, staging, and production environments.
- Avoids the common “works on my machine” problem.
2. Portable and Reproducible
- Easily share development environments across teams.
- Rapidly recreate environments in case of errors or new projects.
3. Integration with Popular Tools
- Works seamlessly with VirtualBox, Docker, and other virtualization tools.
- Supports provisioning tools like Ansible, Chef, and Puppet.
Prerequisites
Before diving into the setup, ensure you have the following:
Required Tools
- VirtualBox: Virtualization software.
- Vagrant: Tool to manage virtual environments.
- A code editor like Visual Studio Code.
- Basic understanding of command-line operations.
System Requirements
- At least 8GB of RAM.
- 20GB of free disk space.
- A stable internet connection.
Step-by-Step Guide to Setting Up WordPress with Vagrant
The structures files and folders wordpress vagrant as below:
[huupv@localhost project]$ pwd
/home/huupv/project
[huupv@localhost project]$ ls -F
keys/ nginx/ Vagrantfile var/
mysql/ php/ VAGRANT_ENV/ wp/
To configure Vagrantfile
vim Vagrantfile
The content as below:
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.hostname = "wp"
config.ssh.insert_key = false
#config.vm.boot_timeout = 800
#config.ssh.username = vagrant
#config.ssh.password = vagrant
#config.ssh.private_key_path = ["keys/.ssh/vagrant_rsa", "~/.vagrant.d/insecure_private_key"]
#config.vm.provision "file", source: "keys/.ssh/vagrant_rsa.pub", destination: "~/.ssh/authorized_keys"
config.vm.provision :shell, path: "VAGRANT_ENV/bootstrap.sh"
config.vm.network "forwarded_port", guest: 80, host: 8888
config.vm.network :public_network, :bridge => "eth1", :auto_config => false
config.vm.provider :virtualbox do |vb|
# Set VM memory size
vb.customize ["modifyvm", :id, "--memory", "512"]
# these 2 commands massively speed up DNS resolution, which means outbound
# connections don't take forever (eg the WP admin dashboard and update page)
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
end
To configure file vagrant bootstrap.sh
vim VAGRANT_ENV/bootstrap.sh
The content as below:
#!/bin/bash
echo "Vagrant box (Ubuntu 16.04 + nginx + php7.0 + MariaDB + WordPress."
echo "Updating apt-get"
sudo apt-get -y update
# Nginx
echo "Installing Nginx"
sudo apt-get install -y nginx
# MySQL
echo "Preparing for MySQL Installation"
sudo apt-get install -y debconf-utils
sudo debconf-set-selections << "mysql-server mysql-server/root_password password root"
sudo debconf-set-selections << "mysql-server mysql-server/root_password_again password root" echo "Installing MySQL" #sudo apt-get install -y mysql-server-5.7
sudo apt-get install -y mariadb-server mariadb-client php7.0-mysql
sudo rm -f /etc/mysql/my.cnf
sudo rm -f /etc/alternatives/my.cnf
sudo cp /vagrant/mysql/my.cnf /etc/alternatives/my.cnf
sudo ln -s /etc/alternatives/my.cnf /etc/mysql/my.cnf
ls -ll /etc/mysql/my.cnf
echo "Installing PHP and MySQL module"
sudo apt-get install -y php-fpm php-mysql
# Nginx Config
echo "Overwriting default Nginx config to work with PHP"
sudo rm -rf /etc/nginx/sites-available/default
cp /vagrant/nginx/default.conf /etc/nginx/sites-available/default
# php cli
sudo sed -i "s/error_reporting = .*/error_reporting = E_ALL/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/display_errors = .*/display_errors = On/" /etc/php/7.0/cli/php.ini
sudo sed -i "s/memory_limit = .*/memory_limit = 30M/" /etc/php/7.0/cli/php.ini
sudo sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/7.0/cli/php.ini
# php fpm
sudo sed -i "s/error_reporting = .*/error_reporting = E_ALL/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/display_errors = .*/display_errors = On/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/memory_limit = .*/memory_limit = 30M/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/upload_max_filesize = .*/upload_max_filesize = 100M/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/post_max_size = .*/post_max_size = 100M/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/7.0/fpm/php.ini
# Restarting Nginx for config to take effect
echo "Restarting Nginx for changes to take effect"
sudo service nginx restart
echo "Setting Ubuntu (user) password to \"vagrant\""
echo "ubuntu:vagrant" | chpasswd
# Services restart
sudo systemctl restart mysql.service
sudo systemctl restart nginx.service
sudo systemctl restart php7.0-fpm.service
sudo mysql -u root -p -e 'show databases'
#Create wordpress databases
bash /vagrant/mysql/create_database.sh
#To install and configure wordpress
cd /tmp
curl -O https://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz
sudo cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php
mkdir /tmp/wordpress/wp-content/upgrade
sudo cp -a /tmp/wordpress/* /var/www/html
sudo find /var/www/html -type d -exec chmod g+s {} \;
sudo chmod g+w /var/www/html/wp-content
sudo chmod -R g+w /var/www/html/wp-content/themes
sudo chmod -R g+w /var/www/html/wp-content/plugins
sudo rm -f /var/www/html/wp-config.php
sudo cp /vagrant/wp/wp-config.php /var/www/html/wp-config.php
sudo usermod -a -G www-data ubuntu
sudo chown -R ubuntu:www-data /var/www/html
sudo systemctl restart nginx.service
echo "Cleaning up additional setup files and logs"
#sudo rm -r /var/www/html
#sudo rm /var/www/ubuntu-xenial-16.04-cloudimg-console.log
To configure MySQL my.cf file
vim mysql/my.cnf
The content as below:
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 0.0.0.0
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
myisam-recover = BACKUP
query_cache_limit = 1M
query_cache_size = 16M
log_error = /var/log/mysql/error.log
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
[isamchk]
key_buffer_size = 16M
!includedir /etc/mysql/conf.d/
To create a database for WordPress
vim mysql/create_database.sh
The content as below:
#!/usr/bin/env bash
if [ ! -z "wordpress" ] ; then
echo "creating database"
sudo mysql -u root -p'root' -e "CREATE DATABASE IF NOT EXISTS wordpress;"
if [ ! -z "wp_db_user" ]; then
echo " adding custom user"
sudo mysql -u root -p'root' -e "GRANT ALL ON wordpress.* TO 'wp_db_user'@'localhost' IDENTIFIED BY '123456789'"
sudo mysql -u root -p'root' -e "FLUSH PRIVILEGES;"
sudo mysql -u root -p'root' -e 'show databases;'
fi
else
echo "No database name specified - skipping db creation"
fi
To configure file wp-config.php for WordPress vagrant
vim wp/wp-config.php
The content as below:
<?php
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'wp_db_user');
/** MySQL database password */
define('DB_PASSWORD', '123456789');
/** MySQL hostname */
define('DB_HOST', 'localhost');
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
$table_prefix = 'wp_';
define('WP_DEBUG', false);
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
define('FS_METHOD', 'direct');
To configure file nginx.conf
vim nginx/default.conf
The content as below:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/html/;
index index.php index.html index.htm;
client_max_body_size 20M;
server_name devopsroles.com;
location / {
try_files $uri $uri/ /index.php?$args;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Vagrant up running for WordPress
[huupv@localhost ~]$ cd /home/huupv/project/
[huupv@localhost project]$ vagrant up
FAQs
Q1: Why use Vagrant over Docker for WordPress?
While Docker is lightweight, Vagrant provides a full virtualized environment, making it suitable for developers needing an environment closer to production.
Q2: Can I use a different Linux distribution?
Yes, replace ubuntu/bionic64
in the Vagrantfile
with the desired box name from Vagrant Cloud.
Q3: How do I update the Vagrant environment?
Use the following commands:
- To apply updates:
vagrant provision
- To rebuild the environment:
vagrant destroy -f && vagrant up
Q4: How do I troubleshoot Vagrant errors?
- Check the Vagrant logs in the project directory.
- Refer to the Vagrant Documentation.
External Resources
Conclusion
You have to set up a Vagrant WordPress Nginx + MariaDB. Setting up WordPress with Vagrant is a powerful way to ensure consistency and efficiency in web development. By following this guide, you can create a robust development environment tailored to your needs. Whether you’re a solo developer or part of a team, Vagrant offers the flexibility and reliability to elevate your WordPress projects. I hope will this your helpful. Thank you for reading the DevopsRoles page!