This is a typical question you might ask in various projects on Raspberry Pi.
As I’m also a web developer, I make many web projects and I’m used to this, but I understand it can be overwhelming for some of you.
No worry, you’ll know everything at the end of this post 🙂
To install a full web server on Raspberry Pi (LAMP), three packages are required: Apache, PHP and MySQL.
Apache answer HTTP requests, PHP generate dynamic content and MySQL store and read information in a database.
In this post, I’ll show you how to install and configure them to work together.
I’ll also explain some extra tips depending on what you really need to do.
By the way, if you are really interested in improving your skills on Raspberry Pi, I highly recommend to check out my e-book here. It’s a 30-days challenge from beginner to master, with step-by-step tutorials and many projects to practice along the way.
How does it work?
Grab your free PDF file with all the commands you need to know on Raspberry Pi!
Before going deeper about the installation steps, I want to be sure that everyone understand what we are doing and how a web server works.

Apache
The main goal for the Apache service is to answer requests on HTTP and HTTPS ports of your Raspberry Pi.
HTTP and HTTPS are the main protocols on the Internet for web surfing
It works because Apache is here to respond to your browser requests on ports 80 and 443.
Apache receives a request on http://<RASPBERRYPI_IP> and has to display something, depending on your Apache configuration.
Typically, it’s an HTML page for your website or the app you’re using on the Raspberry Pi.
HTML is a language served by Apache and readable by your web browser to display web pages.
PHP
PHP is here to bring dynamic content to your web pages.
HTML is a static page language you can supercharge with PHP code to make your page look different depending on external conditions (visitor language, visitor history, time of the day, etc …).
Sale: 10% off today.
Take it to the next level.
I'm here to help you get started on Raspberry Pi.
Learn all the skills you need in the correct order.
Here’s what happens when a visitor sees your page:
- PHP compiles the PHP code in your page (via an Apache module)
- PHP generates a specific HTML code
- Apache always display static HTML code, but this time PHP generated it before
I’ll show you examples later in this post to better understand this part.
MySQL
MySQL is a way to manage a database on your web server, to store any data you need to keep on your site.
For example, on RaspberryTips, there is a database with all the posts, all the images links, all the comments, etc …
MySQL includes three parts:
- A server, to store data in files and answer requests
- A client, to connect the server locally or remotely
- A specific language (SQL), to grab the needed data precisely (from PHP for example)
How to install web server components?

At this point, you should understand what is each component (Apache, PHP and MySQL), and if you need it or not.
Maybe you want to create a basic and static web server, then Apache will be enough.
Or if you want dynamic pages but you don’t need to save data on the server, Apache and PHP will be enough.
I’ll let you make your choice and skip the unnecessary parts in the following procedures.
Before starting you need two prerequisites:
- Install Raspberry Pi OS on your Raspberry Pi if not done already
- Update your Raspberry Pi OS system to get the last version of each component:
sudo apt update
sudo apt upgrade
Install Apache
The first step is to install Apache on your Raspberry Pi.
To do this use apt like this:sudo apt install apache2
Then we’ll check if Apache is working:
- Find your Raspberry Pi IP address
- Open your web browser and go to http://<RASPBERRY IP>
For example, http://192.168.1.18 - Check that a page like this appear
As you can see in this page, web pages are located under /var/www/html on the Raspberry Pi.
You can edit index.html to change this page or add new pages in the same folder.
You can also remove this page and just upload the files you want to share in this folder.
For example, if you want to share files on your network, just remove the index.html and put your files in /var/www/html, Apache will automatically generate a web page with links to each one
Install PHP
Then we need to install PHP to add dynamic content capabilities to our web server.
Installation
To install PHP we need to add two packages:sudo apt install php libapache2-mod-php
Sale: 10% off today.
Download the eBook.
Uncover the secrets of the Raspberry Pi in a 30 days challenge.
Learn useful Linux skills and practice multiples projects.
The first one adds the core package for PHP and the possibility to run PHP scripts in the terminal.
The second allows us to add PHP code in web pages.
First PHP page
We’ll check if everything is fine with our installation before going further.
Follow these steps to create a PHP file and test it in your browser:
- Go to the Apache web folder:
cd /var/www/html
- Create a PHP file:
sudo nano test.php
- Copy this code into it:
<?php phpinfo(); ?>
This is a basic PHP function to display PHP configuration in the browser. - Save and Exit (CTRL+O, CTRL+X)
- Go to this URL with your web browser: http://<RASPBERRY IP>/test.php
- This should display something like this:
If you see this page, everything is OK, your Apache and PHP web server is ready.
Move to the next chapter if needed.
Install MySQL
The last component is MySQL, and again we need to install it with this command:sudo apt install mariadb-server php-mysql
The second package adds the possibility to use MySQL functions in PHP code.
You need to restart Apache to add this functionality:sudo service apache2 restart
Create your first MySQL user
MySQL stores data. Authentication is required to be sure that only allowed people can access these data.
For a quick start, we’ll create a MySQL super user to use in our PHP code later.
But you can create as many users as you want with different privileges:
- Log into the MySQL console:
sudo mysql
- Create your first database:
CREATE DATABASE test;
- Create the first user:
CREATE USER 'webuser' IDENTIFIED BY 'password';
Try to use a strong password immediately, you’ll forget to change it later 🙂 - Add all privileges to our test database to this user:
GRANT ALL PRIVILEGES ON test.* To 'webuser'@'localhost' IDENTIFIED BY 'password';
- Save the changes:
FLUSH PRIVILEGES;
- Quit the MySQL console:
quit
Create a first table in the database
Now we have a test database and a test user, we’ll check that everything works fine by creating a first table in the database to use it later in the PHP code.
If you’re new with these database words, imagine the database as an Excel spreadsheet and a table as a tab in this spreadsheet. We’ll store data in this table.
- Go back to the MySQL console, but with the “webuser” this time:
mysql -uwebuser -ppassword test
- Create a basic table:
CREATE TABLE IF NOT EXISTS test ( line_id INT AUTO_INCREMENT, data VARCHAR(255) NOT NULL, PRIMARY KEY (line_id) );
Obviously, this is a basic useless table, if you want to use anything else you can.
Press ENTER after pasting the request. - Insert one line in this new table:
INSERT INTO test (data) VALUES ("This is a test string in my database");
We add a first line in your table, with “test” in the data field.
Yes, I’m very creative with this 🙂 - Exit:
quit
Now we’re ready to move to the PHP code.
We have all we need (database, table and user).
First PHP script to connect to MySQL
Sale: 10% off today.
Get the eBook.
Do more with your Raspberry Pi, learn the useful concepts and take the shortcuts.
You miss half of the fun of using a Raspberry Pi if you don’t know anything about Python.
After all these preparation steps we can now check if PHP can speak with MySQL:
- Go to the Apache folder:
cd /var/www/html
- Create a new PHP file:
sudo nano test-mysql.php
- Paste these lines into it:
<?php
$link = mysqli_connect("127.0.0.1", "webuser", "password", "test");
if($link) {
$query = mysqli_query($link, "SELECT * FROM test");
while($array = mysqli_fetch_array($query)) {
echo $array['data']."<br />";
} }
else {
echo "MySQL error :".mysqli_error();
}
?>
You may need to edit the first line to fit your first user login and password. - Save and Exit (CTRL+O, CTRL+W)
- Switch to your web browser and check the URL: http://<RASPBERRY IP>/test-mysql.php
This should display the content of your database table.
Here we are, you know how to install a basic web server and create a first page to connect to MySQL and display something from your database.
Feel free to adapt the database and the PHP code to fit your needs.
Support me: Join the community on Patreon to show your support, get behind-the-scenes content and other awesome perks!
Extra tips
Grab your free PDF file with all the commands you need to know on Raspberry Pi!
I’ll give you here two tips to improve your web server or to make it easier to manage.
PHPMyAdmin
Previously in this post, we made all the changes in the MySQL database manually, doing requests to create users, grant access or insert data.
But there is a popular tool to do this faster and intuitively: PHPMyAdmin.
It’s a free tool, providing a web interface to manage your MySQL server.
To install PHPMyAdmin, follow these steps:
- Install the package with apt:
sudo apt install phpmyadmin
- During the installation process, select these options:
- Select Apache2 (press space and enter)
- Configure the database for PHPMyAdmin with db-common: No
- After the installation, go to http://<RASPBERRY IP>/phpmyadmin
- Log in with the user created before
- You’ll find our database in the menu, with the table inside and the data on the right
Something like this: - You’ll also find intuitive menu to do everything within your database
Virtual Hosts
If you want to host several websites or apps in your Raspberry Pi, you have two choices:
- Use one folder for each app, like http://192.168.1.1/app1 and http://192.168.1.1/app2
- Use virtual hosts to have an address like http://app1.domain.com and http://app2.domain.com
For the first option, just create as many folders as your need in /var/www/html
For the second one, you need to:
- Add sub-domains in your DNS server or in your hosts file
- Create virtual hosts in the apache configuration, one for each sub-domain
You can make this configuration in the /etc/apache2/sites-enabled/ folder
You’ll find all the help you need on this page for example
Conclusion
I hope this article will help you to install a basic web server on your Raspberry Pi.
I think this is rather a beginner how-to guide, and I could write a lot more on this topic.
If you are interested, I’ll create other posts on Apache/PHP/MySQL to help you master these main services on Linux.
This post was clear and precise every steps of the way. I was able to set things up nicely on my pi and i am now working on putting together my site. Thank you, this was very helpful!
Hi,
Thanks for your support!
Dear:
When installing php-mysql this message appear: unable to locate php-mysql.
Do you know what can i do?
Thank you very much!
Hi Herman,
Seems to work on my side
Try to use “apt search php-mysql” to see if there is a small change in the package name
I know on Debian it’s php5-mysql or php7-mysql, but on Raspbian it seems to be simply php-mysql
Let me know
hey there . I have an important Question if you could give me an answer on how to execute it .
I am implementing a project based on Atrial Fibrillation using rasspi .
Our code in rasspi generates a excel(Csv) file when a user puts on a ppg (heart) sensor. Now the question remains that how could we upload the excel sheet on myphp admin . I just want that csv file to be uploaded to the database in the same way as it generates the file automatically .
Can you help me out please.
Hello,
Yes, you can import it
Create a table with the same columns
Then go to PHPMyAdmn, in the “Import” tab
You just need to have the same fields in your table and your Excel file
Maybe it’s easier if you save your Excel file in CSV before importing
Hello Patrick
I have been trying my hand at Linux for a few years now and am almost self taught. I still consider myself a beginner as there is so much to learn in the “Linux/RPi” world (and so little time!). I recently got myself a RPi4 after having decided finally to wane away from the ‘windows’ universe and have been using it more instead of the Win10 Laptop I have. While this article is a great guide for a web server for dynamic content, please correct me if I dare to say that the setup for static site would be different?? Is there a similar article you have done for setting up a web server for only static sites?? ( say if one uses static site generators like Zola or Hugo to generate webpages and publishes them on the internet using a web server setup on RPi). If yes please could you suggest the URL and if no then would you please consider writing an article on the same lines such as this. Take Care and Thank you.
Hi,
I don’t have much experience with static sites (for me, I would probably install Apache only and do it directly in HTML).
I think Nginx is also a good option for static sites. I never tried Zola and Hugo, so I can’t tell you.
It seems there is a snap available, maybe you can start there: https://snapcraft.io/install/zola/raspbian