Releases: douxxtech/nasmserver
v1.15-rev.1
What changed
rev.1:
- Added Docker support. Every new release will be pushed to douxxtech/nasmserver to be used with the Docker engine.
- Fixed some minor issues, and maybe created new ones.
v1.15:
- Fixed HTTP Basic Authentication not working (see #32)
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.15-rev.1/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.15-rev.1 && (cd nasmserver-v1.15-rev.1 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.15-rev.1
# or if using docker
docker pull douxxtech/nasmserver:v1.15-rev.1 && docker run -p 8080:8080 douxxtech/nasmserver:v1.15-rev.1
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.15-rev.1/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.15-rev.1 && (cd nasmserver-v1.15-rev.1 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.15-rev.1
How it performs
Binary size
Binary ('program') size: 64K (62712 bytes)
Syscalls stats
START + GET /: 165 syscalls
Fastest: 0.000017s (clock_gettime)
Slowest: 0.884778s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 75.9%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.92ms 10.73ms 214.09ms 99.26%
Req/Sec 1.78k 418.74 2.89k 72.12%
141558 requests in 20.03s, 214.79MB read
Socket errors: connect 0, read 1124, write 0, timeout 0
Requests/sec: 7065.96
Transfer/sec: 10.72MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 75.8% / 78.6%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 9.19ms 57.48ms 1.67s 98.35%
Req/Sec 1.77k 0.88k 4.59k 63.02%
211011 requests in 30.08s, 320.16MB read
Socket errors: connect 0, read 2049, write 0, timeout 47
Non-2xx or 3xx responses: 7
Requests/sec: 7014.09
Transfer/sec: 10.64MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 78.6% / 79.6%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 23.16ms 106.67ms 1.73s 95.01%
Req/Sec 1.76k 714.45 4.14k 66.43%
315108 requests in 45.08s, 478.10MB read
Socket errors: connect 0, read 2791, write 0, timeout 80
Non-2xx or 3xx responses: 8
Requests/sec: 6990.13
Transfer/sec: 10.61MB
Commit history
- . (
ed2bdcf) - fixed broken syntax on release notes generation (
add16f6) - =--- v1.15-rev.1 ---= (
2df45bc) - removed the note (
4a5775d) - added a ToC (
0ec5f22) - Added docker instructions (
48db6c4) - Merge pull request #36 from douxxtech/docker (
ea9eedd) - Merge pull request #37 from douxxtech/fix (
876f119) - fixed declaration typo (
2d6b995) - fixed double rel (
d8cc407) - added docker (x64) to release notes (
4fcee06) - Integrated docker auto-push to auto-release workflow (
eee46c4) - Added a dockerfile (
4210f7a) - Merge pull request #35 from douxxtech/strings (
cd2e97c) - fixed formatting (
99c9040) - moved stuff to bss (
3678837) - Moved all logutils.asm strings to strings.asm (
b2d6ff5) - Merge pull request #34 from douxxtech/rel-addr (
0d60a83) - implicit DEFAULT ABS is deprecated, so added some rel everywhere (
9c1df17)
v1.15
What changed
- Fixed HTTP Basic Authentication not working (see #32)
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.15/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.15 && (cd nasmserver-v1.15 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.15
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.15/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.15 && (cd nasmserver-v1.15 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.15
How it performs
Binary size
Binary ('program') size: 60K (61080 bytes)
Syscalls stats
START + GET /: 166 syscalls
Fastest: 0.000017s (clock_gettime)
Slowest: 0.963491s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 74.4%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.96ms 13.21ms 420.24ms 99.59%
Req/Sec 1.72k 372.52 2.79k 69.12%
137041 requests in 20.05s, 207.93MB read
Socket errors: connect 0, read 746, write 0, timeout 0
Requests/sec: 6836.35
Transfer/sec: 10.37MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 74.3% / 76.6%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 11.28ms 76.11ms 1.67s 98.38%
Req/Sec 1.77k 1.03k 4.60k 58.89%
206475 requests in 30.04s, 313.28MB read
Socket errors: connect 0, read 1176, write 0, timeout 30
Requests/sec: 6873.13
Transfer/sec: 10.43MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 76.6% / 77.2%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 12.11ms 66.35ms 1.67s 97.53%
Req/Sec 1.74k 821.11 4.71k 65.20%
310736 requests in 45.09s, 471.47MB read
Socket errors: connect 0, read 3516, write 0, timeout 121
Non-2xx or 3xx responses: 7
Requests/sec: 6891.89
Transfer/sec: 10.46MB
Commit history
- v1.15 (
80f5669) - Merge pull request #33 from douxxtech/fix-auth (
5669527) - updated the test program to check for auth (
f070478) - Re-fixed PARSE_AUTH_HEADER (
6a6aa90) - made PARSE_AUTH_HEADER look for "auth" instead of "Auth" (
bd49d30)
v1.14
What changed
- Added
LINGER_TIMEOUTconfig option to control how long the server waits for the client to disconnect after the response is sent (Default:5seconds). Set to0to wait forever. This fixes the issue where malicious actors could create an infinity of zombie processes. - Config file renamed from
env.exampleto.env.example - Config options are now grouped by category in the example file
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.14/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.14 && (cd nasmserver-v1.14 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.14
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.14/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.14 && (cd nasmserver-v1.14 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.14
How it performs
Binary size
Binary ('program') size: 60K (61080 bytes)
Syscalls stats
START + GET /: 167 syscalls
Fastest: 0.000013s (close)
Slowest: 0.891437s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 73.4%
mem before/after: 1608kB / 1608kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 5.50ms 32.62ms 828.04ms 99.13%
Req/Sec 2.35k 483.88 3.58k 65.62%
187594 requests in 20.02s, 284.64MB read
Socket errors: connect 0, read 2860, write 0, timeout 0
Requests/sec: 9368.19
Transfer/sec: 14.21MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 73.4% / 75.9%
mem before/after: 1608kB / 1608kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 14.98ms 95.27ms 1.67s 97.45%
Req/Sec 2.35k 0.96k 8.07k 71.37%
280492 requests in 30.05s, 425.59MB read
Socket errors: connect 0, read 5667, write 0, timeout 45
Non-2xx or 3xx responses: 3
Requests/sec: 9334.52
Transfer/sec: 14.16MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 75.9% / 76.6%
mem before/after: 1608kB / 1608kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 7.20ms 54.04ms 1.86s 98.76%
Req/Sec 2.36k 1.15k 6.86k 70.93%
422423 requests in 45.10s, 640.94MB read
Socket errors: connect 0, read 5940, write 0, timeout 54
Requests/sec: 9366.45
Transfer/sec: 14.21MB
Commit history
- v1.14 (
fcf2033) - Reorganized configuration (
8287206) - Reorganized .env.example (
21e9325) - Merge pull request #31 from douxxtech/lingerto (
c29edc7) - Updated .env.example and readme (
4bc01aa) - added startup dump of LINGER_TIMEOUT (
f3fcdae) - support for linger_to (
f442141) - supporting "LINGER_TIMEOUT" env key (
ca4bb06) - Added a read timeout, to not block on .drain if a malicious client doesn't closes its socket (
b22a0d6) - Renamed env.example to .env.example (
9be7b1a) - Updated dev notes (
7eba47b)
v1.13
What changed
- Added
LOG_LEVELconfig option to control log verbosity (none,info,debug). Default:info - Added
USE_CHROOTconfig option to jail the server insideDOCUMENT_ROOTat startup. Only applies when running as root. Default:true - Added
DROP_PRIVILEGESconfig option to drop to thenobodyuser after startup. Only applies when running as root. Default:true - In
debugmode, the server now logs startup info (UID, PID, full config dump), child process lifecycle, resolved paths and HTTP methods, dotfile blocks, response status codes and byte counts, signal handler registration results, and chroot/privilege-drop outcomes - Debug log lines are prefixed with
* <PID>: <message>to make per-process traces easy to follow - When
LOG_LEVELis set tonone, request logs are still written toLOG_FILEif one is configured - Request log lines are now assembled into a buffer before being written, reducing log corruption under concurrent load
- Fixed minor issues and probably created major ones
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.13/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.13 && (cd nasmserver-v1.13 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.13
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.13/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.13 && (cd nasmserver-v1.13 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.13
How it performs
Binary size
Binary ('program') size: 60K (61040 bytes)
Syscalls stats
START + GET /: 162 syscalls
Fastest: 0.000016s (close)
Slowest: 0.963850s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 74.8%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.95ms 10.11ms 420.85ms 99.46%
Req/Sec 1.69k 378.19 2.73k 72.38%
135095 requests in 20.04s, 206.91MB read
Socket errors: connect 0, read 538, write 0, timeout 0
Requests/sec: 6741.27
Transfer/sec: 10.32MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 74.7% / 77.2%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 11.62ms 73.47ms 1.67s 98.07%
Req/Sec 1.70k 638.00 4.20k 69.08%
203289 requests in 30.06s, 311.36MB read
Socket errors: connect 0, read 957, write 0, timeout 35
Requests/sec: 6762.07
Transfer/sec: 10.36MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 77.1% / 78.0%
mem before/after: 1544kB / 1544kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 21.07ms 101.73ms 1.73s 95.50%
Req/Sec 1.71k 683.83 4.59k 69.66%
305547 requests in 45.10s, 467.98MB read
Socket errors: connect 0, read 2862, write 0, timeout 59
Requests/sec: 6775.06
Transfer/sec: 10.38MB
Commit history
- v1.13 (
709b6a8) - Merge pull request #30 from douxxtech/better-logging (
665065f) - fixed current_pid and current_uid not being filled up if '-e' was passed (
0e0afeb) - fixed issue with libc calls (
26db98c) - fixed chroot again (
11ad0fd) - Revert "fixed stuff" (
af8028f) - Updated env.example and readme (
79c1953) - whatever (
b20b775) - using log_buffer for request logging (fixes corrupted logs) (
0b1ca31) - logging startup infos (
e1af770) - logging pid alongside debug logs (
cee0576) - more debug logs (
d4dcdc7) - fixed dbg_bytes_sent logging junk (
78ea18f) - space (
b43d8e5) - fixed dbg_status_code logging junk (
d677473) - clearing the log buffer manually (
bfc4920) - not clearing the log buffer every log now (
966abf5) - added a bunch of debug logs (
4a3de9d) - fixed stuff (
1a09147) - added strutils (
3991ea4) - fixed log_debug (
a05cbfc) - added log_debug (
5832a29) - supporting log_level = none (
655417d) - parsing LOG_LEVEL flag (
78267a4) - . (
1e64618) - fixed hardcoded "program" (
41d5d06) - stripping unneeded symbols in binary, results in a -50% final binary size (
42b9db0) - Merge pull request #29 from douxxtech/signal-handling (
8c05a76) - log update (
5145237) - added sigterm / sigint handlers (
d32bb62) - some formatting (
ae6b548) - handling SIGCHLD for child exit (
209becd) - Merge pull request #28 from douxxtech/chroot (
dce6e48) - more startup checks (
397770e) - a (
c2617b0) - updated readme.md and env.example (
8b984b5) - added USE_CHROOT and DROP_PRIVILEGES env key (
c9a350d) - added BOOL_FLAG (
7eb5e89) - . (
1a35cc2) - correctly chrooting without breaking everything (
0c731a9) - fixed initial setup (
d4c6cc3) - added comment (
1b8a978) - added LOG_PORT macro (
f712f19) - delegated stuff to preserve (
a8dc6e6) - added more content to preserve (
3b8db07) - dupl def (
f481b30) - Added preserve.asm to prepare the server env before serving (
653a5e0) - updated port warning (
4bbc069) - checking if we're root before warning about root requirements (
b3be162) - storing the current uid into current_uid (
6a30072)
v1.12
What changed
- Headers are lowercased before processing, so proxies or clients sending non-standard casing won't break features like
X-Real-IPorIf-Modified-Since. X-Real-IPlogging now falls back to the direct client IP if the header is missing or empty, instead of logging nothing.X-Real-IPnow supports IPv6 addresses.
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.12/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.12 && (cd nasmserver-v1.12 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.12
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.12/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.12 && (cd nasmserver-v1.12 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.12
How it performs
Binary size
Binary ('program') size: 88K (86144 bytes)
Syscalls stats
START + GET /: 161 syscalls
Fastest: 0.000016s (fstat)
Slowest: 0.949623s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 75.6%
mem before/after: 1516kB / 1520kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 5.01ms 9.37ms 215.29ms 99.44%
Req/Sec 1.67k 333.07 2.68k 67.75%
133124 requests in 20.03s, 203.89MB read
Socket errors: connect 0, read 103, write 0, timeout 0
Requests/sec: 6644.67
Transfer/sec: 10.18MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 75.5% / 77.4%
mem before/after: 1520kB / 1520kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 18.50ms 97.16ms 1.67s 96.54%
Req/Sec 1.67k 615.31 4.31k 69.58%
200208 requests in 30.09s, 306.64MB read
Socket errors: connect 0, read 1034, write 0, timeout 43
Requests/sec: 6654.08
Transfer/sec: 10.19MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 77.4% / 78.4%
mem before/after: 1520kB / 1520kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 12.04ms 63.14ms 1.67s 97.53%
Req/Sec 1.68k 759.23 3.93k 64.31%
299953 requests in 45.08s, 459.41MB read
Socket errors: connect 0, read 952, write 0, timeout 60
Requests/sec: 6653.25
Transfer/sec: 10.19MB
Commit history
- v1.12 (
d22cf95) - Renamed occurrences of X-Real-Ip to X-Real-IP to match standards (
fd64761) - Merge pull request #27 from douxxtech/better-headers (
c78d838) - Fixed the always-400 error (
b055654) - Fixed (again) x_real_ip parsing and supporting ipv6 correctly now (
bb87fe6) - Added a generic GET_HEADER header value finder, instead of copy-pasting the same code over and over (
90af866) - spaces (
7f8acaa) - lowercasing headers before handling the request (
59f1484) - Updated X-Real-Ip parsing to fallback to the connecting IP if the header is not found (
aff9750)
v1.11
What changed
- Added
BIND_ADDRESSconfig option to set which network interface the server listens on (Default:0.0.0.0). - The startup log now shows the full bind address and port (e.g.
Listening on 0.0.0.0:8080). - Error messages are now printed to
STDERR. - Fixed a bug where the simultaneous connection counter could overflow after 255 connections.
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.11/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.11 && (cd nasmserver-v1.11 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.11
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.11/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.11 && (cd nasmserver-v1.11 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.11
How it performs
Binary size
Binary ('program') size: 84K (85296 bytes)
Syscalls stats
START + GET /: 161 syscalls
Fastest: 0.000015s (write)
Slowest: 0.965029s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 75.2%
mem before/after: 1516kB / 1520kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.92ms 10.83ms 420.15ms 99.48%
Req/Sec 1.72k 353.20 2.58k 66.88%
136724 requests in 20.03s, 209.41MB read
Socket errors: connect 0, read 68, write 0, timeout 0
Requests/sec: 6824.97
Transfer/sec: 10.45MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 75.2% / 77.8%
mem before/after: 1520kB / 1520kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 12.88ms 78.24ms 1.67s 97.78%
Req/Sec 1.72k 847.47 4.17k 62.30%
205566 requests in 30.08s, 314.85MB read
Socket errors: connect 0, read 359, write 0, timeout 21
Requests/sec: 6833.33
Transfer/sec: 10.47MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 77.8% / 78.7%
mem before/after: 1520kB / 1520kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 30.23ms 129.40ms 1.86s 94.89%
Req/Sec 1.70k 615.21 5.09k 69.21%
304897 requests in 45.09s, 466.98MB read
Socket errors: connect 0, read 1606, write 0, timeout 145
Requests/sec: 6761.96
Transfer/sec: 10.36MB
Commit history
- v1.11 (
75a4960) - Merge pull request #26 from douxxtech/interface (
0b371cd) - updated env.example and readme (
df3f725) - fixed a typo (
78bbaf0) - Logging : now (
f204d04) - parsing BIND_ADDRESS from the config file (
c1c4745) - added bind_address related logs (
9eeab49) - also decrementing a byte to process_count (
379871a) - bumped response buffer to 1024 bytes (
90e7010) - Logging errors to stderr. warnings are kept to stdout (
0952d4c) - Using word to increment process_count instead of the old byte (
db93f3b)
v1.10
What changed
- Added
AUTH_REALMconfig option to set a custom realm for Basic Authentication (Default:None). - Added
USE_X_REAL_IPconfig option to log the real client IP from theX-Real-Ipheader when running behind a reverse proxy (Default:false). - Added a missing validation for the
errordoc_401setting.
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.10/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.10 && (cd nasmserver-v1.10 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.10
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.10/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.10 && (cd nasmserver-v1.10 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.10
How it performs
Binary size
Binary ('program') size: 84K (84184 bytes)
Syscalls stats
START + GET /: 156 syscalls
Fastest: 0.000015s (clock_gettime)
Slowest: 0.994148s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 74.8%
mem before/after: 1452kB / 1456kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.97ms 8.79ms 214.60ms 99.50%
Req/Sec 1.65k 378.38 2.54k 70.00%
131354 requests in 20.05s, 201.18MB read
Socket errors: connect 0, read 504, write 0, timeout 0
Requests/sec: 6551.83
Transfer/sec: 10.03MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 74.7% / 77.6%
mem before/after: 1456kB / 1456kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 10.90ms 70.16ms 1.67s 98.34%
Req/Sec 1.69k 1.05k 4.57k 59.70%
199039 requests in 30.10s, 304.85MB read
Socket errors: connect 0, read 617, write 0, timeout 26
Requests/sec: 6613.66
Transfer/sec: 10.13MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 77.6% / 78.7%
mem before/after: 1456kB / 1456kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 10.60ms 58.88ms 1.67s 98.04%
Req/Sec 1.65k 0.94k 4.75k 68.17%
295769 requests in 45.08s, 453.00MB read
Socket errors: connect 0, read 4513, write 0, timeout 77
Requests/sec: 6560.90
Transfer/sec: 10.05MB
Commit history
- v1.10 (
e58b81e) - fixed typo on header (
03ded85) - Editing comment instead of commenting a new one on each pull on a PR (
02fa725) - Merge pull request #25 from douxxtech/auth-realm (
37ef7a7) - updated readme (
456f59c) - Using AUTH_REALM instead of the hardcoded "None" for the basic auth realm (
a31e005) - renamed clfe_qm to log_quotation_mark (
e388773) - removed dead code in logutils (
c8f8cbe) - added env parsing for AUTH_REALM (
40a9999) - updated env.example (
bac1af5) - Added a startup check for the 401 errordoc (
91d5b59) - Merge pull request #24 from douxxtech/x-real-ip (
86e6936) - Added USE_X_REAL_IP to the readme conf (
8b9bd73) - updated env.example (
0bb650c) - implemented the X-Real-Ip logging instead of the client ip (
aae6124) - Added PARSE_XRI_HEADER to parse the X-Real-Ip header (
0128952) - fixed a copy paste issue (
df80d1b) - organized bss section (
3f1e53e) - added parsing for the "USE_X_REAL_IP" config key (
53b8aea)
v1.9
What changed
- Added persistent request logging to file in Apache HTTP Server combined log format (CLFE), including client IP, timestamp, request line, status code, response size, referer, and user-agent.
- Added
LOG_FILEconfig option to specify a custom log file path (default: logs to STDOUT). - The install script now creates
/var/log/nasmserver. - Requests now parse and log
User-AgentandRefererheaders for richer analytics. - If the log file cannot be opened, a warning is logged and STDOUT is used as a fallback.
New log format:
127.0.0.1 - - [25/Mar/2026:16:47:06 +0100] "GET / HTTP/1.0" 200 3501 "-" "NASM-Client/1.0"
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.9/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.9 && (cd nasmserver-v1.9 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.9
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.9/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.9 && (cd nasmserver-v1.9 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.9
How it performs
Binary size
Binary ('program') size: 76K (77800 bytes)
Syscalls stats
START + GET /: 150 syscalls
Fastest: 0.000015s (write)
Slowest: 0.771726s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 75.6%
mem before/after: 1456kB / 1456kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 5.14ms 8.12ms 214.09ms 99.53%
Req/Sec 1.56k 369.45 2.39k 71.38%
124830 requests in 20.07s, 191.07MB read
Socket errors: connect 0, read 1413, write 0, timeout 0
Requests/sec: 6220.00
Transfer/sec: 9.52MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 75.6% / 78.7%
mem before/after: 1456kB / 1456kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 19.86ms 98.85ms 1.67s 96.55%
Req/Sec 1.58k 580.67 3.95k 68.64%
188518 requests in 30.07s, 288.55MB read
Socket errors: connect 0, read 725, write 0, timeout 43
Requests/sec: 6268.58
Transfer/sec: 9.59MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 78.7% / 79.7%
mem before/after: 1456kB / 1456kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 18.26ms 94.15ms 1.67s 96.59%
Req/Sec 1.57k 528.11 3.70k 70.30%
282319 requests in 45.10s, 432.13MB read
Socket errors: connect 0, read 1601, write 0, timeout 67
Requests/sec: 6260.30
Transfer/sec: 9.58MB
Commit history
- v1.9 (
3e95a84) - updated readme configuration (
f535b80) - proper perms (i hope) to the log dir (
1c35a5d) - update install scripts (
b63fefd) - added file logging to the readme (
3e3a35e) - Merge pull request #23 from douxxtech/log-file (
9981ea2) - Fixed requests logs being corrupted when written to STDOUT (
8649893) - Added LOG_FILE to env.example (
26259cc) - updated http parsers to avoid having sus chars in logs (
1cd8886) - fixed requests logging breaking at the http request log part (
31a126d) - Now logging requests into the file descriptor stored in "log_file" (populated by initialsetup) (
f90cb9b) - fixed the log file check being skipped if port > 1024 (
528adb4) - added log_file startup check (
7a8c674) - filling log_file (
9290343) - added OPEN_FILE_A (append) (
099d40d) - Renamed OPEN_FILE to OPEN_FILE_R (
89a384f) - added LOG_FILE loading from the config file (
526a39c) - added \n check in the request header (for logs) (
bf54867) - Merge pull request #22 from douxxtech/common-log-format (
d0e6e7e) - removed the space after the UA for cleaner logs (
d77b5ae) - removed dead code (
59ac45b) - Cleared the username before logging it if incorrect to avoid logs injection (
1de3768) - Updated readme features terming (
d311c15) - Fixed status_buf size (
de9be11) - updated readme features (
aceb801) - some naming changes (
828a8ac) - added apache-like logs (was a pain in the ass) (
3521763) - added user agent and referer parsing (
114d193)
v1.8
What changed
- Added
If-Modified-Sincesupport: conditional GET requests now return304 Not Modifiedwhen appropriate. - CI/CD now tracks binary size and syscall stats for releases (see below).
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.8/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.8 && (cd nasmserver-v1.8 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.8
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.8/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.8 && (cd nasmserver-v1.8 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.8
How it performs
Binary size
Binary ('program') size: 76K (75096 bytes)
Syscalls stats
START + GET /: 129 syscalls
Fastest: 0.000016s (close)
Slowest: 0.535204s (accept)
Load test (1)
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 81.9%
mem before/after: 1448kB / 1448kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 5.25ms 13.26ms 420.65ms 99.45%
Req/Sec 1.68k 329.51 2.48k 66.50%
134220 requests in 20.03s, 205.44MB read
Socket errors: connect 0, read 53, write 0, timeout 0
Requests/sec: 6699.93
Transfer/sec: 10.26MB
Load test (2)
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 81.8% / 84.8%
mem before/after: 1448kB / 1448kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 16.72ms 93.50ms 1.67s 97.13%
Req/Sec 1.70k 752.39 4.87k 69.42%
202905 requests in 30.08s, 310.58MB read
Socket errors: connect 0, read 1036, write 0, timeout 43
Requests/sec: 6745.77
Transfer/sec: 10.33MB
Load test (3)
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 84.7% / 85.9%
mem before/after: 1448kB / 1448kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 13.51ms 74.84ms 1.67s 97.39%
Req/Sec 1.70k 0.90k 4.40k 65.40%
304184 requests in 45.10s, 465.60MB read
Socket errors: connect 0, read 1496, write 0, timeout 50
Requests/sec: 6745.06
Transfer/sec: 10.32MB
Commit history
- v1.8 (
9000b85) - Merge pull request #21 from douxxtech/304-not-modified (
3409abe) - added some more spacing to PARSE_IMS_HEADER (
c4d70d1) - Validate If-Modified-Since being a real header (
72aa895) - added a basic If-Modified-Since header parsing (
928db65) - moved itoa and atoi to strutils (
d74d8e8) - updated docstrings in httputils (
b7d9cee) - updated PR comment to include syscalls count (
4080b80) - Added more information to the release notes (
bd5b7b5) - better readme (
1a4cb04) - replaced .env to test-env.cfg to avoid accidental deletion of local .env file (
2111ac3)
v1.7
What changed
- Added
SERVE_DOTSconfig option to control whether dotfiles and dotfolders are served (default:false, they are blocked) - Directories with no index file now return
403 Forbiddeninstead of404 Not Found - Responses now include a
Content-Encoding: identityheader when serving files - Responses now include a
Pragma: no-cacheheader whenMAX_AGEis set to0
Downloads
| File | Description |
|---|---|
nasmserver-linux-x64.zip |
Linux x86_64 self-contained bundle, no dependencies required |
nasmserver-linux-aarch64.zip |
Linux aarch64 (e.g. Raspberry Pi), runs via QEMU emulation, no dependencies required |
Updating to this version
To update to this version, update your existing binaries and configuration files.
If you have a system install of NASMServer, use the following command to update your install (it won't overwrite your configurations):
# x64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.7/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.7 && (cd nasmserver-v1.7 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.7
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.7/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.7 && (cd nasmserver-v1.7 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.7
Benchmark results
Level 1
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 86.4%
mem before/after: 1448kB / 1448kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 20s test @ http://127.0.0.1:8080/
4 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.83ms 8.66ms 214.32ms 99.50%
Req/Sec 1.74k 356.59 2.59k 66.38%
138722 requests in 20.03s, 212.33MB read
Socket errors: connect 0, read 94, write 0, timeout 0
Requests/sec: 6926.20
Transfer/sec: 10.60MB
Level 2
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 86.3% / 89.1%
mem before/after: 1448kB / 1448kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 30s test @ http://127.0.0.1:8080/
4 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 14.05ms 78.94ms 1.67s 97.27%
Req/Sec 1.74k 846.51 4.51k 63.32%
207598 requests in 30.09s, 317.76MB read
Socket errors: connect 0, read 994, write 0, timeout 23
Requests/sec: 6898.67
Transfer/sec: 10.56MB
Level 3
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 89.0% / 90.1%
mem before/after: 1448kB / 1448kB
open fds before/after: 6 / 6
threads before/after: 1 / 1
[wrk]
Running 45s test @ http://127.0.0.1:8080/
4 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 8.04ms 45.46ms 1.67s 98.82%
Req/Sec 1.74k 1.01k 4.89k 67.82%
310733 requests in 45.09s, 475.62MB read
Socket errors: connect 0, read 1920, write 0, timeout 18
Requests/sec: 6891.44
Transfer/sec: 10.55MB
Commit history
- v1.7 (
c9e0ff5) - Merge pull request #20 from douxxtech/nodot (
80d3def) - updated example env and readme (
e6ddeb9) - renamed SERVE_DOTFILES to SERVE_DOTS (also handles directories) (
31cbaa1) - returning (by default, configurable) a 403 if the client tries to fetch a .dotfile or a .dotdir (
15ffbb1) - checking if SERVE_DOTFILES=true (
677c40b) - added PATH_HAS_DOT (
18d469b) - Merge pull request #19 from douxxtech/403dirs (
c76dd59) - Sending a 403 to dirs with no index file requests (
6c4135c) - Merge pull request #18 from douxxtech/content-identity (
6fff769) - Added content-encoding header (
3567591) - Merge pull request #17 from douxxtech/pragma (
8614bf4) - updated env and readme (
2087734) - added the Pragma: no cache header (
38395cb) - fixed indentation (
bd44325)