We can see we have php 7.0 available out of the box:
sudo apt-cache show php-cli
Instead of using that, we'll start by installing the latest PHP 7.1, via the populate PHP repository.
# Add repository and update local cache of available packages
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update
# Search for packages starting with PHP,
# we'll see php7.1-* packages available
sudo apt-cache search -n php*
# Install PHP-FPM, PHP-CLI and modules php7.3-mcrypt
sudo apt-get install -y php7.3-fpm php7.3-cli php7.3-curl php7.3-mysql php7.3-sqlite3 \
php7.3-gd php7.3-xml php7.3-mbstring php7.3-common
Once that's installed, we can see some similar conventions from Nginx (and other software in Debian/Ubuntu).
PHP on Debian/Ubuntu is divided by version and Server Application Programming Interface. A SAPI is the context in which PHP is run. The most common are:
- cli - when running on the command line
- fpm - when fulfilling a web request via fastcgi
- apache2 - when run in Apache's mod-php
We can see the configuration split between version and SAPI by checking the file paths within /etc
:
cd /etc/php
ls -lah
> ... 5.6/
> ... 7.0/
> ... 7.1/
cd 7.1
ls -lah
> ... cli/
> ... fpm/
Within each SAPI directory (e.g. cli or fpm), there is a php.ini
file and a conf.d
directory. We can edit php.ini
per SAPI and use symlinks within the conf.d
directory to enable or disable modules per SAPI.
PHP on Debian/Ubuntu use Symlinks to decide which ones are loaded per SAPI.
All module configuration files are located in /etc/php/<version>/mods-available
,
and then loaded in via symlinks at /etc/php/<version>/<sapi>/conf.d
.
Step 7: Configure PHP With the stack installed, it is now time to configure everything to get it working. There isn’t much to configure with PHP, but there is one small security fix we need to make.
In your terminal, open up your php.ini file in whatever text editor you wish (VIM, or eMacs) but for simplicity, we will use Nano in this tutorial.
sudo nano /etc/php/7.3/fpm/php.ini The line we need to edit is cgi.fix_pathinfo=0 so you can either search for it like a needle in a haystack, or you can search for it using Ctrl+W , I personally recommend searching for it.
Press Ctrl+W and now type in cgi.fix_pathinfo= and click enter. This will take you to the right line right away. You will see a semicolon the left of this line. Delete the semi colon and then change the 1 into a 0 and save the file. The file should look like this upon saving:
To save something in Nano, just press Ctrl+X and type Y and then press Enter.
Before the changes can take effect we need to restart php-fpm by typing in this command:
Shell sudo systemctl restart php7.3-fpm
Now our change has taken effect.
sudo vim /etc/nginx/sites-available/default
Once PHP is installed, we can configure Nginx to send PHP requests off to PHP-FPM:
server {
listen 80;
root /var/www/html;
server_name _;
index index.html index.htm index.debian-default.html index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
incude snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.1-fpm.sock;
}
}
Once edits are complete we can test Nginx and reload:
sudo nginx -t
sudo service nginx reload
In the video, I show you some behavior around the above configuration. Most notably, the try_files
configuration allows for "pretty URLs",
meaning we don't need to add index.php
into the URL within our browser for Nginx to use the index.php
file.
The above configuration file will search for php files within the /var/www/html
directory and send requests to PHP-FPM if a file is requested that ends in the .php
extension.
Mysql
Learn how to install MySQL 5.5 or 5.6. We'll cover install MySQL non-interactively (no prompts), useful for scripting installs. This will show the use of debconf-set-selections and debconf-get-selections to configure MySQL setting that might normally be prompted for during installation.### Installing MySQL
We're using an Ubuntu server here, but this should work for Debian as well.
We can install mysql-server to get MySQL 5.5, but the MySQL 5.6 package is likely also available:
We can see more information about the MySQL package using apt-cache:
Installing Without Prompts (Scriptable)
Before we go and install MySQL, however, let's see how to remote prompts, so we aren't asked a password during installation. This is useful for scripting the installation of MySQL.
In your terminal export the DEBIAN_FRONTEND variable:
This will turn off "frontend" (prompts) during installations. If we install MySQL with this set to noninteractive, then no root password will be set, and we'll be able to log into MySQL as root without a password.
We can take this a step forward and also set a root password for MySQL to use ahead of time:
If you're on a system using yum over apt-get, you just won't get a password prompt. You'll need to set a root password post-install.
Securing/Cleaning up the install
This should always be run after installing MySQL, especially on systems using yum, where you generally don't set a root password ahead of time.
Whole Thing
The whole process put together is simply this: