Releases: douxxtech/nasmserver
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)
v1.6
What changed
- Added
HEADrequest support: clients can now request headers only without downloading the file body - Responses now include a
Last-Modified:header with the file's last change time - Responses now include
Accept-Ranges: none, explicitly warning that partial/range downloads are not supported 405 Method Not Allowedresponses now include anAllow:header listing supported methods, as required by the HTTP spec
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.6/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.6 && (cd nasmserver-v1.6 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.6
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.6/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.6 && (cd nasmserver-v1.6 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.6
Benchmark results
Level 1
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 83.1%
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.85ms 10.93ms 420.24ms 99.47%
Req/Sec 1.77k 360.31 2.84k 67.75%
141170 requests in 20.03s, 212.31MB read
Socket errors: connect 0, read 124, write 0, timeout 0
Requests/sec: 7047.77
Transfer/sec: 10.60MB
Level 2
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 83.0% / 85.7%
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 10.08ms 69.15ms 1.67s 98.67%
Req/Sec 1.81k 1.21k 5.24k 59.56%
211291 requests in 30.07s, 317.77MB read
Socket errors: connect 0, read 741, write 0, timeout 33
Requests/sec: 7026.79
Transfer/sec: 10.57MB
Level 3
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 85.7% / 86.7%
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 22.58ms 109.21ms 1.86s 95.40%
Req/Sec 1.78k 844.40 5.46k 68.77%
317281 requests in 45.06s, 477.17MB read
Socket errors: connect 0, read 2793, write 0, timeout 87
Requests/sec: 7040.72
Transfer/sec: 10.59MB
Commit history
- v1.6 (
912f716) - Merge pull request #16 from douxxtech/head (
0e94abb) - added HEAD request support (
e957a67) - moved date_tm_buf to bss (
4525a57) - Merge pull request #15 from douxxtech/accept-range (
3002097) - Added accept ranges header (
a0e5091) - Merge pull request #14 from douxxtech/last-modified (
ad03c16) - added 'FILE_LAST_MODIFIED' macro (
f30872b) - added Last-Modified header and reorganized the headers order (again) (
d667ae3) - Merge pull request #13 from douxxtech/allow-header (
8e37e48) - Added Allow: header to 405s responses (
f3cc21d) - updated hardcoded version (v1.5) (
089c092)
v1.5
What changed
- Added
MAX_AGEconfig option to control how long browsers cache files (default: 600 seconds) - Responses now include a
Date:header - Max simultaneous connections (
MAX_REQUESTS) raised from 255 to 65535 - Added benchmarking to release notes
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.5/nasmserver-linux-x64.zip && unzip nasmserver-linux-x64.zip -d nasmserver-v1.5 && (cd nasmserver-v1.5 && sudo ./install) && rm -rf nasmserver-linux-x64.zip nasmserver-v1.5
# aarch64
wget https://github.com/douxxtech/nasmserver/releases/download/v1.5/nasmserver-linux-aarch64.zip && unzip nasmserver-linux-aarch64.zip -d nasmserver-v1.5 && (cd nasmserver-v1.5 && sudo ./install) && rm -rf nasmserver-linux-aarch64.zip nasmserver-v1.5
Benchmark results
Level 1
threads: 4 (auto), conns: 50, duration: 20s
[server]
cpu before/after: 0.0% / 88.5%
mem before/after: 1508kB / 1508kB
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 3.74ms 17.82ms 826.87ms 99.55%
Req/Sec 2.65k 592.79 4.01k 71.75%
210994 requests in 20.01s, 303.84MB read
Socket errors: connect 0, read 721, write 0, timeout 0
Requests/sec: 10543.09
Transfer/sec: 15.18MB
Level 2
threads: 4 (auto), conns: 200, duration: 30s
[server]
cpu before/after: 88.4% / 91.2%
mem before/after: 1508kB / 1508kB
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 8.31ms 64.20ms 1.67s 98.59%
Req/Sec 2.64k 1.47k 7.50k 65.30%
315634 requests in 30.04s, 454.53MB read
Socket errors: connect 0, read 3677, write 0, timeout 44
Requests/sec: 10506.00
Transfer/sec: 15.13MB
Level 3
threads: 4 (auto), conns: 500, duration: 45s
[server]
cpu before/after: 91.2% / 91.9%
mem before/after: 1508kB / 1508kB
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.34ms 48.93ms 1.67s 98.29%
Req/Sec 2.69k 1.11k 7.42k 67.23%
476083 requests in 45.06s, 685.58MB read
Socket errors: connect 0, read 3586, write 0, timeout 66
Requests/sec: 10565.12
Transfer/sec: 15.21MB
Commit history
- v1.5 (
a5760c8) - forgot to update generate releases notes (
152a650) - benchmarking (benchmark on PRs and releases) (
58de548) - Merge pull request #9 from douxxtech/max-requests (
4ce60ad) - updated env and readme (
e788b6f) - fixed max-requests count and elevated it to 65535 (
1a894b2) - Merge pull request #8 from douxxtech/time-header (
74c4aab) - reorganized headers (
c283cca) - Added the Date: header (
675438e) - Merge pull request #7 from douxxtech/expire-header (
c0927c6) - updated env.example and readme.md (
a564ce0) - added support for expire: header and "MAX_AGE" env key (
e9db0bd)