UPDATE: 23 February, 2020 - Fixed a Lot of missing instructions and errors including commands to restart services.

UPDATE: 24 June, 2022 - Fixed formatting errors in the code and updated the version and other information.

There is an abundance of tutorials in case you want to install nginx, PHP and MariaDB on Linux but when it comes to installing these tools on Windows, tutorials are either outdated or scattered. Anyway, let’s see how we can setup Nginx, PHP and MariaDB on Windows.

Download Nginx

This is fairly easy. Just head to Nginx’s Download page and download the zip file which says nginx/Windows-1.15.2 which is the current version at the time of writing this tutorial. Once you have downloaded it, extract the zip file to C:\nginx folder or anywhere you would like. But keep it in the root directory for simplicity sake.

Download PHP

Head to PHP’s download site for Windows and download the NTS version of PHP 7.2.9 (the latest version available at the time of this tutorial). Non Thread safe version of PHP is usually recommended if you are going to use with Nginx.

Extract all the files inside the zip to C:\nginx\php directory.

Download MariaDB

Visit the MariaDB download page and get the zip file for the latest MariaDB version (10.3.9 at the time of writing this tutorial). And yes, I know there is an installer but we are going to stick to the zip file for this one.

Extract all the files inside the zip to C:\nginx\mariadb directory.

Setup Nginx

The configuration file for Nginx can be found in C:\nginx\conf directory named nginx.conf. There is only one executable file namely nginx.exe in the main directory. Unlike Apache, Nginx doesn’t install itself as a Windows Service. Bummer, right?

But fret not. We can convert Nginx into a Windows Service. But before we do that, let’s take a quick look at the command line shortcuts for Nginx’s executable file.

nginx -s stop           fast shutdown
nginx -s quit           graceful shutdown
nginx -s reload         config change, graceful shutdown of old process and start new process with changed config
nginx -s reopen         re-opening log files

Out of these, we would be using nginx -s stop and nginx -s reload a couple of times in this tutorial.

Download WinSW

WinSW is a Windows Service wrapper that allows us to use any executable as a Windows Service. Grab the binary file from the latest Release page. There are multiple binary files for .NET 2+ and .NET 4+ versions. Assuming that you are using Windows 8 and above, grab the .NET461 executable.

Copy the executable into the C:\nginx directory and rename it as nginxservice.exe.

Create a file named nginxservice.xml and paste the following code into it.

Now, launch Powershell or Command center in Administrator mode and run the following command

nginxservice.exe install

PS: When running from Powershell, if you want to run an executable that is in the current directory, use ./ in front of the file name or it won’t run. This is not required if you are running an executable from the current directory in Command Center.

To start the service run the command: net start nginx and to stop the service use net stop nginx. You can also see Nginx listed as a service if you launch the Services app from the Start Menu.

Just run http://localhost in your browser to see if Nginx is running successfully. You should get the following page which tells us that the installation was successful.

Nginx Default Home page

Your HTML and other files will go by default in the C:/nginx/html directory. It is time to set up PHP now.

Set up PHP

PHP under Nginx runs as a CGI application. Like Nginx, PHP also doesn’t run as a Windows service. Therefore, we follow similar steps as we did for Nginx. Copy the WinSW executable to C:\nginx\php directory and rename it as phpservice.exe.

First, rename php.ini-production to php.ini. Also, create an empty directory php under C:/nginx/logs. Then create a file named php-stop.cmd in php directory and add the following line to it taskkill /f /IM php-cgi.exe Now create an empty file named phpservice.xml and copy the following lines to it.

I have used the port number 9999 above. You can use any port number you like to start PHP under.

Next, launch Powershell or Command centre in Administrator mode and run the following command

phpservice.exe install

Now you can start the PHP service with the command net start php.

Now that we have set up PHP, let’s do a bit of a configuration so that PHP and Nginx can work together.

First make a backup of C:\nginx\conf\nginx.conf file and then open it and uncomment the following lines. Also change the fastcgi_param as indicated below.

location ~ .php$
  {
    root html;
    fastcgi_pass 127.0.0.1:9999;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

Also, change the following line

location /
  {
    root html; index.html index.htm;
  }

to

location /
  {
    root html index.php index.html index.htm;
  }

If you are using .htaccess files, then uncomment the following lines as well.

location ~ /.ht
  {
    deny all;
  }

This will ensure that PHP code is loaded properly inside Nginx. root html means that you need to keep your content in C:\nginx\html directory. You can change it accordingly. If you want to use a directory that’s outside the Nginx folder then you need to specify the full pathname.

Now we also need to make some adjustments to the php.ini file that we had saved earlier. Open C:\nginx\php\php.ini and scroll down to the Dynamic Extensions section and uncomment the following lines

extension=bz2
extension=curl
extension=gd2
extension=gettext
extension=imap
extension=mbstring
extension=exif
extension=mysqli
extension=openssl
extension=sqlite3

You can uncomment more extensions depending upon your needs. One last thing is to increase the memory limits. You can do so by adjusting the following variables

post_max_size = 8M
...
upload_max_filesize = 2M
...
memory_limit = 128M`

Adjust the values accordingly according to the system/server you are using and what works for you.

Now that both Nginx and PHP are set up, run the following commands on Commandline.

net stop nginx
net start nginx
net stop php
net start php

If you are using Powershell, you can use a single command to restart.

Restart-Service -Name nginx Restart-Service -Name PHP

Setup MariaDB

This is the final phase of our tutorial. Run the following command on Command Prompt/Powershell after entering the directory C:\nginx\mariadb\bin

mysql_install_db.exe --datadir=C:\nginx\mariadb\data --service=MariaDB --password=secret

This command sets the data directory for databases as well as sets up the MariaDB service and the root password. And that’s it. MariaDB is working now.

And that’s all folks. Now you have an Nginx/PHP/MariaDB based server setup on your Localhost.

To start or stop any service use the commands

net start/stop nginx
net start/stop mariadb
net start/stop php

You can also do that by launching Services app by searching for it in the Start menu.

And that is the end of the tutorial. If you have any questions, contact me.

Source: Stackexchange and Nginx forum for pointers on setting up Nginx and PHP as windows services.