{"id":35,"date":"2026-03-28T00:53:44","date_gmt":"2026-03-28T00:53:44","guid":{"rendered":"https:\/\/weworknetwork.net\/?p=35"},"modified":"2026-04-08T05:55:59","modified_gmt":"2026-04-08T05:55:59","slug":"setting-up-php-mysql-and-nginx-on-wsl2-ubuntu-on-windows","status":"publish","type":"post","link":"https:\/\/weworknetwork.net\/?p=35","title":{"rendered":"setting up PHP, MySQL, and Nginx on WSL2 Ubuntu on Windows"},"content":{"rendered":"\n<p>Here&#8217;s a complete guide to setting up PHP, MySQL, and Nginx on WSL2 Ubuntu on Windows \u2014 and calling it all from Windows.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"331\" src=\"https:\/\/weworknetwork.net\/wp-content\/uploads\/2026\/03\/0_OTkMW9wj8TpkmdIy.gif\" alt=\"\" class=\"wp-image-55\"\/><\/figure>\n\n\n\n<p><strong>The architecture<\/strong> is: your code lives in WSL Ubuntu, Nginx serves it on a local port, and you access it from Windows via <code>localhost<\/code> or a custom hostname.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"710\" src=\"https:\/\/weworknetwork.net\/wp-content\/uploads\/2026\/03\/Screenshot-2026-03-28-094602-1024x710.png\" alt=\"\" class=\"wp-image-41\" srcset=\"https:\/\/weworknetwork.net\/wp-content\/uploads\/2026\/03\/Screenshot-2026-03-28-094602-1024x710.png 1024w, https:\/\/weworknetwork.net\/wp-content\/uploads\/2026\/03\/Screenshot-2026-03-28-094602-300x208.png 300w, https:\/\/weworknetwork.net\/wp-content\/uploads\/2026\/03\/Screenshot-2026-03-28-094602-768x532.png 768w, https:\/\/weworknetwork.net\/wp-content\/uploads\/2026\/03\/Screenshot-2026-03-28-094602.png 1208w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Let me show the full setup visually first, then walk through each step.Now let&#8217;s go step by step.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 \u2014 Install WSL2 + Ubuntu<\/h2>\n\n\n\n<p>Open <strong>PowerShell as Administrator<\/strong> on Windows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wsl --install\n<\/code><\/pre>\n\n\n\n<p>This installs WSL2 and Ubuntu 22.04 by default. Restart when prompted. Then open <strong>Ubuntu<\/strong> from the Start menu and create your Linux username\/password.<\/p>\n\n\n\n<p>Verify it&#8217;s running WSL2 (not WSL1):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wsl -l -v\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 \u2014 Update Ubuntu<\/h2>\n\n\n\n<p>Inside the Ubuntu terminal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update &amp;&amp; sudo apt upgrade -y\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 \u2014 Install Nginx<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install nginx -y\nsudo service nginx start\n<\/code><\/pre>\n\n\n\n<p>Test it: open your Windows browser and go to <code>http:\/\/localhost<\/code> \u2014 you should see the Nginx welcome page.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4 \u2014 Install PHP and PHP-FPM<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install php php-fpm php-mysql php-cli php-mbstring php-xml php-curl -y\n<\/code><\/pre>\n\n\n\n<p>Check the version installed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php -v\n<\/code><\/pre>\n\n\n\n<p>Start PHP-FPM (replace <code>8.x<\/code> with your actual version, e.g. <code>8.3<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo service php8.3-fpm start\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5 \u2014 Install MySQL<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install mysql-server -y\nsudo service mysql start\nsudo mysql_secure_installation\n<\/code><\/pre>\n\n\n\n<p>Follow the prompts to set a root password and secure the install. Then log in and create a database:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql -u root -p\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE myapp;\nCREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';\nGRANT ALL PRIVILEGES ON myapp.* TO 'myuser'@'localhost';\nFLUSH PRIVILEGES;\nEXIT;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6 \u2014 Configure Nginx to use PHP-FPM<\/h2>\n\n\n\n<p>Create a site config:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/nginx\/sites-available\/myapp\n<\/code><\/pre>\n\n\n\n<p>Paste this (adjust <code>php8.3<\/code> to your version):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 80;\n    server_name localhost;\n    root \/var\/www\/html;\n    index index.php index.html;\n\n    location \/ {\n        try_files $uri $uri\/ =404;\n    }\n\n    location ~ \\.php$ {\n        include snippets\/fastcgi-php.conf;\n        fastcgi_pass unix:\/run\/php\/php8.3-fpm.sock;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Enable it and reload:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ln -s \/etc\/nginx\/sites-available\/myapp \/etc\/nginx\/sites-enabled\/\nsudo rm \/etc\/nginx\/sites-enabled\/default\nsudo nginx -t\nsudo service nginx reload\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7 \u2014 Test PHP is working<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"&lt;?php phpinfo(); ?&gt;\" | sudo tee \/var\/www\/html\/index.php\n<\/code><\/pre>\n\n\n\n<p>Visit <code>http:\/\/localhost<\/code> in your Windows browser \u2014 you&#8217;ll see the PHP info page.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 8 \u2014 Auto-start services (important!)<\/h2>\n\n\n\n<p>WSL2 doesn&#8217;t run <code>systemd<\/code> by default, so services stop when you close the terminal. Fix this by adding a startup script.<\/p>\n\n\n\n<p><strong>Option A \u2014 Enable systemd<\/strong> (Ubuntu 22.04+, recommended):<\/p>\n\n\n\n<p>Edit <code>\/etc\/wsl.conf<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/wsl.conf\n<\/code><\/pre>\n\n\n\n<p>Add:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;boot]\nsystemd=true\n<\/code><\/pre>\n\n\n\n<p>Restart WSL: in PowerShell run <code>wsl --shutdown<\/code>, then reopen Ubuntu. Now you can use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable nginx mysql php8.3-fpm\n<\/code><\/pre>\n\n\n\n<p><strong>Option B \u2014 Manual start alias<\/strong> (simpler, no restart needed):<\/p>\n\n\n\n<p>Add to your <code>~\/.bashrc<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alias start-stack='sudo service nginx start &amp;&amp; sudo service mysql start &amp;&amp; sudo service php8.3-fpm start'\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Calling from Windows<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>What you want<\/th><th>How<\/th><\/tr><\/thead><tbody><tr><td>Open the site<\/td><td>Browser \u2192 <code>http:\/\/localhost<\/code><\/td><\/tr><tr><td>Custom hostname<\/td><td>Add <code>127.0.0.1 myapp.local<\/code> to <code>C:\\Windows\\System32\\drivers\\etc\\hosts<\/code>, then use <code>server_name myapp.local;<\/code> in Nginx<\/td><\/tr><tr><td>Edit files in VS Code<\/td><td><code>code \/var\/www\/html<\/code> from WSL terminal (VS Code Remote WSL extension)<\/td><\/tr><tr><td>Browse files in Explorer<\/td><td>Navigate to <code>\\\\wsl$\\Ubuntu\\var\\www\\html<\/code><\/td><\/tr><tr><td>Connect MySQL from Windows<\/td><td>Use TablePlus\/DBeaver with host <code>127.0.0.1<\/code>, port <code>3306<\/code><\/td><\/tr><tr><td>Run PHP from Windows Terminal<\/td><td>Open a WSL tab and run <code>php script.php<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Quick troubleshooting<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Port 80 already in use<\/strong> \u2192 Windows may have IIS running. Disable it in &#8220;Turn Windows features on or off&#8221;, or change Nginx to <code>listen 8080<\/code>.<\/li>\n\n\n\n<li><strong>Services not running after reboot<\/strong> \u2192 Enable systemd (Option A above) or run <code>start-stack<\/code> alias.<\/li>\n\n\n\n<li><strong>Nginx config errors<\/strong> \u2192 Always run <code>sudo nginx -t<\/code> before reloading.<\/li>\n\n\n\n<li><strong>MySQL access denied<\/strong> \u2192 Make sure you&#8217;re connecting with the user you created, not root.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Here&#8217;s a complete guide to setting up PHP, MySQL, and Nginx on WSL2 Ubuntu on Windows \u2014 and calling it&hellip;<\/p>\n","protected":false},"author":1,"featured_media":53,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-35","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-operationg-system"],"_links":{"self":[{"href":"https:\/\/weworknetwork.net\/index.php?rest_route=\/wp\/v2\/posts\/35","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/weworknetwork.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/weworknetwork.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/weworknetwork.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/weworknetwork.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=35"}],"version-history":[{"count":3,"href":"https:\/\/weworknetwork.net\/index.php?rest_route=\/wp\/v2\/posts\/35\/revisions"}],"predecessor-version":[{"id":56,"href":"https:\/\/weworknetwork.net\/index.php?rest_route=\/wp\/v2\/posts\/35\/revisions\/56"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/weworknetwork.net\/index.php?rest_route=\/wp\/v2\/media\/53"}],"wp:attachment":[{"href":"https:\/\/weworknetwork.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=35"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/weworknetwork.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=35"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/weworknetwork.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=35"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}