WinNMP - Nginx MariaDB Redis Php development stack for Windows

A lightweight, fast and stable server stack for developing php mysql applications on windows, based on the excellent webserver Nginx. A lighter alternative to XAMPP and WAMP.

How to install Magento 2 on Windows:

     This tutorial is getting old and might need critical updates.  If anyone is willing to write an update, we'll publish it.

    1. Install WinNMP Stack

    2. Create a new Magento Project

    New Project

    • Open WinNMP Manager by clicking the taskbar or desktop icon, then click on New Project icon, choose a project name like MyMagento, hit Enter or click Save Project.
    • Check Enable Local Virtual Server
    • Save the project settings.

    3. Download Magento

    4. Setup Nginx

    • Edit WinNMP\conf\domains.d\MyMagento.conf directly or in WinNMP Projects list > Project Setup > Edit Nginx Local Virtual Server Configuration File icon.

      Edit Nginx Local Virtual Server

    • Keep only the first 2 directives ( listen and server_name ) and replace everything else with:

        server {
            #! listen       127.0.0.1:80;
            #! server_name  MyMagento.test;
    
            ## Magento Vars - replace **MyMagento** with your project name !!!!!!!!!
            set $MAGE_ROOT "c:/WinNMP/www/MyMagento";
            set $MAGE_MODE default; # or production or developer
    
            ## Access Restrictions
            allow       127.0.0.1;
            deny        all;
    
            root $MAGE_ROOT/pub; # locked
    
            index index.php;
            autoindex off;
            charset off;
    
            add_header 'X-Content-Type-Options' 'nosniff';
            add_header 'X-XSS-Protection' '1; mode=block';
    
            location /setup {
                root $MAGE_ROOT;
                fastcgi_read_timeout    18000s;
                location ~ ^/setup/index.php {
                    include     nginx.fastcgi.conf;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                    fastcgi_pass    php_farm;
                }
    
                location ~ ^/setup/(?!pub/). {
                    deny all;
                }
    
                location ~ ^/setup/pub/ {
                    add_header X-Frame-Options "SAMEORIGIN";
                }
            }
    
            location /update {
                root $MAGE_ROOT;
    
                location ~ ^/update/index.php {
                    include     nginx.fastcgi.conf;
                    fastcgi_split_path_info ^(/update/index.php)(/.+)$;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                    fastcgi_param  PATH_INFO        $fastcgi_path_info;
                    fastcgi_pass    php_farm;
                }
    
                # deny everything but index.php
                location ~ ^/update/(?!pub/). {
                    deny all;
                }
    
                location ~ ^/update/pub/ {
                    add_header X-Frame-Options "SAMEORIGIN";
                }
            }
    
            location / {
                try_files $uri $uri/ /index.php?$args;
            }
    
            location /pub {
                location ~ ^/pub/media/(downloadable|customer|import|theme_customization/.*\.xml) {
                    deny all;
                }
                alias $MAGE_ROOT/pub;
                add_header X-Frame-Options "SAMEORIGIN";
            }
    
            location /static/ {
                if ($MAGE_MODE = "production") {
                    expires max;
                }
                location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
                    add_header Cache-Control "public";
                    add_header X-Frame-Options "SAMEORIGIN";
                    expires +1w;
                    #expires    off;
    
                    if (!-f $request_filename) {
                        rewrite ^/static/(.*)$ /static.php?resource=$1 last;
                        rewrite ^/static/version\d*/(.*)$ /static.php?resource=$1 last;
                    }
                }
                location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
                    add_header Cache-Control "no-store";
                    add_header X-Frame-Options "SAMEORIGIN";
                    expires    off;
    
                    if (!-f $request_filename) {
                        rewrite ^/static/(.*)$ /static.php?resource=$1 last;
                        rewrite ^/static/version\d*/(.*)$ /static.php?resource=$1 last;
                    }
                }
                if (!-f $request_filename) {
                    rewrite ^/static/(.*)$ /static.php?resource=$1 last;
                    rewrite ^/static/version\d*/(.*)$ /static.php?resource=$1 last;
                }
                add_header X-Frame-Options "SAMEORIGIN";
            }
    
            location /media/ {
                try_files $uri $uri/ /get.php?$args;
    
                location ~ ^/media/theme_customization/.*\.xml {
                    deny all;
                }
    
                location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
                    add_header Cache-Control "public";
                    add_header X-Frame-Options "SAMEORIGIN";
                    expires +1y;
                    try_files $uri $uri/ /get.php?$args;
                }
                location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
                    add_header Cache-Control "no-store";
                    add_header X-Frame-Options "SAMEORIGIN";
                    expires    off;
                    try_files $uri $uri/ /get.php?$args;
                }
                add_header X-Frame-Options "SAMEORIGIN";
            }
    
            location /media/customer/ {
                deny all;
            }
    
            location /media/downloadable/ {
                deny all;
            }
    
            location /media/import/ {
                deny all;
            }
    
            location ~ cron\.php {
                deny all;
            }
    
            location ~ (index|get|static|report|404|503)\.php$ {
                try_files $uri =404;
    
                fastcgi_param  PHP_FLAG  "session.auto_start=off \n suhosin.session.cryptua=off";
                fastcgi_param  PHP_VALUE "memory_limit=256M \n max_execution_time=600";
                fastcgi_read_timeout 600s;
                fastcgi_connect_timeout 600s;
                fastcgi_param  MAGE_MODE $MAGE_MODE;
    
                include     nginx.fastcgi.conf;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_pass    php_farm;
            }
        }

    5. Setup PHP

    • Edit WinNMP\conf\php.ini

    • Comment out or delete:

      open_basedir
      disable_functions
      disable_classes
    • Set:

      max_execution_time = 18000;
      always_populate_raw_post_data = -1
      extension =  php_xsl.dll
      ignore_user_abort = on
      cgi.fix_pathinfo = 1

    7. Apply Changes

    • Kill All then restart WinNMP Manager
    • or Kill / Start Nginx and Php-Cgi

    7. Magento Setup Wizard

    • Open up app/etc/di.xml and find the virtualType name="developerMaterialization" section. In that section you'll find an item name="view_preprocessed". Modify it by changing the contents from Magento\Framework\App\View\Asset\MaterializationStrategy\Symlink to Magento\Framework\App\View\Asset\MaterializationStrategy\Copy
    • Browse to http://MyMagento.test/setup
    • Optionally, if necesary, On Step 3: Web Configuration, click on Advanced Options and uncheck `Apache Rewrites - Use Apache Web Server Rewrites

      Magento Setup Wizard Step 3