Skip to content

Releases: douxxtech/nasmserver

v1.14

27 Apr 21:22

Choose a tag to compare

What changed

  • Added LINGER_TIMEOUT config option to control how long the server waits for the client to disconnect after the response is sent (Default: 5 seconds). Set to 0 to wait forever. This fixes the issue where malicious actors could create an infinity of zombie processes.
  • Config file renamed from env.example to .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

19 Apr 19:54

Choose a tag to compare

What changed

  • Added LOG_LEVEL config option to control log verbosity (none, info, debug). Default: info
  • Added USE_CHROOT config option to jail the server inside DOCUMENT_ROOT at startup. Only applies when running as root. Default: true
  • Added DROP_PRIVILEGES config option to drop to the nobody user after startup. Only applies when running as root. Default: true
  • In debug mode, 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_LEVEL is set to none, request logs are still written to LOG_FILE if 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

08 Apr 18:40

Choose a tag to compare

What changed

  • Headers are lowercased before processing, so proxies or clients sending non-standard casing won't break features like X-Real-IP or If-Modified-Since.
  • X-Real-IP logging now falls back to the direct client IP if the header is missing or empty, instead of logging nothing.
  • X-Real-IP now 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

30 Mar 12:26

Choose a tag to compare

What changed

  • Added BIND_ADDRESS config 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

27 Mar 16:38

Choose a tag to compare

What changed

  • Added AUTH_REALM config option to set a custom realm for Basic Authentication (Default: None).
  • Added USE_X_REAL_IP config option to log the real client IP from the X-Real-Ip header when running behind a reverse proxy (Default: false).
  • Added a missing validation for the errordoc_401 setting.

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

25 Mar 15:55

Choose a tag to compare

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_FILE config 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-Agent and Referer headers 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

23 Mar 21:17

Choose a tag to compare

What changed

  • Added If-Modified-Since support: conditional GET requests now return 304 Not Modified when 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

21 Mar 23:07

Choose a tag to compare

What changed

  • Added SERVE_DOTS config option to control whether dotfiles and dotfolders are served (default: false, they are blocked)
  • Directories with no index file now return 403 Forbidden instead of 404 Not Found
  • Responses now include a Content-Encoding: identity header when serving files
  • Responses now include a Pragma: no-cache header when MAX_AGE is set to 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.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

20 Mar 21:08

Choose a tag to compare

What changed

  • Added HEAD request 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 Allowed responses now include an Allow: 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

19 Mar 20:16

Choose a tag to compare

What changed

  • Added MAX_AGE config 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)