Please check WSL prerequisites before attempting this setup. This guide assumes that you have at least basic knowledge of linux operating systems.
In this setup we will be using Debian as our server distribution with Apache2/PHP-FPM as our web server. Also note that in this guide I sometimes reference Laravel framework, but this setup should work for most PHP projects. Let's get started with the first step.
Installing Debian
In your windows terminal enter the following.
wsl --install -d debian
This will download and install the latest version of Debian, in this case it's Debian 11 (Bullseye). Once you have installed WSL, you will need to create a user account and password for your newly installed Linux distribution.
Next, access your distribution by typing wsl
in your terminal of choice, or searching for Debian in your start menu. If you've done everything correctly now you should be inside your Debian terminal.
Next let's check for upgrades.
sudo apt update
sudo apt upgrade
Then we will need to install some default packages. I'm using vim as my preferred editor, you can change that as you wish.
sudo apt-get install lsb-release git openssl curl zsh vim wget
Install Apache 2 and PHP
We will be using Apache2 with PHP-FPM. Let's start by installing Apache package.
sudo apt-get install apt-transport-https ca-certificates apache2
Then we will enable some mods that we will be using.
sudo a2enmod headers
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod remoteip
Next, add yourself to the www-data
group.
sudo usermod -a -G www-data karlo
Now we will install and setup PHP. At the time of the writing, latest version of PHP is 8.1. First we need to add PHP package repository.
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sudo echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
sudo apt-get update
Then we can install PHP and some default extensions.
sudo apt-get install php8.1 php8.1-pgsql php8.1-mbstring php8.1-xml php8.1-gd php8.1-imagick php8.1-curl php8.1-zip php8.1-xsl php8.1-soap php8.1-intl php8.1-bcmath
Then we will setup PHP-FPM.
sudo apt install php8.1-fpm libapache2-mod-fcgid
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.1-fpm
Now let's restart our services.
sudo service apache2 restart
sudo service php8.1-fpm restart
If you go to http://localhost
you should see the default apache welcome page.
Apache 2 virtual hosts configuration
Next step is to configure our virtual hosts. Let's start by creating a self signed certificate for SSL access.
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/wsl.local.key -out /etc/ssl/certs/wsl.local.crt
This will generate our key and certificate file. Next let's create a new virtual host configuration.
sudo vim /etc/apache2/sites-available/website.local.conf
Here are the contents of the file. Note that this setup assumes you have a PHP project in /var/www/website
directory. You can change your DocumentRoot
and Directory
variables to reflect your own settings. You can also use your windows folders, although I don't recommend it for performance reasons.
<VirtualHost *:443>
ServerName website.local
DocumentRoot /var/www/website/public/
<Directory /var/www/website/public>
AllowOverride all
Require all granted
</Directory>
ErrorLog /var/log/apache2/website-error.log
CustomLog /var/log/apache2/website-access.log combined
SSLEngine On
SSLCertificateFile /etc/ssl/certs/wsl.local.crt
SSLCertificateKeyFile /etc/ssl/private/wsl.local.key
SSLProtocol All -SSLv2 -SSLv3
</VirtualHost>
Now let's enable the site.
sudo a2ensite website.local
sudo service apache2 reload
Accessing the website
To access the website we need to modify our hosts file. You should be familiar with this process. Open your hosts file C:\Windows\System32\drivers\etc\hosts
and add the following.
# WSL
::1 website.local
127.0.0.1 website.local
Now if you visit https://website.local/
you should see your PHP project.
Installing database
For this example we will be installing PostgreSQL.
sudo apt install postgresql postgresql-contrib
sudo service postgresql start
To create a new database you can follow this example, first we open SQL console.
sudo -u postgres psql
Then in postgres console type the following commands.
--- Create user 'wsluser' with password 'secret'
CREATE ROLE wsluser LOGIN PASSWORD 'secret';
--- Create database with name laravel
CREATE DATABASE "laravel" WITH ENCODING='UTF8' OWNER=wsluser TEMPLATE template0;
--- Grant access
GRANT ALL PRIVILEGES ON DATABASE "laravel" to wsluser;
Setup XDebug
First we need to install XDebug extension.
sudo apt-get install php-xdebug
Then append the following to /etc/php/8.1/cli/conf.d/20-xdebug.ini
file.
xdebug.mode = debug
xdebug.start_with_request = yes
Be sure to restart apache and php-fpm services after this setup.
Additional information
Main documentation for WSL is a great source for all your information.
You can access WSL files from Windows by visiting
\\wsl$\Debian
in explorer, or just typeexplorer.exe .
inside WSL to open current folder in Windows.To install and setup Node.js you need to follow this guide.
If you are using VSCode for development you should check out this extension.
Also you can open current folder in VSCode by typing
code .
inside WSL.You will probably want to install composer, just follow command-line installation instructions.
If you have issues with folder permissions check out this post.
To shutdown WSL type
wsl --shutdown
inside your windows terminal.Also every time your start WSL you need to start all your services manually. To make this easier I created
start.sh
file inside my home directory, and I run it every time withsudo ./start.sh
.
#!/bin/sh
service apache2 start
service postgresql start
service php8.1-fpm start
service redis-server start