Tutorial

How To Install WordPress with Nginx on a FreeBSD 10.1 Server

Published on January 14, 2015
How To Install WordPress with Nginx on a FreeBSD 10.1 Server

Introduction

WordPress is the most popular content management system (CMS) and blogging platform in the world. Using WordPress, you can quickly configure and customize your website, allowing you to add content and tweak the visual elements easily.

In this guide, we will be installing WordPress on a FreeBSD 10.1 machine using Nginx to serve our content. Nginx is a powerful web server that is efficient at handling a large number of concurrent connections. We will leverage this as the base for the WordPress installation we will be setting up in this guide.

Note: As of July 1, 2022, DigitalOcean no longer supports the creation of new FreeBSD Droplets through the Control Panel or API. However, you can still spin up FreeBSD Droplets using a custom image. Learn how to import a custom image to DigitalOcean by following our product documentation.

Prerequisites and Goals

In order to complete this guide, there are some preliminary steps that should be taken in order to get your server ready.

We will be adding the components in this guide to a configured FEMP (FreeBSD, Nginx, MySQL, and PHP) stack. You can learn how to set up Nginx, MySQL, and PHP on your FreeBSD 10.1 server with our guide here here.

Once you have Nginx, MySQL, and PHP installed and configured on your server, you can continue on with this guide. Our goal in this guide is to install the latest version of WordPress on our FreeBSD server.

There is an existing WordPress package that is installable through FreeBSD’s pkg command, but it currently relies on PHP version 5.4, which will only be receiving security updates from now on. Its total end of life will be in September of 2015.

To ensure that our site is built on a base that will receive support for a long while, we will be downloading and installing the latest version of WordPress from the project’s site and using PHP version 5.6 to process the dynamic content.

Install Additional PHP Extensions that WordPress Requires

When we were setting up PHP on our FreeBSD server in the FEMP guide, we installed the php56 package and the php56-mysql package so that our PHP instance could query data from a MySQL database if required.

This represents the minimum configuration required that allows PHP to be used as a base for a variety of different applications. WordPress will use the php56-mysql package, but it also requires some additional extensions in order to implement many of its core features.

Luckily, these can be easily installed using the pkg command. Download and install the required extensions by typing:

sudo pkg install php56-xml php56-hash php56-gd php56-curl php56-tokenizer php56-zlib php56-zip

After the installation is complete, if you are using the default tcsh shell, initiate a rehash so that the shell can find your new files:

rehash

All of the packages we’ve installed are PHP extensions. For our PHP-FPM instance to use these new extensions, we’ll have to restart the process:

sudo service php-fpm restart

After this is complete, we can begin configuring our database.

Create and Configure a MySQL Database

WordPress requires an SQL-style database in order to store site content and user data. We installed MySQL in our previous guide, so we have the tools we need to create and provide access to such a database.

To begin, you will need to use the mysql command to authenticate to your database system as the administrative user:

mysql -u root -p

You will be prompted for the MySQL root user’s password that you configured in the previous guide (while running the mysql_secure_installation script). Once you enter the correct password, you will be dropped into a MySQL prompt.

The fist thing we will do is create a database for our WordPress instance. You can call this whatever you would like, but we will be using the database name wordpress for this guide because it is semantic and easy to remember:

CREATE DATABASE wordpress;

If you run into trouble with the command above, make sure that you have a semicolon (;) at the end of your statement. The SQL querying language requires all statements to end with a semicolon.

After we create our database, our next step is to create a dedicated user that we will use to access the database. It is recommended that you create and utilize a separate MySQL user for every application that stores data within MySQL. This helps minimize the scope of security problems.

For this guide, we will call our new user wordpressuser and configure the access restraints so that it is only valid for connections originating from the server itself. We will also set a password for the user:

CREATE USER wordpressuser@localhost IDENTIFIED BY 'password';

Remember to change the password component in the above command to a secure password. You will need to remember this value later on.

We have now created the two MySQL components that our WordPress installation will require. However, they are not yet connected in any way. We need to give our new user access to the WordPress database so that it can set up and manage the data for our site. To do this, type:

GRANT ALL PRIVILEGES ON wordpress.* TO wordpressuser@localhost;

Our new user now has access to the database we configured. To let the instance of MySQL that is currently running know about these new changes, we should flush the privilege table:

FLUSH PRIVILEGES;

Finally, we can exit the MySQL prompt to get back to our regular shell environment by typing:

exit

Now that we have a database and user ready, we can download and configure the actual WordPress files.

Download and Configure WordPress

We will be downloading the latest version of WordPress from the project’s website to use for our installation. Because of possible security updates, it is very important to always use the most up-to-date version of WordPress.

The WordPress team makes this easy by always packaging the latest version into an archive at /latest.tar.gz on their site. We can download this into our home directory using the FreeBSD fetch utility:

cd ~
fetch http://wordpress.org/latest.tar.gz

Once the file has been downloaded, we can extract the WordPress files and directory structure using the tar command:

tar xzvf latest.tar.gz

The directory that will be created will be called wordpress. Delete the .tar.gz archive and then move into that directory so that we can begin configuration:

rm latest.tar.gz
cd wordpress

Inside, there is a sample configuration file that we can use as a template for our installation. Copy the file over to the wp-config.php filename that will be read by WordPress:

cp wp-config-sample.php wp-config.php

Now, we can open the file for editing so that we can configure the access credentials for the MySQL database and user we set up in the last section:

vi wp-config.php

Inside, there are three values that you must change in order for WordPress to correctly connect to and utilize your MySQL system. The DB_NAME variable defines the name of the MySQL database you created, the DB_USER should be set to the user you made, and the DB_PASSWORD should be modified to contain the password you selected for that user:

. . .

/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpressuser');

/** MySQL database password */
define('DB_PASSWORD', 'password');

. . .

When you are finished modifying these values, save and close the file.

Next, we can copy the WordPress installation into the /usr/local/www directory where we keep our various site files. We will use the rsync utility, as it allows us to maintain certain file attributes during the move:

sudo rsync -avP ~/wordpress /usr/local/www

Next, we need to adjust the owner of our WordPress files so that our web server can make changes where appropriate. Our web user and group are both called www:

sudo chown -R www:www /usr/local/www/wordpress

Now that your WordPress files are in place with the correct configuration, we can modify our Nginx configuration.

Configure Nginx

In our last guide, we set up Nginx to serve the default Nginx web page and configured it to pass PHP requests to our PHP-FPM instance. This takes us most of the way to the configuration we need for WordPress.

Open the Nginx configuration file with sudo privileges to make our changes:

sudo vi /usr/local/etc/nginx/nginx.conf

If you followed the instructions from the last guide, your file should look similar to this one (we’ve removed the comments below for clarity):

user  www;
worker_processes  2;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  example.com www.example.com;
        root /usr/local/www/nginx;
        index index.php index.html index.htm;

        location / {
            try_files $uri/ $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                include fastcgi_params;
        }
    }
}

We will have to make two adjustments in order to ensure that our WordPress will function correctly.

First, we need to adjust the document root since our WordPress files are located in the /usr/local/www/wordpress directory:

server {

    . . .

    root /usr/local/www/wordpress;

    . . .

}

The other change we need to make is to the try_files directive within the location / block. Currently, the configuration tells Nginx to try to find the request as a file first. If it cannot find a file that matches, it attempts to find a directory that matches the request. If this does not yield any results, Nginx issues a 404 error indicating that the resource could not be found.

We need to modify this so that instead of ending with a 404 error, the request is rewritten to an index.php file. The original request and arguments will be passed in as query parameters. We can configure this by modifying the try_files directive to look like this:

server {

    . . .

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    . . .

}

When you are finished, the configuration file should look something like this:

user  www;
worker_processes  2;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  example.com www.example.com;
        root /usr/local/www/wordpress;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                include fastcgi_params;
        }
    }
}

When you are finished making the above modifications, save and close the file.

Now, we can restart Nginx in order to implement our new changes. First, double check that our syntax is correct:

sudo nginx -t

If no errors are found, restart the service:

sudo service nginx restart

Completing the Installation Through the Web Interface

Our WordPress installation is now completely configured on the server end. We can complete the rest of the process using a web browser.

In your web browser, visit your server’s domain name or IP address:

http://example.com

WordPress will first ask you which language you wish to use:

WordPress select language

After making your selection, you will be taken to the initial configuration page to set up your WordPress installation:

WordPress installation

Fill out the name for your site and select the username you would like to use to administer the site. You will have to select and confirm a password for your site and fill in an email address where you can be reached. The last option is a choice as to whether to allow search engines to index the site.

When you have made your selections, click on the “Install WordPress” button at the bottom of the page. You will be asked to sign into the site using the credentials you just selected.

Upon logging in, you will be presented with the administration panel for your new WordPress installation:

WordPress admin interface

You can use this interface to post new content, modify the appearance of your site, and install and configure plugins to take advantage of additional functionality.

Conclusion

You now have a fresh WordPress installation up and running backed by Nginx, MySQL, and PHP. WordPress is incredibly powerful, allowing you to display many different kinds of content styled according to your preferences. If you are new to WordPress, you may want to start by looking at optional themes and plugins.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
4 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

For those wanting to run the iThemes Security plugin - you will need these additional packages

:~% sudo pkg install php56-extensions Updating FreeBSD repository catalogue… FreeBSD repository is up-to-date. All repositories are up-to-date. The following 17 package(s) will be affected (of 0 checked):

New packages to be INSTALLED: php56-extensions: 1.0 php56-session: 5.6.8 php56-opcache: 5.6.8 php56-xmlwriter: 5.6.8 php56-xmlreader: 5.6.8 php56-dom: 5.6.8 php56-simplexml: 5.6.8 php56-ctype: 5.6.8 php56-posix: 5.6.8 php56-filter: 5.6.8 php56-json: 5.6.8 php56-sqlite3: 5.6.8 sqlite3: 3.8.10.1 php56-pdo_sqlite: 5.6.8 php56-pdo: 5.6.8 php56-iconv: 5.6.8 php56-phar: 5.6.8

Thanks for the great article. I have a question: You didn’t create the www user and group, should we create those at all?

After following the FEMP stack tutorial and this one, I had a problem where options-general.php wasn’t loading correctly in WordPress because the multibyte string function was inactive. This caused a timeout when mb_substr() was called in wp-includes/compat.php

I fixed it by uncommenting the line ;extension=php_mbstring.dll in /usr/local/etc/php.ini and restarting. Please let me know if there is a better way.

I’m finding that /wp-admin/ doesn’t work unless it’s /wp-admin/index.php

Might I have done something wrong?

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Become a contributor for community

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

DigitalOcean Documentation

Full documentation for every DigitalOcean product.

Resources for startups and SMBs

The Wave has everything you need to know about building a business, from raising funding to marketing your product.

Get our newsletter

Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

New accounts only. By submitting your email you agree to our Privacy Policy

The developer cloud

Scale up as you grow — whether you're running one virtual machine or ten thousand.

Get started for free

Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

*This promotional offer applies to new accounts only.