How to deploy a laravel application using nginx on ubuntu
Tags: php, laravel, nginx, ubuntu
Published: 2020-01-20 23:13:41

---
title: How to deploy a laravel application using nginx on ubuntu
published: true
description: 
tags: php, laravel, nginx, ubuntu
---

Deploying PHP applications is often a headache for PHP developers. These days, you no longer throw all your PHP files into a folder on a shared host and have it manage everything for you, Instead, you have to create and configure a server, perform multiple installations, and write the appropriate configuration etc.

In this tutorial, I will walk you through deploying a laravel application using nginx on an ubuntu server.


> N/B: This tutorial assumes you have a linux server with root access already setup.


## Getting Started

When deploying laravel, we often use a web-service solution stack like LAMP (**Linux, Apache, Mysql, PHP**) or LEMP (**Linux, Nginx, Mysql, PHP**). This tutorial is focused on the **LEMP** stack.

**Linux:** Open-source open operating system that has become the most accepted by developers over the years. It will be the OS powering our web application.

**Nginx:**  Open source HTTP proxy application with reputably much smaller footprints compared to Apache, allowing it to handle higher load of HTTP requests. It’d help us handle our routing (requests / response).

**PHP &** **Mysql:** The programming language and default storage program behind laravel.


## Installing Nginx

First, from your terminal log into your server and perform an update:


    // log into the server
    ssh root@your_server_ip
    
    // perform update
    apt-get update 

Next, install nginx with the following commands:


    // install nginx
    apt-get install nginx

Once nginx is installed, we need to configure our firewall to allow access to the service.


> The default firewall configuration tool for Ubuntu is ufw (Uncomplicated firewall). Developed to ease iptables firewall configuration, ufw provides a user-friendly way to create an IPv4 or IPv6 host-based firewall. By default UFW is disabled.

To see a list of all the application configurations that `ufw` knows how to work with, type:


    ufw app list

You should see a list similar to this:


![](https://paper-attachments.dropbox.com/s_ABFC93250077DA7BDB6971FACE3C88F03BAFB9045583028879FCFAFAAB9C8DD7_1570018348274_Screenshot+2019-10-02+at+1.11.49+PM.png)


Enable **Nginx HTTP** by running the following in your terminal:


    ufw allow 'Nginx HTTP'

You should see the rules for HTTP now allowed from the output.


![](https://paper-attachments.dropbox.com/s_ABFC93250077DA7BDB6971FACE3C88F03BAFB9045583028879FCFAFAAB9C8DD7_1570018425660_Screenshot+2019-10-02+at+1.12.49+PM.png)


Ubuntu 18.04 automatically starts Nginx once it is installed. To see your installation in action visit the public IP of your server from a browser and you should see the following screen:


![Default nginx screen](https://paper-attachments.dropbox.com/s_ABFC93250077DA7BDB6971FACE3C88F03BAFB9045583028879FCFAFAAB9C8DD7_1570018693986_Screenshot+2019-10-02+at+1.15.38+PM.png)

## Installing PHP

From your terminal, run the following command to install Php and all the necessary packages needed to work with laravel:


    apt-get install php curl unzip php-pear php-fpm php-dev php-zip php-curl php-xmlrpc php-gd php-mysql php-mbstring php-xml

Once successful, verify that PHP is installed by typing the following:


    php -v

You should see the following:


![](https://paper-attachments.dropbox.com/s_ABFC93250077DA7BDB6971FACE3C88F03BAFB9045583028879FCFAFAAB9C8DD7_1570019122308_Screenshot+2019-10-02+at+1.24.43+PM.png)


Restart nginx to allow Php run by typing the following:


    systemctl restart nginx


## Installing Mysql

To be able to store data, we need a storage engine. Laravel supports mysql out of the box but you can also use other storage engines. To install Mysql, run the following from your terminal:


    apt-get install mysql-server

During the process, you may be prompted with a screen to input your password, just follow the prompt. Once that is done, configure mysql by running the following on your terminal:


    mysql_secure_installation 

Follow the prompts to set your root user password and other presets and you are good to go. 

Next, log in to MySQL and create a new database with the following commands:


    mysql -u username -p
    
    create database YOUR_DATABASE_NAME
## Installing Laravel

At this point, everything is in place to get our app running. We need to get our laravel application on the server before we can use it.

To install laravel and all its associated packages, we need to install composer.


> Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.

Run the following commands to install composer:


    // download the installer
    sudo curl -s https://getcomposer.org/installer | php
    
    // move the composer.phar
    sudo mv composer.phar /usr/local/bin/composer

From the command line, type `composer` to verify the installation. You should see the following screen.


![](https://paper-attachments.dropbox.com/s_ABFC93250077DA7BDB6971FACE3C88F03BAFB9045583028879FCFAFAAB9C8DD7_1570019449343_Screenshot+2019-10-02+at+1.30.15+PM.png)


Next, let’s install laravel via composer. From your server root path, navigate to `var/www/html` path and run the following command:


    composer create-project --prefer-dist laravel/laravel blog

Once successful, you should see a newly created blog directory. Navigate to it and set the appropriate permission for the storage folder and your application key by typing the following:


    chmod -R 777 storage/
    
    php artisan key:generate

Now update your database details in your `.env` file to the database you created earlier:


    DB_DATABASE=your_database_name
    DB_USERNAME=your_database_username
    DB_PASSWORD=your_database_password 

Finally, before we try out our application, we need to configure nginx to serve our directory by default.

Open up the config file from your terminal with this command `nano /etc/nginx/sites-available/default` and update the code to the following:


    server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;
    
        root /var/www/html/blog/public;
        index index.php index.html index.htm index.nginx-debian.html;
    
        server_name localhost;
    
        location / {
        try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location ~ \.php$ {
          try_files $uri /index.php =404;
          fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }

Save the file and restart nginx with the following command:


    service nginx configtest
    service nginx restart

Now, visit your public IP in the browser and you will see the following:


![](https://paper-attachments.dropbox.com/s_ABFC93250077DA7BDB6971FACE3C88F03BAFB9045583028879FCFAFAAB9C8DD7_1570023649201_Screenshot+2019-10-02+at+2.39.46+PM.png)


To test that our database is working run a database migration with the following code:


    php artisan migrate

You should see the following response that verifies everything works correctly:


![](https://paper-attachments.dropbox.com/s_ABFC93250077DA7BDB6971FACE3C88F03BAFB9045583028879FCFAFAAB9C8DD7_1570024846543_Screenshot+2019-10-02+at+3.00.10+PM.png)

## Conclusion 

In this tutorial, we walked through the process of deploying a laravel application. We talked about lamp/lemp and the different packages required to successfully run a laravel application. Note that this is just the basics of deploying an application they are so many other aspects we didn’t cover like security, scalability, access control etc. To learn more about laravel deployments click [here](https://laravel.com/docs/6.x/deployment).