-
How to set up MySQL for remote access on Ubuntu Server
Søn, 20 Okt 2024 12:50 How to set up MySQL for remote access on Ubuntu Server 16.04 | TechRepublic
Published February 15, 2017
If you need to allow remote connections to your MySQL server, see how you can easily accomplish that task.
If you work with MySQL, there will be instances in which you need to give remote access to the server.
Say, for example, you have servers set up specifically for database and web: Your web server hosts an instance of WordPress that needs to be able to access the remote MySQL server. Out of the box, Ubuntu Server does not allow this, so you have to manually configure MySQL to allow remote connections. The process is fairly simply, and you can even lock down that MySQL server so it is only reachable from specific users on specific IP addresses.
Let’s dig in and configure your MySQL server to accept remote connections. I’ll be working from a 16.04 instance of Ubuntu Server, but the process is quite similar on almost every Linux platform hosting MySQL.
SEE: Remote access policy (Tech Pro Research)
Step one: Allowing access
Out of the box, MySQL will only allow access from the localhost address 127.0.0.1. To change this, you need to open the /etc/mysql/mysql.conf.d/mysqld.cnf file and change the line:
bind-address = 127.0.0.1
to:
bind-address = 0.0.0.0
Save and close that file. Restart the MySQL server with the command:
systemctl restart mysql.service
Step two: Granting access to the user
Let’s say you have your WordPress server set up (running on IP address 192.168.1.100) to access a MySQL database named wordpressdb on the MySQL server with user wpadmin. On the MySQL server, you must grant access to the wordpressdb to that user from that IP address. Here’s how to grant the user access (I’m assuming you already created the user wpadmin on the MySQL server and given it password %u#098Tl3).
- Log in to the MySQL server.
- Log in to MySQL with the command mysql -u root -p
- Type the MySQL root user password.
- Issue the MySQL command:
GRANT ALL ON wordpressdb.* TO 'wpadmin'@'192.168.1.100' IDENTIFIED BY '%u#098Tl3' WITH GRANT OPTION;
- Flush the MySQL privileges with the command FLUSH PRIVILEGES;
- Exit out of the MySQL prompt with the command exit;
Your WordPress instance (set up with the proper user credentials for the database) should be able to use the remote MySQL server as its database host.
Congratulations! You successfully set up MySQL for remote connections.
Keep it secure
Although you can open MySQL for connections from remote servers, you should only grant privileges for select users to avoid possible security breaches. Also, be sure those users use very strong passwords. When you combine that with keeping your MySQL server up to date, you should be good to go.
Share Article
Also Read
- How to harden MySQL security with a single command
- How to back up MySQL databases from the command line in Linux
- How to install WordPress on Ubuntu 16.04
- How to automate database backups with backupninja
- More Linux on my new notebook: Fedora, Linux Mint and Ubuntu
Jack Wallen
Jack Wallen is an award-winning writer for TechRepublic, The New Stack, and Linux New Media. He's covered a variety of topics for over twenty years and is an avid promoter of open source. For more news about Jack Wallen, visit his website jackwallen.com.
-
LEMP på Ubuntu Server 22.04
Søn, 20 Okt 2024 12:35 How to Install a LEMP Stack on Ubuntu 22.04 |
Linode Docs
Many Ubuntu systems use the well-known LAMP Stack installation. However, many people consider the LEMP Stack to be an even better alternative. A LEMP stack uses the NGINX web server instead of Apache. This guide explains how to install and configure a LEMP stack on Ubuntu 22.04 LTS. It also provides some background about the LEMP stack and how it contrasts with a LAMP stack.
What is a LEMP Stack?
The Ubuntu LEMP stack serves as a substitute for the original LAMP Stack. Both stacks consist of the Linux operating system, a web server, a database, and a programming/scripting language. Both stacks allow users to host web applications and implement a fully-functional programming environment. Additionally, the main components of both the LAMP and LEMP stacks can be installed using the default Ubuntu software repository.
The original LAMP Stack includes Linux, Apache , MySQL , and PHP . The Ubuntu LEMP stack alternative continues to use Linux and PHP, but it includes the NGINX web server instead of Apache. In most cases, a LEMP stack uses the MariaDB database, although MySQL can also be used. In addition, other programming languages are sometimes used instead of PHP.
The LEMP stack consists of the following components:
- Linux: Linux is a free and open source operating system originally based on UNIX. Ubuntu is one of several different Linux implementations, which are known as distributions. Some of the other popular distributions include Debian, Red Hat, and Arch. Each distribution of Linux has its own software library, which is used to install other applications. All of the LEMP stack components are part of the standard Ubuntu library.
- NGINX Server: NGINX is one of the most popular open source web servers. NGINX is pronounced “Engine-x”. (This is why E is used for the LEMP stack acronym.) NGINX uses an event-driven architecture instead of Apache’s process/thread orientation. NGINX is faster and more efficient than Apache, but does not allow site-by-site configuration. It is not as widely deployed as Apache.
- Maria DB: MariaDB is a relational database management system (RDBMS) that is a fork of the MySQL application. It is an open source software application developed by the MariaDB Foundation and is available at no cost. Unlike MySQL, which is owned by Oracle, MariaDB more closely follows the open source philosophy. MariaDB is similar to MySQL and uses the same SQL commands and queries. However, MariaDB has more new features and is considered somewhat superior to MySQL in terms of performance and usability.
- PHP: The PHP language is used within the stack for server-side scripting and programming. PHP is frequently used to build websites because PHP code can be efficiently embedded within HTML files. Ubuntu interprets PHP code using a PHP processor. Users can install and use PHP software for free under the PHP License. In lieu of PHP, developers can opt to use Perl or Python instead. All three options work well with the rest of the LEMP stack. However, this guide focuses strictly on PHP.
Before You Begin
-
If you have not already done so, create a Linode account and Compute Instance. See our Getting Started with Linode and Creating a Compute Instance guides.
-
Follow our Setting Up and Securing a Compute Instance guide to update your system. You may also wish to set the timezone, configure your hostname, create a limited user account, and harden SSH access.
Note
This guide is written for a non-root user. Commands that require elevated privileges are prefixed with
sudo
. If you are not familiar with thesudo
command, see the Users and Groups guide.How to Install LEMP Stack on Ubuntu
This section explains how to install and configure the LEMP Stack on Ubuntu 22.04 LTS. However, the instructions for the Ubuntu 20.04 LTS release are very similar. The LEMP stack is not available through Tasksel, so the individual components must be installed separately.
Note
These instructions apply with or without a registered domain name. If the server is hosting a domain, a virtual host must be configured. For more information about domain names and how to point the domain to a Linode, consult the Linode DNS Manager guide .
The various LEMP stack components can be installed using the
apt
utility. To install the LEMP stack, follow these steps. In all cases, entery
to proceed with the installation when Ubuntu asks for confirmation.-
Use
apt
to update the Ubuntu packages.sudo apt update && sudo apt upgrade
-
Install the NGINX server.
-
Confirm NGINX is properly running using the
systemctl
utility.sudo systemctl status nginx
nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-05-16 16:07:47 UTC; 1h 12min ago
4. Install the MariaDB database.
sudo apt install mariadb-server
5. Install the PHP module for MariaDB/MySQL support. Note Do not install the main `php` module because it is optimized for Apache. PHP support for NGINX is installed later.
sudo apt install php-mysql
6. Install the PHP FastCGI Processing Manager. This includes all the PHP packets necessary for NGINX support, along with other core dependencies. 7. **(Optional)** Other applications, including WordPress, require additional PHP components. The following optional packages are frequently helpful.
sudo apt install php-curl php-gd php-mbstring php-xml php-xmlrpc
How to Configure a LEMP Stack on Ubuntu[](#how-to-configure-a-lemp-stack-on-ubuntu) ----------------------------------------------------------------------------------- At this point, all LEMP Stack components are installed, but the stack is not yet ready to use. The individual elements must be configured or enabled. Each component can immediately be configured after installation, but it’s usually easier to install all the applications first and configure them later. The following sections explain how to configure a LEMP stack on Ubuntu 22.04. ### Configuring the NGINX Web Server and Creating a Site Configuration File[](#configuring-the-nginx-web-server-and-creating-a-site-configuration-file) NGINX is easier to configure than some other web servers. However, the firewall settings must be configured to allow web access through both HTTP and HTTPS. Additionally, creating a site configuration file in NGINX is highly recommended, even if only one site is hosted on the server. If multiple sites are being hosted, a site configuration file is mandatory. To finish setting up NGINX, follow these steps. 1. Configure the `ufw` firewall so it accepts NGINX connections. Allow the `Nginx Full` profile, which permits both HTTP and HTTPS connections. Ensure `OpenSSH` connections are also allowed. Enable `ufw` when all changes are complete. Note The `Nginx Full` profile allows both HTTP and HTTPS traffic. To temporarily limit firewall access to HTTP requests, allow the `Nginx HTTP` profile instead. The `Nginx HTTPS` setting limits firewall access to HTTPS traffic only. You must configure HTTPS on the server before applying this profile.
sudo ufw allow OpenSSH sudo ufw allow in "Nginx Full" sudo ufw enable
2. Verify the firewall settings using the `ufw status` command.
Status: active
To Action From
OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
3. After configuring the firewall, ensure NGINX allows web access. Using a browser, visit the IP address of the web server. The site displays the default NGINX welcome page. The page includes the message “Welcome to nginx!”
Note To determine the IP address of the Ubuntu system, use the Linode Dashboard. ![NGINX Welcome Page](https://www.linode.com/docs/guides/how-to-install-a-lemp-stack-on-ubuntu-22-04/NGINX-Welcome-Page.png "NGINX Welcome Page") 4. Create a root `public_html` directory for the site. Create this directory within the `/var/www/html/domain_name` directory, where `domain_name` is the name of the site. In the following command, replace `example.com` with the actual name of the domain.
sudo mkdir -p /var/www/html/example.com/public_html
5. It is simpler to base the site configuration file on the default NGINX welcome page. Copy over the default NGINX configuration file to `/etc/nginx/sites-available/example.com.conf`. Replace `example.com` with the name of the domain. The new configuration file must be named after the domain and have the `.conf` extension.
sudo cp /etc/nginx/sites-enabled/default /etc/nginx/sites-available/example.com.conf
6. Edit the `.conf` file for the domain, making the following changes. A line-by-line description is as follows: * Delete the existing uncommented `server` configuration all the way to the line `Virtual Host configuration for example.com`. Change the name of the comment to reflect the name of the domain. Uncomment the remaining lines. All further changes occur inside the remaining code block beginning with `server`. * Leave the `listen` configuration in place. These lines tell NGINX to listen for incoming connections on port `80`. * Change the value for `server_name` to the name of the domain. Enter the domain name with and without the `www` prefix so visitors can use either alternative. * Set `root` to the name of the newly-created root directory for the domain. For `example.com`, this is `/var/www/html/example.com/public_html`. * For most sites, the value of `index` should be `index.html`. However, for WordPress and other sites that use PHP, it must be changed to `index.php`. * The block starting with `location /` should remain unchanged. The `try_files` configuration instructs NGINX to verify the requested file actually exists before processing the request. If the file does not exist, NGINX returns a `404` error. * Add a code block for `location ~* \.php$`. NGINX applies this configuration to all domain files with the `php` extension. The `*` symbol indicates PHP file names are not case sensitive. * Change the name of `fastcgi_pass` to indicate the socket where PHP should listen to new requests. This is found at `unix:/run/php/php<release_num>-fpm.sock`, where `release_num` is the PHP release number. For instance, if PHP release `8.1` is installed, `fastcgi_pass` should be `unix:/run/php/php8.1-fpm.sock`. To determine the PHP release, use the command `php -v`. * Set the `include` directive to `snippets/fastcgi-php.conf`. This is the name of the configuration file that handles PHP processing. * Add a `location` block for `~ /\.ht`. This tells NGINX not to serve any `.htaccess` files. Here is an example of a domain configuration file. Replace `example.com` with the name of the actual domain wherever it occurs. File: /etc/nginx/sites-available/example.com.conf 7. To enable the site, create a link to the domain configuration file from the `sites-enabled` directory. In the following command, replace `example.com` with the name of the domain.
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
8. **(Optional)** For enhanced security, unlink the default site.
sudo unlink /etc/nginx/sites-enabled/default
9. Validate the changes using the `nginx -t` command. If the test command finds any errors, inspect the new file and make any necessary adjustments.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Product documentation about NGINX can be found on the [NGINX Docs page](https://docs.nginx.com/) . ### Configuring the MariaDB Database[](#configuring-the-mariadb-database) The MariaDB database is ready to use. However, a new database user has to be created for the web application. It is also important to tighten application security. To finish configuring MariaDB, follow these steps. 1. Log in to the MariaDB shell as the `root` user. The application displays the `MariaDB` prompt.
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 31 Server version: 10.6.7-MariaDB-2ubuntu1 Ubuntu 22.04 ... MariaDB [(none)]
2. Create the `webdata` database. 3. Use the `CREATE USER` command to add a new “web application” user. Provide a more secure user name and password in place of `webuser` and `password` in the query.
CREATE USER 'webuser' IDENTIFIED BY 'password';
4. Grant full rights to the new user. MariaDB should respond with `Query OK` after each line. Use the following SQL commands to configure the database.
GRANT ALL ON webdata.* TO 'webuser';
5. Exit the database shell. 6. Use the built-in [mysql\_secure\_installation](https://mariadb.com/kb/en/mysql_secure_installation/) tool to increase the security of the database.
sudo mysql_secure_installation
7. It is not necessary to switch over to Unix socket authentication. It is also not necessary to change the root password, and it is safe to leave this field blank when prompted. However, answer `Y` to the following questions: * `Remove anonymous users?` * `Disallow root login remotely?` * `Remove test database and access to it?` * `Reload privilege tables now?` For further information about MariaDB, consult the [MariaDB Server Documentation](https://mariadb.com/kb/en/documentation/) . Configuring PHP[](#configuring-php) ----------------------------------- PHP does not require any further configuration. However, an extra security measure should be applied. The following command ensures PHP only accepts requests for files that actually exist on the server. Otherwise, it can be tricked into executing malicious code. In the following command, use the socket for the installed release of PHP. This example demonstrates how to apply the configuration for PHP 8.1. If another release of PHP is installed, replace `8.1` with the actual release number.
sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/8.1/fpm/php.ini
For more reference material on how to use PHP, consult the [PHP Documentation Site](https://www.php.net/docs.php) . Testing the LEMP Stack Installation on the Ubuntu Server[](#testing-the-lemp-stack-installation-on-the-ubuntu-server) --------------------------------------------------------------------------------------------------------------------- In addition to verifying the web server works properly, it is critical to test the virtual host configuration, PHP integration, and the MariaDB database. This is the only way to confirm all components can interact together. The easiest way to verify an Ubuntu LEMP stack installation is with a short test script. This script must be placed somewhere within the `DirectoryRoot` directory. The PHP test code must initiate a connection to MariaDB using the `mysqli_connect` function. Use the username and the password for the account created in the **Configuring the MySQL Database** section. If the connection is successful, the function returns a `Connection` object. The script provides information about the status of the connection attempt along with details about any failures. To validate the installation, follow these steps. 1. Restart the `PHP` module. The name of the module consists of `php`, the major and minor release of PHP, and `-fpm`. The following command starts the PHP 8.1 module. Replace `8.1` with the release number of the local PHP installation.
sudo systemctl restart php8.1-fpm
2. Reload NGINX to apply the changes. 3. Confirm NGINX is still running properly using `systemctl status`.
sudo systemctl status nginx
nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-05-16 16:07:47 UTC; 1 day 20h ago
Note If NGINX has failed or is `dead`, use the `sudo nginx -t` command to find configuration errors. 4. Create a test file named `phptest.php` in the `public_html` directory for the domain. Set `servername` to `localhost` and ensure the `username` and `password` match the authentication details for the MariaDB web user account. File: /var/www/html/example.com/public\_html/phptest.php 5. Execute the test script using a web browser. In the address bar, enter the domain name followed by `/phptest.php`. In the following example, substitute the actual name of the domain for `example.com`.
http://example.com/phptest.php
6. If everything is installed correctly, the browser should display the text `Welcome to the Site!` and `Connected successfully`. If you see the `Connection Failed:` message, review the SQL error information to debug the problem. See the **Troubleshooting** section for more information. ![Results of Test Script](https://www.linode.com/docs/guides/how-to-install-a-lemp-stack-on-ubuntu-22-04/Test-Script-Result.png "Results of Test Script") 7. **(Optional)** Alternatively, `curl` can be used to test the script. This method can be used if the DNS entry for the domain has not propagated yet. Replace `example.com` with the name of the domain, and `server-ip-address` with the IP address of the Linode. The output is formatted as HTML code, but it is reasonably easy to determine the outcome.
curl -H "Host: example.com" http://
/phptest.php PHP Test Welcome to the Site!
Connected successfully
8. When testing is complete, remove the test script.
sudo rm /var/www/html/example.com/public_html/phptest.php
Troubleshooting the Ubuntu LEMP Stack Installation[](#troubleshooting-the-ubuntu-lemp-stack-installation) --------------------------------------------------------------------------------------------------------- It is not uncommon to have issues with a new Ubuntu LEMP Stack installation. It is easy to overlook a command or make a mistake with a configuration file. Keep testing as you proceed to quickly find any errors. For instance, visit the IP address of the Ubuntu system immediately after configuring and enabling NGINX. Here are a few things to consider if the LEMP Stack test script does not work. * **Verify NGINX is running**: NGINX might have failed upon a reload or configuration change. Confirm the web server is `active` and restart it if necessary.
sudo systemctl status nginx
sudo systemctl restart nginx
* **Confirm name of the domain and IP address of the server**: If the browser times out, it could be due to an incorrect address or domain name. Confirm and test the IP address first, then visit the domain name. Ensure a DNS record for the domain has been created. The record can take up to one full day to propagate, so try using `curl` in this case. * **Confirm the MariaDB configuration**: A database and database user must be created in MariaDB. Ensure the `webdata` database exists and the web user is granted all database rights. * **Review all configuration files**: A common source of errors is incorrect information in the `/etc/nginx/sites-available/example.com.conf` file. Ensure the domain specified for the `server_name` is spelled correctly and the `root` matches the root directory for the site. Verify the `location` block for `\.php` is configured and the `fastcgi_pass` variable is correct. * **Verify the test script is in the proper directory**: PHP has been configured to reject requests for non-existent files. So if the test script is in a different location or has a different name, NGINX should return an error. * **Confirm the username and password in the test script**: The connection to the database can fail due to a wrong server name, password, or user ID. Look for missing or incorrect information in the script. * **Review all installation instructions**: It is easy to overlook an important step. Missing PHP modules often cause confusing failures. A Summary of How to Install a LEMP Stack on Ubuntu[](#a-summary-of-how-to-install-a-lemp-stack-on-ubuntu) --------------------------------------------------------------------------------------------------------- The Ubuntu LEMP Stack includes the operating system, NGINX web server, MariaDB relational database, and the PHP programming language. A server configured with these free and open source applications can host a modern website and support a rich programming environment. The LEMP stack elements are easy to install and work well together with little extra configuration. After configuring the LEMP stack on Ubuntu, it is good practice to create an NGINX configuration file for the domain. Create a new database and user account on MariaDB for the website to use and install additional PHP packages for full integration. Test the new installation using a short PHP test script that connects to the database. For more information about each LEMP Stack component, see the **More Information** section for this guide. More Information ---------------- You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials. * [Ubuntu Documentation](https://ubuntu.com/server) * [PHP Website](https://www.php.net/) * [PHP Documentation](https://www.php.net/docs.php) * [MariaDB Website](https://mariadb.org/) * [MariaDB mysql\_secure\_installation documentation](https://mariadb.com/kb/en/mysql_secure_installation/) * [MariaDB Server Documentation](https://mariadb.com/kb/en/documentation/) * [NGINX Website](https://www.nginx.com/) * [NGINX Docs page](https://docs.nginx.com/) This page was originally published on May 13, 2022.
-
LAMP på Ubuntu Server 22.04
Søn, 20 Okt 2024 12:33 How to Install a LAMP Stack on Ubuntu 22.04 |
Linode Docs
The LAMP Stack includes an operating system, web server, programming language, and database. These applications are collectively able to implement web applications and other computing solutions. This guide provides some background about the LAMP stack and explains how to install and configure it on Ubuntu 22.04 LTS. It also explains how to quickly test interactions between the applications.
What is a LAMP Stack?
The LAMP Stack is an acronym for Linux, Apache , MySQL , and PHP . It includes an operating system, a web server, a database, and a versatile programming language. All components are available through the default Ubuntu software repositories.
The LAMP Stack is sufficient to host web applications and implement a modern computing environment. Many other Ubuntu applications rely on some or all of these programs. In some cases, substitutions to the LAMP stack can be made. For example, the NGINX web server can be used instead of Apache. Each component has a role within the software stack.
- Linux: Linux is an operating system based on UNIX. Linux is available for free as open source technology. There are several distinct implementations of Linux, which are known as distributions. Ubuntu is one of the most popular distributions. Other alternatives include Debian, Red Hat, Arch, and many, many others. Each distribution of Linux is associated with a software library. This library is used to install other software, including the other LAMP stack components.
- Apache HTTP Server: Apache is the most common web server for Ubuntu and throughout the public internet. The Apache Software Foundation develops and releases Apache as free and open source software. The standard version of Apache includes all components required to host a web site. However, extra modules can be used to add features including authentication and programming language APIs.
- MySQL: MySQL is a relational database management system (RDBMS). Although owned by Oracle, MySQL is free. Its source code is available under the GNU General Public License. MariaDB or PostgreSQL sometimes replace MySQL in the stack.
- PHP: PHP is the server-side scripting and programming language used in the stack. It is commonly used in web development and is firmly integrated with the rest of the stack. An Ubuntu system interprets PHP code using a PHP processor. PHP commands can be efficiently embedded within an HTML page. PHP software is available for free under the PHP License. Alternatives to PHP include Perl and Python, which can also serve as the P in the LAMP stack.
Before You Begin
-
If you have not already done so, create a Linode account and Compute Instance. See our Getting Started with Linode and Creating a Compute Instance guides.
-
Follow our Setting Up and Securing a Compute Instance guide to update your system. You may also wish to set the timezone, configure your hostname, create a limited user account, and harden SSH access.
Note
This guide is written for a non-root user. Commands that require elevated privileges are prefixed with
sudo
. If you are not familiar with thesudo
command, see the Users and Groups guide.Installing a LAMP Stack on Ubuntu
This section explains how to install a LAMP Stack on Ubuntu 22.04 LTS. These instructions are also generally valid for Ubuntu 20.04 LTS.
Note
These instructions are valid with or without a registered domain name. If a domain name maps to the IP address of the server, a virtual host should also be configured. For information on domain names and pointing the domain name to a Linode, see the Linode DNS Manager guide .
To install the LAMP stack on Ubuntu 22.04 LTS, follow these steps. In all cases, enter
y
to proceed with the installation when asked for confirmation.-
Using
apt
, update the Ubuntu packages:sudo apt update && sudo apt upgrade
-
Install the Apache web server using
apt
: -
Install the MySQL web server:
sudo apt install mysql-server
-
Install PHP, along with additional PHP modules for Apache and MySQL:
sudo apt install php libapache2-mod-php php-mysql
-
(Optional) Install the following commonly-used PHP modules. These packages add PHP support for cURL, JavaScript Object Notation (JSON), and the Common Gateway Interface (CGI).
sudo apt install php-curl php-json php-cgi
-
(Optional) To host a WordPress site on the server, install the following PHP components:
sudo apt install php-curl php-gd php-mbstring php-xml php-xmlrpc
How to Configure the LAMP Stack for Ubuntu 22.04
At this point, all LAMP Stack components are installed, but the stack is not yet ready to use. The individual elements must be configured or enabled. Each component can immediately be configured when it is installed, but it is usually easier to install the applications first and then configure them later. The following sections explain how to configure a LAMP stack on Ubuntu 22.04.
Configuring the Apache Web Server
-
Adjust the default Apache keepalive settings to allow the server to better conserve memory. The
KeepAlive
setting should be set toOn
. This allows Apache to reuse connections. WhenKeepAlive
is enabled,MaxKeepAliveRequests
andKeepAliveTimeouts
should also be configured. Edit theapache2.conf
file and make the following changes.Note
MaxKeepAliveRequests
limits the number of requests for each persistent connection.KeepAliveTimeouts
determines how long the server waits for new requests from a connection. The following sample configuration balances performance and memory utilization. These values are a good starting point for a new installation. However, it is a good idea to test different values to determine the optimal settings.File: /etc/apache2/apache2.conf
-
Change the default multi-processing module settings within the prefork module. Edit the
/etc/apache2/mods-available/mpm_prefork.conf
file to reflect the following changes.Note
The following values are optimized for a 2GB Linode. Systems with more capacity can handle more aggressive settings.
File: /etc/apache2/mods-available/mpm_prefork.conf
-
Using the console, configure
ufw
to allow theApache Full
profile. This setting permits HTTP and HTTPS connections through the firewall, enabling web access. EnsureOpenSSH
connections are also allowed. Enableufw
when all changes are complete.Note
The
Apache Full
profile allows both HTTP and HTTPS traffic. To temporarily limit firewall access to HTTP requests during configuration, use theApache
profile instead. TheApache Secure
profile only allows encrypted HTTPS traffic through the firewall. Do not use this profile until HTTPS is enabled on the server.sudo ufw allow OpenSSH sudo ufw allow in "Apache Full" sudo ufw enable
-
Verify the firewall settings using the
ufw status
command:Status: active
To Action From
OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6)
5. Disable the `mpm_event` module and enable the `mpm_prefork` module using the `a2dismod` and `a2enmod` commands. Depending on the installation, these settings might already be configured.
sudo a2dismod mpm_event sudo a2enmod mpm_prefork
6. Restart Apache using the `systemctl` utility:
sudo systemctl restart apache2
7. Ensure Apache is still `active` after the restart:
sudo systemctl status apache2
apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese> Active: active (running) since Wed 2022-05-11 10:45:23 UTC; 6s ago
8. Apache is now ready to respond to incoming requests. To verify the server is working properly, visit the IP address of the web server using a web browser. The browser should display the default Ubuntu/Apache2 welcome page. The page includes the message “It works” and some basic information about the installation. Note Use the Linode Dashboard to find the IP address for your Ubuntu system. ![Apache Welcome Page](https://www.linode.com/docs/guides/how-to-install-a-lamp-stack-on-ubuntu-22-04/Apache-Welcome-Page.png "Apache Welcome Page") For more information about configuring the Apache HTTP Server, see the [Apache Documentation](https://httpd.apache.org/docs/2.4/) . ### Configuring a Virtual Host for Your Domain on Apache[](#configuring-a-virtual-host-for-your-domain-on-apache) A virtual host should be configured for the domain, even if the server is only hosting one site. A virtual host collects the domain details in one place. It also makes it easier to modify the site or add more domains in the future. Apache creates a default virtual host file in the `var/www/html` directory when it is installed. Leave this file in place and create a new virtual host for the domain in the same directory. If the server is hosting multiple sites, a separate virtual host must be configured for each domain. To configure a virtual host, follow these steps. Replace `example.com` with the actual domain name wherever it occurs. 1. It is easiest to use the default file as a basis for the new virtual host. Copy the default Apache configuration file to `/etc/apache2/sites-available/example.com.conf`. The new configuration file must have the same name as the domain and have the `.conf` extension.
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
2. Add the following changes to the `.conf` file. Replace `example.com` with the actual name of the domain. * Uncomment the `ServerName` field and add the name of the domain. * Add a `ServerAlias` This must be set to the domain name preceded with `www.`. This allows users to access the site with or without the `www` prefix. * Edit the `DocumentRoot`, `ErrorLog`, and `CustomLog` fields so they point to the directory associated with the new domain. The `DocumentRoot` must be set to `/var/www/html/yourdomainname/public_html`. File: /etc/apache2/sites-available/example.com.conf 3. Create the `public_html` and `logs` directories for the domain. Ensure there is no space between `public_html` and `logs`. The two entries must be separated with a comma.
sudo mkdir -p /var/www/html/example.com/{public_html,logs}
4. Change the owner of the `public_html` to `www-data`:
sudo chown -R www-data:www-data /var/www/html/example.com/public_html
5. Set the directory permissions for the `public_html` directory:
sudo chmod -R 755 /var/www/html/example.com/public_html
6. Use `a2ensite` to link the virtual hosts file and enable the site:
sudo a2ensite example.com
Enabling site example.com
7. **(Optional)** As a security precaution, disable the default site:
sudo a2dissite 000-default.conf
8. Reload Apache to apply all the changes: Note If Apache fails to reload, validate the syntax of the configuration files. Use the command `sudo apache2ctl configtest` to find any potential errors in the `.conf` file. Ensure the name of the virtual host matches the domain name being used.
sudo systemctl reload apache2
9. Verify whether the domain is accessible. The DNS record for the domain must already resolve to the Linode. Visit the domain using a browser, entering the domain name in the address bar. The contents of the `DocumentRoot` directory for the domain should be visible. No files have been added to the directory yet, so the browser displays an empty index page that does not have any files or directories. ![Home Directory for Domain](https://www.linode.com/docs/guides/how-to-install-a-lamp-stack-on-ubuntu-22-04/Domain-Name-Empty.png "Home Directory for Domain") ### Configuring the MySQL Database[](#configuring-the-mysql-database) The MySQL database is ready to use as soon as it is installed. However, it is necessary to create a database user for the web application and increase application security. To finish configuring MySQL, follow these steps. 1. Log in to the MySQL shell as the `root` user. The application displays the `mysql>` prompt.
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.29-0ubuntu0.22.04.2 (Ubuntu) ... Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2. From the MySQL shell, create the `webdata` database. Create a new user account for web application access. Provide an actual user name and password in place of `webuser` and `password` in the `CREATE USER` query. Grant full rights to the user. MySQL should respond with `Query OK` after each line.
CREATE DATABASE webdata; CREATE USER 'webuser' IDENTIFIED BY 'password'; GRANT ALL ON webdata.* TO 'webuser';
3. Exit the SQL shell: 4. The latest release of MySQL requires a root password before `mysql_secure_installation` can be used. Enter the SQL shell again using `sudo mysql` but do not provide a user. 5. Set a password for `root'@'localhost`. Use an actual secure password instead of `password`.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'password';
6. Exit the SQL shell: Note To log in to the MySQL shell as `root` after this change, use `mysql -u root -p` and provide the password when prompted. 7. Use the built-in [mysql\_secure\_installation](https://dev.mysql.com/doc/refman/8.0/en/mysql-secure-installation.html) tool to increase the security of the database. Provide the MySQL password for the `root` account upon request.
sudo mysql_secure_installation
8. When prompted to change the `root` password, leave it unchanged. But answer `Y` for the following questions: * `Remove anonymous users?` * `Disallow root login remotely?` * `Remove test database and access to it?` * `Reload privilege tables now?` For more information on how to configure and use MySQL, see the [MySQL Reference Manual](https://dev.mysql.com/doc/refman/8.0/en/) . ### Configuring PHP[](#configuring-php) PHP does not require nearly as much configuration as the other parts of the LAMP stack. However, it can be fine-tuned, and some logs should be added. To configure PHP on Ubuntu, follow these guidelines. Further information about PHP can be found in the [PHP Documentation Site](https://www.php.net/docs.php) . 1. First verify which PHP release is installed using the `-v` option. Store this information for the next step.
PHP 8.1.2-1ubuntu2.6 (cli) (built: Sep 15 2022 11:30:49) (NTS) Copyright (c) The PHP Group Zend Engine v4.1.2, Copyright (c) Zend Technologies with Zend OPcache v8.1.2-1ubuntu2.6, Copyright (c), by Zend Technologies
2. PHP errors are easier to debug if error messages and logging are enabled. The `max_input_time` parameter can be adjusted to allow better performance. Edit the `php.ini` file and make the following changes. This file is found in the `/etc/php/php_version/apache2` directory, where `php_version` consists of the major and minor release of PHP. In this example, the PHP release is `8.1`, so the correct file is `/etc/php/8.1/apache2/php.ini`. Note Ensure these variables are not commented out. If necessary, remove the `;` character at the start of the line. File: /etc/php/8.1/apache2/php.ini 3. Create the PHP error log and assign ownership of the log to the web server:
sudo mkdir /var/log/php sudo chown www-data /var/log/php
4. Restart the Apache server to apply the PHP changes:
sudo systemctl restart apache2
Testing the LAMP Stack Installation on Your Ubuntu Server[](#testing-the-lamp-stack-installation-on-your-ubuntu-server) ----------------------------------------------------------------------------------------------------------------------- Earlier tests verified the operational status of Apache and the configuration of the virtual host. However, it is also important to test PHP and the MySQL database. In particular, the web server must be able to interact with both components. The easiest way to verify the Ubuntu LAMP Stack configuration is with a short test script. The PHP code does not have to be long or complicated. However, the code must initiate a connection to MySQL. The script must be placed somewhere within the `DirectoryRoot` directory. For database validation, use PHP to call the `mysqli_connect` function. Pass the user name and the password for the account created in the **Configuring the MySQL Database** section to MySQL. The `mysqli_connect` function returns a `Connection` object if the attempt is successful. The script indicates whether the connection succeeded or not, and provides more information about any failures. To validate the installation, follow these steps. 1. Create a new file named `phptest.php` in the `public_html` directory for the domain. Ensure the `servername` variable is set to `localhost` and the `username` and `password` match the details of the MySQL web user account. File: /var/www/html/example.com/public\_html/phptest.php 2. Use a web browser to test the script. Enter the name of the domain followed by `phptest.php` in the address bar. In the following example, substitute the actual name of the domain for `example.com`.
http://example.com/phptest.php
3. The browser should display the web page without any errors. The page includes the text “Welcome to the Site!” and “Connected successfully”. If you see the “Connection Failed:” error message, review the SQL error information to debug the problem. See the **Troubleshooting** section for more information. ![Results of Test Script](https://www.linode.com/docs/guides/how-to-install-a-lamp-stack-on-ubuntu-22-04/PHP-Test-Script.png "Results of Test Script") 4. To increase security, remove the test script when testing is complete:
sudo rm /var/www/html/example.com/public_html/phptest.php
Troubleshooting the LAMP Stack Installation[](#troubleshooting-the-lamp-stack-installation) ------------------------------------------------------------------------------------------- Although it is fairly straightforward to install a LAMP Stack on Ubuntu, it is a lengthy process. It is easy to miss a command or incorrectly spell a variable. The easiest way to quickly find errors is to keep testing as you proceed. For instance, visit the IP address of the Ubuntu system after configuring and enabling Apache. Here are a few things to consider if the LAMP Stack is not working. * **Verify Apache is running**: Even if Apache was initially working, it could have stopped or failed upon a reload. Confirm it is `active` and restart it using these commands:
sudo systemctl status apache2 sudo systemctl restart apache2
* **Confirm the domain name and server IP address**: If the HTTP request times out, it could be due to an incorrect address or domain name. Try the IP address first, then visit the domain name without any subdirectories or filenames. Ensure the DNS record for the domain has been set to the IP address of the Ubuntu system and the address has propagated. This can take up to one full day. * **Confirm the user information in MySQL**: Ensure the database user has been added properly. Ensure the `webdata` database exists and the user has been granted all rights to it. * **Review all configuration files**: Many errors are due to missing or incorrect variables in the configuration files. Ensure the `DirectoryRoot` variable in `/etc/apache2/sites-available/example.com.conf` matches the path of the domain directory. If this variable is incorrect, the browser might display the default Apache landing page, a `404` error, or an unexpected directory list. * **Verify the location of the test script**: The test script must be located somewhere in the `DirectoryRoot` directory. The script should also be visible in the root directory of the domain. * **Confirm the user name and password used in the test script**: Most database connection failures in the test script are due to an incorrect server name, password, or user name. Look for missing or incorrect information in the script. * **Review the Logs**: The error logs for PHP are located at `/var/log/php/error.log`, while domain logs can be found at `/var/www/html/example.com/logs/error.log`. Examine the contents of both files and scan them for errors. * **Review the installation instructions**: It is easy to overlook an important step. Incorrect user permissions or an uninstalled PHP module can cause confusing failures. A Summary of How to Install a LAMP Stack on Ubuntu 22.04[](#a-summary-of-how-to-install-a-lamp-stack-on-ubuntu-2204) -------------------------------------------------------------------------------------------------------------------- The LAMP Stack consists of the Linux operating system, Apache web server, MYSQL RDBMS, and PHP programming language. These free and open source components power many modern web applications. The individual components are designed to work together and are easy to install and use. The LAMP stack can be installed on Ubuntu 22.04 LTS using `apt`. After configuring the Apache web server, it is good practice to create a virtual host for the domain. To integrate the MySQL web server, create a new account to represent the web user. Additional PHP packages must be installed so Apache, PHP, and the database can communicate. The new installation can be tested using a short PHP test script that connects to the database. For more information about each LAMP Stack component, see the **More Information** section of this guide. More Information ---------------- You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials. * [LAMP Stack Wikipedia page](https://en.wikipedia.org/wiki/LAMP_%28software_bundle%29) * [MySQL 8.0 Reference Manual](https://dev.mysql.com/doc/refman/8.0/en/) * [MySQL Development Site](https://dev.mysql.com/) * [Ubuntu Documentation](https://ubuntu.com/server) * [Apache HTTP Server Documentation](https://httpd.apache.org/docs/2.4/) * [PHP Website](https://www.php.net/) * [PHP Documentation](https://www.php.net/docs.php) This page was originally published on May 9, 2022.