A FEMP stack, which is comparable to a LEMP stack on Linux, is a collection of open-source software that is typically installed together to enable a FreeBSD server to host dynamic websites and web applications. FEMP is an acronym that stands for FreeBSD, Nginx, MySQL, and PHP.
In this guide, we’ll deploy elements of a FEMP stack on a FreeBSD 12.0 FastyCloud instance using pkg
, the FreeBSD package manager.
Requirements
Before you start this guide, you’ll need the following:
- A FreeBSD 12.0 VPS.
- A user with root privileges or
sudo
user to make configuration changes. - Basic familiarity with the FreeBSD system and command-line interface is recommended.
Before you begin
Check the FreeBSD version.
uname -ro
# FreeBSD 12.0-RELEASE-p6
Ensure that your FreeBSD system is up to date.
freebsd-update fetch install
pkg update && pkg upgrade -y
Install the necessary packages.
pkg install -y sudo vim bash curl
Create a new user account with your preferred username. We use johndoe
.
adduser
# Username: johndoe
# Full name: John Doe
# Uid (Leave empty for default): <Enter>
# Login group [johndoe]: <Enter>
# Login group is johndoe. Invite johndoe into other groups? []: wheel
# Login class [default]: <Enter>
# Shell (sh csh tcsh nologin) [sh]: bash
# Home directory [/home/johndoe]: <Enter>
# Home directory permissions (Leave empty for default): <Enter>
# Use password-based authentication? [yes]: <Enter>
# Use an empty password? (yes/no) [no]: <Enter>
# Use a random password? (yes/no) [no]: <Enter>
# Enter password: your_secure_password
# Enter password again: your_secure_password
# Lock out the account after creation? [no]: <Enter>
# OK? (yes/no): yes
# Add another user? (yes/no): no
# Goodbye!
Run the visudo
command and uncomment the %wheel ALL=(ALL) ALL
line, to allow members of the wheel
group to execute any command.
visudo
# Uncomment by removing hash (#) sign
# %wheel ALL=(ALL) ALL
Now, switch to your newly created user with su
:
su - johndoe
NOTE: Replace johndoe
with your username.
Set up the timezone:
sudo tzsetup
Installing mainline Nginx
You can install Nginx using FreeBSD’s package manager, pkg
. A package manager allows you to install most software effortlessly from a repository maintained by FreeBSD. You can learn more about how to use pkg
here.
To install the latest mainline Nginx, issue the following command:
sudo pkg install -y nginx-devel
Check the version:
nginx -v
# nginx version: nginx/1.17.1
This command will install the latest mainline version, which can reliably be used on a production server. If you want to install the latest stable release, just use nginx
package instead of nginx-devel
.
Now, enable and start Nginx:
sudo sysrc nginx_enable=yes
sudo service nginx start
To check that Nginx has started you can run the following command:
sudo service nginx status
As a result, you will see something similar to the following:
# Output
nginx is running as pid 17607.
You can verify that Nginx was installed and working without errors by visiting your server’s public IP address in your web browser. Navigate to your_server_IP
. You will see the default “Welcome to nginx!” page.
Installing MySQL
Again, you can utilize pkg
to obtain and install your software.
Install MySQL using pkg
:
sudo pkg install -y mysql80-client mysql80-server
Check the version:
mysql --version
# mysql Ver 8.0.16 for FreeBSD12.0 on amd64 (Source distribution)
Now, enable and start MySQL:
sudo sysrc mysql_enable=yes
sudo service mysql-server start
To check that MySQL has started you can run the following command:
sudo service mysql-server status
You’ll view something similar to the following:
# Output
mysql is running as pid 19066.
As a good practice, you should run the mysql_secure_installation
security script that will remove some insecure defaults and slightly limit access to your database system.
sudo mysql_secure_installation
You will be asked to set a password, followed by some other questions. Enter a strong password and then for the rest of the questions press ENTER to select the defaults.
Installing PHP 7.3
To install PHP 7.3
with pkg
, run this command:
sudo pkg install -y php73
Check the version.
php --version
# PHP 7.3.7 (cli) (built: Jul 18 2019 01:14:37) ( NTS )
# Copyright (c) 1997-2018 The PHP Group
# Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
Soft-link php.ini-production
to php.ini
.
sudo ln -s /usr/local/etc/php.ini-production /usr/local/etc/php.ini
Now, enable and start PHP-FPM:
sudo sysrc php_fpm_enable=yes
sudo service php-fpm start
To check that PHP-FPM has started you can run the following command:
sudo service php-fpm status
As a result, you’ll see something similar:
# Output
php_fpm is running as pid 23005.
Installing PHP Modules (Optional)
To enhance the functionality of PHP, you can optionally install some additional modules.
To see currently compiled in PHP modules, you can run this:
php -m
# [PHP Modules]
# Core
# date
# libxml
# mysqlnd
# pcre
# Reflection
# SPL
# standard
# [Zend Modules]
To search for available PHP modules, you can use this command:
pkg search ^php73-*
The results will be mostly PHP 7.3 modules that you can install:
# Output
# php73-7.3.7 PHP Scripting Language
# php73-Ice37-3.7.2 Modern alternative to object middleware such as CORBA/COM/DCOM/COM+
# php73-aphpbreakdown-2.2.2 Code-Analyzer for PHP for Compatibility Check-UP
# php73-aphpunit-1.8 Testing framework for unit tests
# php73-bcmath-7.3.7 The bcmath shared extension for php
# php73-brotli-0.7.0 Brotli extension for PHP
# php73-bsdconv-11.5.0 PHP wrapper for bsdconv
# php73-bz2-7.3.7 The bz2 shared extension for php
# php73-calendar-7.3.7 The calendar shared extension for php
# php73-composer-1.8.6 Dependency Manager for PHP
# php73-ctype-7.3.7 The ctype shared extension for php
# php73-curl-7.3.7 The curl shared extension for php
# . . .
If, after researching, you decide that you need to install a package, you can do so by using the pkg install
command. Most PHP web applications will require additional modules, so it’s good to know how to search for them.
Configuring Nginx to use PHP module
Before using PHP, you must configure it to work with Nginx.
Run sudo vim /usr/local/etc/nginx/test.conf
and populate the file with the following content:
server {
listen 80;
server_name SERVER_IP; # Replace with your IP or hostname
root /usr/local/www/nginx-dist;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Save the file and exit with :+W+Q
Now we need to include test.conf
in the main nginx.conf
file. The main configuration file for Nginx lives under /usr/local/etc/nginx
as nginx.conf
.
Run sudo vim /usr/local/etc/nginx/nginx.conf
to open the main configuration file in Vim and add the following line to the http {}
block.
include test.conf;
Test Nginx configuration:
sudo nginx -t
Because you’ve made configuration changes in Nginx, you have to reload the service for those to be applied. Otherwise, Nginx will still work with the earlier configuration.
sudo service nginx reload
Testing PHP processing
To test that your system is configured correctly for PHP, you can create a very basic PHP script. You’ll call this script info.php
. By default, the root
is set to /usr/local/www/nginx-dist
. You can create the info.php
file under that location:
sudo vim /usr/local/www/nginx-dist/info.php
Add this code to that file:
<?php phpinfo(); ?>
Navigate to http://your_server_IP/ìnfo.php
and you will see the following page:
After installation and setup you should remove info.php
file to avoid disclosing information about the server to the public.
sudo rm /usr/local/www/nginx-dist/info.php