
I just switched my development server from Debian to Ubuntu. I decided to use Ubuntu 16.04, nginx 1.10, PHP 7 and Percona MySQL.
Here are the steps involved in creating this configuration from scratch.
Ubuntu
Get the ISO file from https://www.ubuntu.com/download/server, add it to your boot sequence and run it. The installer will ask for general details such as name, location, keyboard type and installation type. For a non-GUI installation, just go with the default settings and do not check any extra modules.
When installation is complete, you need to configure your root password by running:
sudo passwdand following the steps. You will have to type your password twice. Whenever you need root access, just use:
suWhen everything is done, update your Ubuntu installation by running:
apt update
apt upgradenginx
We use nginx-extras from Ubuntu’s repository. We use the default paths.
apt install nginx-extrasEdit /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.confModify error_log to:
error_log /var/log/nginx/error.log warn;Open your server IP on a browser (use ip addr show to display it) and you’ll see the default nginx webpage.
Percona MySQL
We are going to use Percona MySQL. Percona MySQL and normal SQL has no difference in commands, it is a special optimised version.
gpg --keyserver  hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
gpg -a --export CD2EFD2A | apt-key add -
sudo sh -c 'echo "deb https://repo.percona.com/apt/ xenial main" >> /etc/apt/sources.list.d/percona.list'
apt update
sudo apt install percona-server-5.7
sudo mysql_secure_installationDelete all test/default users and databases. Now login to MySQL server and run the commands specific for Percona:
mysql -u root -h localhost -p
CREATE FUNCTION fnv1a_64 RETURNS INTEGER SONAME 'libfnv1a_udf.so';
CREATE FUNCTION fnv_64 RETURNS INTEGER SONAME 'libfnv_udf.so';
CREATE FUNCTION murmur_hash RETURNS INTEGER SONAME 'libmurmur_udf.so';
exit
service mysql restartAfter completion of this step, you can run a cat command on /etc/mysql/my.cnf. Percona has no my.cnf by default. The most important step is how to enable auto restart of MySQL, in order to prevent the “Error Establishing a Database Connection” error message.
echo " " > /etc/mysql/my.cnf
cd ~ && wget https://raw.githubusercontent.com/AbhishekGhosh/Nginx-PHP5-FPM/master/percona-mysql-server/fail-safe-my.cnf
cat fail-safe-my.cnf > /etc/mysql/my.cnfPHP
For the latest PHP version, use the following commands:
sudo add-apt-repository ppa:ondrej/php
apt install libcurl3 libmcrypt4 libmemcached11 libxmlrpc-epi0 php7.0-cli php7.0-common php7.0-curl php7.0-fpm php7.0-gd php7.0-intl php7.0-json php7.0-mbstring php7.0-mcrypt php7.0-mysql php7.0-opcache php7.0-readline php7.0-xml php7.0-xmlrpc psmisc libmcrypt-dev mcrypt php-pear php-mysql php-mbstring php-mcrypt php-xml php-intl libmhash2 php-commonnano /etc/php/7.0/fpm/php.iniFind cgi.fix_pathinfo. This will be commented out with a semi-colon (;) and set to 1 by default. We will change both of these conditions by uncommenting the line and setting it to 0 like this:
cgi.fix_pathinfo=0Edit default nginx file with sudo nano /etc/nginx/sites-available/default command and make it like this:
server {
    listen 80 default_server;
    root /usr/share/nginx/html;
    index index.html index.htm index.php;
    server_name localhost;
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        # With php7.0-fpm:
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        include fastcgi_params;
    }
}Then restart PHP and Nginx:
sudo systemctl restart php7.0-fpmor
sudo service php7.0-fpm restartand
service nginx restartNow, delete the default file in /usr/share/nginx/html and add a PHP file:
cd /usr/share/nginx/html
rm -r *
nano index.phpAdd “Hello World”, save and exit.
Redis
Before you install Redis, there are a couple of prerequisites that need to be downloaded to make the installation as easy as possible.
Update all of the apt packages:
apt updateOnce the process finishes, download a compiler with build essential which will help us install Redis from source:
sudo apt install build-essential
sudo apt install tcl8.5Since we won’t need to keep the source code that we’ll compile long term, we will build in the /tmp directory.
cd /tmpDownload the latest stable version of Redis.
wget http://download.redis.io/redis-stable.tar.gzUnzip and install:
tar xzvf redis-stable.tar.gz
cd redis-stable
make
make test
sudo make installNow that Redis is installed, we can begin to configure it.
sudo mkdir /etc/redis
sudo cp /tmp/redis-stable/redis.conf /etc/redis
sudo nano /etc/redis/redis.confIn the file, find the supervised directive. Currently, this is set to no. Since we are running an operating system that uses the systemd init system, we can change this to systemd:
[...]
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd
[...]Next, find the dir directory. This option specifies the directory that Redis will use to dump persistent data. We need to pick a location that Redis will have write permission and that isn’t viewable by normal users.
We will use the /var/lib/redis directory for this, which we will create in a moment:
[...]
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/lib/redis
[...]Save and exit.
Create and open the /etc/systemd/system/redis.service file to get started:
sudo nano /etc/systemd/system/redis.serviceAdd this:
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.targetSave and exit.
Now, we just have to create the user, group, and directory that we referenced in the previous two files.
Begin by creating the redis user and group. This can be done in a single command by typing:
sudo adduser --system --group --no-create-home redisNow, we can create the /var/lib/redis directory by typing:
sudo mkdir /var/lib/redisWe should give the redis user and group ownership over this directory:
sudo chown redis:redis /var/lib/redisAdjust the permissions so that regular users cannot access this location:
sudo chmod 770 /var/lib/redisStart up the systemd service by typing:
sudo systemctl start redisIf all of your tests worked, and you would like to start Redis automatically when your server boots, you can enable the systemd service.
sudo systemctl enable redisThat’s it. These are the steps I’ve followed. For a more in-depth explanation, check the reference links below.
References:
- How to Install WordPress : Ubuntu 16.04, Nginx, PHP7-FPM
- How To Install and Configure Redis on Ubuntu 16.04
- https://icanhazip.com/
Image Credit: www.cwcs.co.uk
 
                                                     
                                                     
                                                     
                