This page was served from NGINX on ReactOS!

This is a quick demo that ReactOS can run the latest NGINX version (which is nginx-1.25.3 at the time of writing).

Loading screenshot…
Screenshot from ReactOS

The screenshot shown above gets regenerated every 30 seconds using a batch file that calls NirCmd in a loop:

mkdir C:\htdocs
:loop
nircmd savescreenshot "C:\htdocs\screenshot.png"
timeout /t 30 /nobreak
goto loop

ReactOS is virtualized using QEMU/KVM and was started on an Ubuntu host using the following service definition:

[Unit]
Description=QEMU ReactOS VM (node-1)

[Service]
Restart=always
RestartSec=3
ExecStart=/usr/bin/qemu-system-x86_64 -enable-kvm \
    -snapshot \
    -drive file=/root/reactos/drive_c.img,index=0,media=disk \
    -drive file=/root/reactos-general.iso,index=1,media=cdrom \
    -drive file=/root/reactos-node-1.iso,index=2,media=cdrom \
    -drive file=/root/reactos-certs.iso,index=3,media=cdrom \
    -boot c \
    -rtc base=localtime \
    -m 128 \
    -vnc :1 \
    -monitor unix:/tmp/qemu-monitor-socket-1,server,nowait \
    -net nic,model=virtio -net user,hostfwd=tcp::8444-:443 \
    -serial stdio \
    -usbdevice tablet

[Install]
WantedBy=default.target

Loading Balancing

The Ubuntu host is running 2 virtual ReactOS servers and uses HAProxy to load-balance between them. This is a preparation for doing zero-downtime deployments in the future (i.e. when updating ReactOS to the latest version, or whenever making configuration changes that require a restart of the VM).

Stability

The ReactOS servers occassionally run into a “Running low on page” error.

qemu-system-x86_64[24730]: (ntoskrnl/mm/ARM3/pfnlist.c:113) Running low on pages: 3 remaining
qemu-system-x86_64[24730]: (ntoskrnl/mm/ARM3/pfnlist.c:113) Running low on pages: 2 remaining
qemu-system-x86_64[24730]: (ntoskrnl/mm/ARM3/pfnlist.c:113) Running low on pages: 1 remaining
qemu-system-x86_64[24730]: (ntoskrnl/mm/ARM3/pfnlist.c:113) Running low on pages: 0 remaining
qemu-system-x86_64[24730]:
qemu-system-x86_64[24730]: *** Assertion failed: PsGetCurrentProcess()->AddressCreationLock.Owner != KeGetCurrentThread()
qemu-system-x86_64[24730]: ***   Source File: ../ntoskrnl/mm/balance.c, line 302
qemu-system-x86_64[24730]:
qemu-system-x86_64[24730]: Break repeatedly, break Once, Ignore, terminate Process or terminate Thread (boipt)?

This also happens when I give them more RAM (I tried up to 512 MB and still ran into the issue after a while). As a workaround, I’ve set up a script to automatically restart the ReactOS server when the message appears in the log.

IPv6

ReactOS doesn’t have IPv6 support yet (source 1, source 2). However, this page can anyway be accessed via IPv6 thanks to HAProxy on the host machine that accepts IPv6 connections and redirects them to the corresponding IPv4 port on one of the ReactOS instances.

Hosting

This project is running on a small cloud instance at DigitalOcean. DigitalOcean is actually one of the few cloud providers that support nested virtualization which is required for this server to run with reasonable performance.

If you plan to do a similar project, consider giving DigitalOcean a try using my referal link:

DigitalOcean Referral Badge

Donations

Apart from the referal link above, I’m not interested in donations. If you enjoyed this project and would like to make a donation, please consider donating directly to the ReactOS project.

Feedback, Comments, or Questions?

Contact me here.