How To Install and Configure Laravel with Nginx on Ubuntu 22.04 (LEMP)
By Erika Heidi and Jamon Camisso
Not using Ubuntu 22.04?Choose a different version or distribution.
Introduction
Laravel is an open-source PHP framework that provides a set of tools and resources to build modern PHP applications. With a complete ecosystem leveraging its built-in features, Laravel’s popularity has grown rapidly in the past few years, with many developers adopting it as their framework of choice for a streamlined development process.
In this guide, you’ll install and configure a new Laravel application on an Ubuntu 22.04 server, using Composer to download and manage the framework dependencies and Nginx to serve the application. When you’re finished, you’ll have a functional Laravel demo application pulling content from a MySQL 8 database.
Prerequisites
In order to complete this guide, you will first need to perform the following tasks on your Ubuntu 22.04 server:
- Create a
sudo
user and enableufw
. To set this up, you can follow our Initial Server Setup with Ubuntu 22.04 guide. - Install a LEMP stack with MySQL 8. If you haven’t set this up yet, you can follow steps 1 to 3 of our guide on How to Install Nginx, MySQL and PHP on Ubuntu 22.04.
- Install Composer. We’ll use Composer to install Laravel and its dependencies. You can install Composer by following our guide on How to Install Composer on Ubuntu 22.04.
Step 1 — Installing Required PHP modules
Before you can install Laravel, you need to install a few PHP modules that are required by the framework. We’ll use apt
to install the php-mbstring
, php-xml
and php-bcmath
PHP modules. These PHP extensions provide extra support for dealing with character encoding, XML and precision mathematics.
If this is the first time using apt
in this session, you should first run the update
command to update the package manager cache:
Now you can install the required packages with:
Your system is now ready to execute Laravel’s installation via Composer, but before doing so, you’ll need a database for your application.
Step 2 — Creating a Database for the Application
To demonstrate Laravel’s basic installation and usage, we’ll create a travel list application to show a list of places a user would like to travel to, and a list of places that they already visited. This can be stored in a places table with a field for locations that we’ll call name and another field to mark them as visited or not visited, which we’ll call visited. Additionally, we’ll include an id field to uniquely identify each entry.
To connect to the database from the Laravel application, we’ll create a dedicated MySQL user, and grant this user full privileges over the travellist
database.
At the time of this writing, the native MySQL PHP library mysqlnd
doesn’t support caching_sha2_authentication
, the default authentication method for MySQL 8. We’ll need to set up our database user with the mysql_native_password
authentication method in order to be able to connect to the MySQL database from PHP.
To get started, log in to the MySQL console as the root database user with:
To create a new database, run the following command from your MySQL console:
Now you can create a new user and grant them full privileges on the custom database you’ve just created. In this example, we’re creating a user named travellist_user with the password password
, though you should change this to a secure password of your choosing:
Now we need to give this user permission over the travellist
database:
This will give the travellist_user user full privileges over the travellist
database, while preventing this user from creating or modifying other databases on your server.
Following this, exit the MySQL shell:
You can now test if the new user has the proper permissions by logging in to the MySQL console again, this time using the custom user credentials:
Note the -p
flag in this command, which will prompt you for the password used when creating the travellist_user user. After logging in to the MySQL console, confirm that you have access to the travellist
database:
This will give you the following output:
Output+--------------------+
| Database |
+--------------------+
| information_schema |
| travellist |
+--------------------+
2 rows in set (0.01 sec)
Next, create a table named places
in the travellist
database. From the MySQL console, run the following statement:
Now, populate the places
table with some sample data:
To confirm that the data was successfully saved to your table, run:
You will see output similar to this:
Output+----+-----------+---------+
| id | name | visited |
+----+-----------+---------+
| 1 | Tokyo | 0 |
| 2 | Budapest | 1 |
| 3 | Nairobi | 0 |
| 4 | Berlin | 1 |
| 5 | Lisbon | 1 |
| 6 | Denver | 0 |
| 7 | Moscow | 0 |
| 8 | Oslo | 0 |
| 9 | Rio | 1 |
| 10 | Cincinnati| 0 |
| 11 | Helsinki | 0 |
+----+-----------+---------+
11 rows in set (0.00 sec)
After confirming that you have valid data in your test table, you can exit the MySQL console:
You’re now ready to create the application and configure it to connect to the new database.
Step 3 — Creating a New Laravel Application
You will now create a new Laravel application using the composer create-project
command. This Composer command is typically used to bootstrap new applications based on existing frameworks and content management systems.
Throughout this guide, we’ll use travellist
as an example application, but you are free to change this to something else. The travellist
application will display a list of locations pulled from a local MySQL server, intended to demonstrate Laravel’s basic configuration and confirm that you’re able to connect to the database.
First, go to your user’s home directory:
The following command will create a new travellist
directory containing a barebones Laravel application based on default settings:
You will see output similar to this:
OutputCreating a "laravel/laravel" project at "./travellist"
Installing laravel/laravel (v9.1.5)
- Installing laravel/laravel (v9.1.5): Extracting archive
Created project in /home/sammy/travellist
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
. . .
Package manifest generated successfully.
78 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag [laravel-assets].
Publishing complete.
> @php artisan key:generate --ansi
Application key set successfully.
. . .
When the installation is finished, access the application’s directory and run Laravel’s artisan
command to verify that all components were successfully installed:
You’ll see output similar to this:
OutputLaravel Framework 9.8.1
Usage:
command [options] [arguments]
Options:
-h, --help Display help for the given command. When no command is given display help for the list command
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output
-n, --no-interaction Do not ask any interactive question
--env[=ENV] The environment the command should run under
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
. . .
This output confirms that the application files are in place, and the Laravel command-line tools are working as expected. However, we still need to configure the application to set up the database and a few other details.
Step 4 — Configuring Laravel
The Laravel configuration files are located in a directory called config
, inside the application’s root directory. Additionally, when you install Laravel with Composer, it creates an environment file. This file contains settings that are specific to the current environment the application is running, and will take precedence over the values set in regular configuration files located at the config
directory. Each installation on a new environment requires a tailored environment file to define things such as database connection settings, debug options, application URL, among other items that may vary depending on which environment the application is running.
Warning: The environment configuration file contains sensitive information about your server, including database credentials and security keys. For that reason, you should never share this file publicly.
We’ll now edit the .env
file to customize the configuration options for the current application environment.
Open the .env
file using your command line editor of choice. Here we’ll use nano
:
Even though there are many configuration variables in this file, you don’t need to set up all of them now. The following list contains an overview of the variables that require immediate attention:
APP_NAME
: Application name, used for notifications and messages.APP_ENV
: Current application environment.APP_KEY
: Used for generating salts and hashes, this unique key is automatically created when installing Laravel via Composer, so you don’t need to change it.APP_DEBUG
: Whether or not to show debug information at client side.APP_URL
: Base URL for the application, used for generating application links.DB_DATABASE
: Database name.DB_USERNAME
: Username to connect to the database.DB_PASSWORD
: Password to connect to the database.
By default, these values are configured for a local development environment that uses Homestead, a prepackaged Vagrant box provided by Laravel. We’ll change these values to reflect the current environment settings of our example application.
In case you are installing Laravel in a development or testing environment, you can leave the APP_DEBUG
option enabled, as this will give you important debug information while testing the application from a browser. The APP_ENV
variable should be set to development
or testing
in this case.
In case you are installing Laravel in a production environment, you should disable the APP_DEBUG
option, because it shows to the final user sensitive information about your application. The APP_ENV
in this case should be set to production
.
The following .env
file sets up our example application for development:
Note: The APP_KEY
variable contains a unique key that was auto generated when you installed Laravel via Composer. You don’t need to change this value. If you want to generate a new secure key, you can use the php artisan key:generate
command.
APP_NAME=TravelList
APP_ENV=development
APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
APP_DEBUG=true
APP_URL=http://domain_or_IP
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
. . .
Adjust your variables accordingly. When you are done editing, save and close the file to keep your changes. If you’re using nano
, you can do that with CTRL+X
, then Y
and Enter
to confirm.
Your Laravel application is now set up, but we still need to configure the web server in order to be able to access it from a browser. In the next step, we’ll configure Nginx to serve your Laravel application.
Step 5 — Setting Up Nginx
We have installed Laravel on a local folder of your remote user’s home directory, and while this works well for local development environments, it’s not a recommended practice for web servers that are open to the public internet. We’ll move the application folder to /var/www
, which is the usual location for web applications running on Nginx.
First, use the mv
command to move the application folder with all its contents to /var/www/travellist
:
Now we need to give the web server user write access to the storage
and cache
folders, where Laravel stores application-generated files:
The application files are now in order, but we still need to configure Nginx to serve the content. To do this, we’ll create a new virtual host configuration file at /etc/nginx/sites-available
:
The following configuration file contains the recommended settings for Laravel applications on Nginx:
server {
listen 80;
server_name server_domain_or_IP;
root /var/www/travellist/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Copy this content to your /etc/nginx/sites-available/travellist
file and, if necessary, adjust the highlighted values to align with your own configuration. Save and close the file when you’re done editing.
To activate the new virtual host configuration file, create a symbolic link to travellist
in sites-enabled
:
Note: If you have another virtual host file that was previously configured for the same server_name
used in the travellist
virtual host, you might need to deactivate the old configuration by removing the corresponding symbolic link inside /etc/nginx/sites-enabled/
.
To confirm that the configuration doesn’t contain any syntax errors, you can use:
You should see output like this:
To apply the changes, reload Nginx with:
Now go to your browser and access the application using the server’s domain name or IP address, as defined by the server_name
directive in your configuration file:
http://server_domain_or_IP
You will see a page like this:
That confirms your Nginx server is properly configured to serve Laravel. From this point, you can start building up your application on top of the skeleton provided by the default installation.
In the next step, we’ll modify the application’s main route to query for data in the database using Laravel’s DB
facade.
Step 6 — Customizing the Main Page
Assuming you’ve followed all the steps in this guide so far, you should have a working Laravel application and a database table named places
containing some sample data.
We’ll now edit the main application route to query for the database and return the contents to the application’s view.
Open the main route file, routes/web.php
:
This file comes by default with the following content:
Routes are defined within this file using the static method Route::get
, which receives a path and a callback function as arguments.
The following code replaces the main route callback function. It makes 2 queries to the database using the visited
flag to filter results. It returns the results to a view named travellist
, which we’re going to create next. Copy this content to your routes/web.php
file, replacing the code that is already there:
Save and close the file when you’re done editing. We’ll now create the view that will render the database results to the user. Create a new view file inside resources/views
:
The following template creates two lists of places based on the variables visited
and togo
. Copy this content to your new view file:
Save and close the file when you’re done. Now go to your browser and reload the application. You’ll see a page like this:
You have now a functional Laravel application pulling contents from a MySQL database.
Tidak ada komentar:
Posting Komentar