I have this idea to create my own website since a long time ago, but it seems too complicated to do all these steps manually and I’m too lazy to start from the beginning. There are existing solutions for hosting a site, but that’s not my style. I won’t opt for a one-click interface to go through all processes magically. This time, I finally make up my mind and managed to publish this post on my site. I will share what issues I’ve conquered and steps to make one site of your own.
Before started, we need to know how the pipeline looks like:
- Rent a server or virtual server that also has a public IP address.
- Buy a domain that can be linked to your IP address.
- Setup DNS records.
- Setup the server environment.
- Install WordPress.
Virtual Server
For the Virtual Private Server (VPS), I selected Netcup’s product: VPS 200 G8, which includes 1 vCore, 2 GB RAM, 20 GB SSD, 40TB traffic, 1000 1000 MBit/s, 1 IPv4 address, etc. for a monthly price at 2.71 €. Since this VPS has Debian 8 installed, hence the following tutorials are based on this specific OS. Basically, any virtual server that satisfied the requirements can be used.
Buy a Domain
Here it doesn’t have any restrictions as well. You can buy any domain with your desired name on any site that offers domain registration. I bought this domain: big533.cc on Namecheap. There is also another famous site like GoDaddy.
Setup DNS Records
This step you need to complete it on the domain registration site of your choice (a.k.a we use the default name server from where we bought the domain). For example, I bought from Namecheap, so I need to set it in the account management panel. If you use another service, the general concept behind this step is the same. You need to find where to set A record for your domain.
If you plan to use a different name server, it’s not discussed here. The following bullet list showed the steps to find where to set records in Namecheap.
- Log into your account in Namecheap.
- Then click ‘Domain List’ on your left side of the panel. Your domains will be listed there.
- Select your domain and click the ‘manage’ button.
- Click ‘Advanced DNS’ on the top menu bar.
- We can add records in the first ‘Host Records’ section by clicking the ‘ADD NEW RECORD’ button.
Next, we add two A-type records:
#Type #Host #Value #TTL
A @ your ip auto
A www your ip auto
@
will direct your site to your destination IP without www
prefix, e.g. big533.cc
, while www
will direct www.big533.cc
to your IP. For a detailed explanation and how a name server works, you can read the article from this link.
VPS Environment
Because we will use Apache, MySQL, and PHP to run WordPress, these components are required. They are actually installed already on my VPS, but some of them are old. I prefer to upgrade them. Otherwise, in WordPress site health, it will show you some warnings which are annoying to me.
Upgrade PHP
Some of you can do it on your VPS management panel like cPanel with few clicks. But mine isn’t lucky, I have to do it manually.
Inspired by Ayesh’s post, I used Ondřej Surý’s awesome PHP PPA. We need to add the PPA and update the package information.
sudo apt install apt-transport-https lsb-release ca-certificates
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update
Then, we note down the current PHP packages into a text file, so we know what to install for the latest version.
dpkg -l | grep php | tee packages.txt
You can see all the packages listed in the text file start with phpx.y-
prefix where x.y
is the old version number. What we going to do is substituting the old version x.y
to the desired version php7.3-
in this case. We can install the packages using the command below:
sudo apt install php7.3 php7.3-cli php7.3-common php7.3-curl php7.3-gd php7.3-imap php7.3-json php7.3-mysql php7.3-readline libapache2-mod-php7.3
Note that libapache2-mod-php7.3
is used for Apache server with prefork
MPM (check with apachectl -V
command). You may need to use php7.2-fpm
for your web server.
Next, we need to enable the installed PHP packages and disable the old ones.
sudo a2enmod php7.3
sudo a2dismod php5
Finally, restart the Apache server using:
sudo service apache2 restart
Upgrade MySQL
The latest version of MySQL should provide better stability and performance. Before we start any modification, let’s backup our database:
mysqldump --all-databases > backup_databases.sql
Firstly, we need to download the Debian package for installing MySQL. You can check the latest package from Oracle’s MySQL APT Repository and change the deb file’s name.
wget https://dev.mysql.com/get/mysql-apt-config_0.8.14-1_all.deb
Then we install the downloaded package:
sudo dpkg -i mysql-apt-config_0.8.14-1_all.deb
You will see a configuration dialog in the terminal screen with three options to determine which product to configure. You can use the arrow keys and enter key to navigate. In the first option, we select mysql-5.7
to be installed. In the second option, we enable
MySQL Tools & Connectors. For the last option, we disable preview packages.
Next, we update the MySQL package before upgrading:
sudo apt-get update
Now, we can install the new MySQL server:
sudo apt-get install mysql-server
Don’t forget to upgrade the existing database (you need your MySQL’s root account and password):
sudo mysql_upgrade -u root -p
Finally, we need to restart the service:
sudo /etc/init.d/mysql restart
Install WordPress
The last step is easy since we already have Apache server, PHP and MySQL installed. Firstly, let’s download WordPress from web:
wget https://wordpress.org/latest.tar.gz
Next, unzip the archive:
tar -xzvf latest.tar.gz
Then, we move the wordpress
folder to the Apache server root /var/www/
. This root folder may change based on different configurations.
mv wordpress/ /var/www/
Before visiting your website, we have to create a specific user with all privileges and a database in MySQL. You may change the username and the password as well as the name of the database in the following code. The user can connect to the MySQL server from this VPS only (localhost). If you want to access from any host, substitute localhost
to %
.
# log into MySQL
mysql -u root -p
# create a new user
CREATE USER 'your_username'@'localhost' IDENTIFIED BY 'your_password';
# create a database
CREATE DATABASE dbname;
USE dbname;
# Grant all privileges
GRANT ALL PRIVILEGES ON dbname.* TO 'your_username'@'localhost';
Next, you should edit a wp-config.php
file before running the program. However, this step can be skipped now. You can directly visit your WordPress site to initialize the setup process when you first time opens the site.
If you choose to edit a configuration file…
Copy wp-config-sample.php
to wp-config.php
# cd to wordpress folder
cd /var/www/wordpress/
# use a sample config
mv wp-config-sample.php wp-config.php
Then edit the configuration file and edit the following entries based on your setup:
vim wp-config.php
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'dbname' );
/** MySQL database username */
define( 'DB_USER', 'your_username' );
/** MySQL database password */
define( 'DB_PASSWORD', 'your_password' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
If you put wordpress
folder in /var/www/
and set up your DNS records correct, you should be able to visit your site from yourdomain.com/wordpress
(In this case big533.cc/wordpress). You will be prompted to create an admin
user when the first time logged in.
If you don’t want to write a configuration file…
You can directly visit your site at yourdomain.com/wordpress
(In this case big533.cc/wordpress) without a configuration file. However, you will have to fill in a form before creating an admin
user. In this form, you need to provide the DB_NAME, DB_USER, DB_PASSWORD, etc.
Plugins Issues
After you managed to run WordPress on your VPS, you probably will find that when you install a plugin, you need to provide an FTP account. This is because the user of wordpress
folder doesn’t have the permission to write files.
To avoid this issue, there are many solutions online, but I found this one works without change any configurations. You basically just need to change the owner of the wordpress
folder to a user who has permission to write in Apache’s root folder (e.g. www-data
).
chown -R www-data:www-data /var/www/wordpress/
Finally, we can add plugins without requiring an FTP account. And that’s it! WordPress should now be installed.