Ultimate Guide to Setting Up a Web Development Environment on Linux Ubuntu 24 LTS

OlgunOlgun
6 min read

Last week, I encountered issues with my existing Ubuntu setup. It was slow and lagging, and I couldn't resolve the problem. Then, I remembered that my laptop had two operating systems installed: Windows and Linux on separate partitions. Suspecting a bug in CrowdStrike, I checked the Windows partition but realized I hadn't used Windows in a long time and didn't need it.

Since I was having problems with my Ubuntu setup, I decided to download the latest version of Ubuntu from the official website. I created a bootable flash disk, backed up my important files, and restarted my laptop. I deleted all partitions for a clean install and installed Ubuntu 24 LTS.

It had been a long time since I set up my web development environment from scratch, so I decided to document the process.

You can find the entire setup process below:

Requirements for Web Development with PHP, Nginx, and MySQL

  • Latest PHP (8.3 at the time of writing this)

  • Composer (to install PHP dependencies)

  • Nginx

  • MySQL

  • NodeJS (to install NPM packages)

  • PNPM (I decided to use this for my new setup)

  • Git Client

Before installation

I always update my OS before installing anything to ensure all dependencies are up-to-date. Here are the commands I used:

sudo apt update # Update OS packages
sudo apt upgrade # Upgrade OS packages if any needed
sudo apt autoremove # Remove any unnecessary packages
sudo apt autoclean # Clean any broken, or already removed packages

Install PHP

It's straightforward to install PHP on Ubuntu. The following command installs PHP and the required extensions:

Since current up to date PHP version is 8.3, it will install it and all dependencies automatically.

We also need unzip and curl extensions since we will download something from internet, unzip it to install.

sudo apt install php-cli unzip curl

Install Composer

Composer is a package management tool for PHP and we can install all dependent packages with it easily without spending a lots of time.

So, I decided to install it globally to my system thus I don't need to run it with root user which is not suggested by composer itself too.

First of all I needed to download it, so I run following command.

curl -sS https://getcomposer.org/installer -o composer-setup.php

Then, I needed to verify if downloaded setup file is correct one so I run following commands to verify it which is also officially documented in the composer's website.

HASH=`curl -sS https://composer.github.io/installer.sig`
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

After I've been sure that it's valid file, I run following command to install it globally so every user in the system can use it, not only root.

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Installation done, and I just check if it's really works with my normal user by running following command. Of course I had to open a new terminal otherwise it doesn't work :)

composer --version

Install Nginx

I really like the simplicity and event-driven architecture of Nginx so, I prefer it over Apache to run my PHP projects.

Event-driven architecture makes it much performant reverse-proxy than Apache and you can feel the advantages of it on big projects.

I run following command to install it on my machine.

sudo apt install nginx

After installation completed I run following commands to make sure it's running.

Also following enable command make it as systemd program so whenever computer is restarted nginx automatically starts to run.

sudo systemctl start nginx
sudo systemctl enable nginx # enables it to run as default program

Install MySQL

MySQL is always my go to database whenever I start new project however nowadays I am thinking to go with SQLite as a first-hand database.

But, I'll be think about that on other projects :)

To install MySQL I run following command.

sudo apt install mysql-server

After it's installed I needed to put a password for my root user in database, so I run following command to do that.

It asks many easy to followup questions and I fill them up according to my setup however you can select the ones most fits you.

sudo mysql_secure_installation

Sometimes that doesn't work enough, and I always try to change password after I connect to database as a root Linux user, so I run following command to connect it.

sudo mysql

After I connected to the MySQL database via terminal, I run following commands to change the root user password.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'my_lovely_password';
FLUSH PRIVILEGES;

At this point, MySQL is running and I changed the password of root user for database so I could go to next step to install NodeJS which I'll be use alongside PHP.

Install NodeJS

It's actually becomes so much easier to install NodeJS than 2-3 years ago. So, I just run following commands to install it.

This commands are in the official documentation of NodeJS, so you can read about them at following link;

https://nodejs.org/en/download/package-manager

# installs nvm (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# download and install Node.js (you may need to restart the terminal)
nvm install 20

# verifies the right Node.js version is in the environment
node -v # should print `v20.15.1`

# verifies the right npm version is in the environment
npm -v # should print `10.7.0`

At this point in my Linux environment I've had NodeJS + NPM running but I decided to try something else instead of npm because I've seen that packages that I install with npm really takes a lot of size on my disk.

So, I found that pnpm works a little bit different than npm, which essentially installs all packages into the storage but if another project requires the same package then it doesn't install it again, instead uses symbolic link to run it through project.

So, I installed globally with following command.

npm install -g pnpm

And from now on, I started to use pnpm install command instead of npm install and I am really happy with that :)

I almost completed all setup, except git client which is very important for me because I really like to use GitHub and GitLab to keep different versions of my projects by creating different branches, making pull requests, writing good comments and pushing to my production server via single line of command git pull

So, I needed to install git.

Install Git Client

It's actually very straight forward to install git on Linux, I just had to run following command to install client.

sudo apt install git

Then I setup my global git user information with following commands.

git config --global user.name "Your Name"
git config --global user.email "you@example.com"

After that point, I just needed one more thing to install PHP-FPM.

I need to install it because Nginx requires PHP-FPM to load configuration files for the PHP projects.

Install PHP-FPM

I just run following command to install it.

sudo systemctl restart php8.3-fpm

That installed PHP-FPM for PHP8.3 however if you have different version of PHP on your computer you needed to install right version.

And finally I completed my setup :)

Follow Me :)

You can follow me on X/Twitter at; https://x.com/codewitholgun

Domains

I have some domains that I don't use anymore and want to sell them. You can find the domains list in following link.

List Here

You can reach out me If you interested with one.

0
Subscribe to my newsletter

Read articles from Olgun directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Olgun
Olgun

Software Engineer with over 8 years of experience and specialized in PHP, Laravel Framework, ReactJS, TailwindCSS, MySQL, and PostgreSQL.