Windows Subsystem for Linux (WSL)
If you’re a Windows developer that needs to compile or run Linux binaries in Windows, then the Windows Subsystem for Linux (WSL) is for you. WSL is a tool for developers and sysadmins that need Linux interoperability in Windows.
The most important thing to understand about WSL is that it isn’t based on virtual machines or containers - when you download a supported Linux distro from the Microsoft Store, it doesn’t mean that a virtual machine is created. What WSL provides is just a layer for mapping Windows kernel system calls to Linux kernel system calls - this allows Linux binaries to run in Windows unmodified. WSL also maps Windows services, like the filesystem and networking, as devices that Linux can access.
Instead of using a VM or container, WSL virtualizes a Linux kernel interface on top of the Windows kernel. This means that running WSL only requires a minimal amount of RAM. And when not in use, the WSL driver isn’t loaded into memory, making it much more efficient than a solution based on a VM or container.
Installing WSL and Ubuntu in a Windows Server
Run this in a Powershell Administrator Prompt (you’ll have to reboot after this):
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Run this in a Powershell Administrator Prompt to install Ubuntu 18.04:
curl.exe -L -o ubuntu-1804.appx https://aka.ms/wsl-ubuntu-1804
Rename-Item ubuntu-1804.appx ubuntu-1804.zip
Expand-Archive ubuntu-1804.zip ubuntu1804
You’ll be asked to choose a Linux username and password.
Installing Redis on Ubuntu (under Windows Server WSL)
Invoke a bash shell as superuser (for the next commands which require root):
(you’ll be asked for administrator’s password created earlier)
Update apt-get and install redis:
apt-get update && apt-get upgrade
apt-get install redis-server
Configuring Redis for external access (Optional)
If you’ll only use Redis in your internal protected network you don’t need this.
WSL only provides a translation layer between the Linux apps and the Windows kernel, so some core parts of the Ubuntu system (including networking) are just not there - WSL just translates the Linux system calls into windows ones so the Ubuntu network data flows through the exact same TCP/IP stack as the windows data.
This means that to open Redis server to other servers (or to the public internet) you just have to configure Redis to listen on the correct interfaces, and open the appropriate ports (there’s no need to do “port forwarding” since this is not a VM with its own networking interfaces).
By default Redis will only bind to loopback (localhost) interfaces. If you open
/etc/redis/redis.conf (by running
nano /etc/redis/redis.conf) you’ll find a line like
bind 127.0.0.1 ::1 which means that Redis by default listens on ipv4 loopback (
127.0.0.1) and ipv6 loopback (
::1). Just change it to
bind 0.0.0.0 ::1 to make Redis listen in all interfaces (including public IPs), or if it’s just for internal network you can add the internal ips in which this server should listen on.
And in case you’re exposing it through the internet you’ll also have to open your Windows Firewall ports:
netsh advfirewall firewall add rule name="Redis Port 6379" dir=in action=allow protocol=TCP localport=6379
If you’re exposing your server to public internet you’ll have to configure a password, because by default Redis does not accept external connections without a password.
/etc/redis/redis.conf you just have to uncomment the line
requirepass and set next to it a very-strong password (since it’s very fast to run a brute-force attack on a Redis server).
Start and test server
sudo service redis-server restart
To test the service, run
redis-cli and use the following commands:
AUTH yourstrongpassword (if you have enabled authentication, above)
set user:1 "Oscar"
To stop your server you can use:
sudo service redis-server stop
If you want to put your Windows Server to automatically start this Linux service on every boot you can configure this command to be executed on every boot:
C:\windows\system32\wsl.exe -u root service redis-server start