<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ara</title>
    <description>The latest articles on Forem by Ara (@sadoyan).</description>
    <link>https://forem.com/sadoyan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3477556%2F21a64d2f-2a6d-4a48-b86b-8f43d839658c.png</url>
      <title>Forem: Ara</title>
      <link>https://forem.com/sadoyan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sadoyan"/>
    <language>en</language>
    <item>
      <title>Reverse proxy and service mesh built on top of Cloudflare's Pingora</title>
      <dc:creator>Ara</dc:creator>
      <pubDate>Wed, 03 Sep 2025 16:22:43 +0000</pubDate>
      <link>https://forem.com/sadoyan/reverse-proxy-and-service-mesh-built-on-top-of-cloudflares-pingora-2o13</link>
      <guid>https://forem.com/sadoyan/reverse-proxy-and-service-mesh-built-on-top-of-cloudflares-pingora-2o13</guid>
      <description>&lt;h2&gt;
  
  
  Aralez (Արալեզ),
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Reverse proxy and service mesh built on top of Cloudflare's Pingora&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What Aralez means ?&lt;br&gt;
&lt;strong&gt;Aralez = Արալեզ&lt;/strong&gt; .Named after the legendary Armenian guardian spirit, winged dog-like creature, that descend upon fallen heroes to lick their wounds and resurrect them..&lt;/p&gt;

&lt;p&gt;Built on Rust, on top of &lt;strong&gt;Cloudflare’s Pingora engine&lt;/strong&gt;, &lt;strong&gt;Aralez&lt;/strong&gt; delivers world-class performance, security and scalability — right out of the box.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔧 Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Config Reloads&lt;/strong&gt; — Upstreams can be updated live via API, no restart required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TLS Termination&lt;/strong&gt; — Built-in OpenSSL support.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic load of certificates&lt;/strong&gt; — Automatically reads and loads certificates from a folder, without a restart.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upstreams TLS detection&lt;/strong&gt; — Aralez will automatically detect if upstreams uses secure connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built in rate limiter&lt;/strong&gt; — Limit requests to server, by setting up upper limit for requests per seconds, per virtualhost.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global rate limiter&lt;/strong&gt; — Set rate limit for all virtualhosts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per path rate limiter&lt;/strong&gt; — Set rate limit for specific paths. Path limits will override global limits.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; — Supports Basic Auth, API tokens, and JWT verification.

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic Auth&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Key&lt;/strong&gt; via &lt;code&gt;x-api-key&lt;/code&gt; header&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JWT Auth&lt;/strong&gt;, with tokens issued by Aralez itself via &lt;code&gt;/jwt&lt;/code&gt; API

&lt;ul&gt;
&lt;li&gt;⬇️ See below for examples and implementation details.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load Balancing Strategies&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Round-robin&lt;/li&gt;
&lt;li&gt;Failover with health checks&lt;/li&gt;
&lt;li&gt;Sticky sessions via cookies&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unified Port&lt;/strong&gt; — Serve HTTP and WebSocket traffic over the same connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built in file server&lt;/strong&gt; — Build in minimalistic file server for serving static files, should be added as upstreams for public access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Safe&lt;/strong&gt; — Created purely on Rust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Performance&lt;/strong&gt; — Built with &lt;a href="https://github.com/cloudflare/pingora" rel="noopener noreferrer"&gt;Pingora&lt;/a&gt; and tokio for async I/O.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🌍 Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Upstream Providers:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt; Upstreams are declared in config file.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;consul&lt;/code&gt; Upstreams are dynamically updated from Hashicorp Consul.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Hot Reloading:&lt;/strong&gt; Modify upstreams on the fly via &lt;code&gt;upstreams.yaml&lt;/code&gt; — no restart needed.&lt;/li&gt;
&lt;li&gt;🔮 &lt;strong&gt;Automatic WebSocket Support:&lt;/strong&gt; Zero config — connection upgrades are handled seamlessly.&lt;/li&gt;
&lt;li&gt;🔮 &lt;strong&gt;Automatic GRPC Support:&lt;/strong&gt; Zero config, Requires &lt;code&gt;ssl&lt;/code&gt; to proxy, gRPC handled seamlessly.&lt;/li&gt;
&lt;li&gt;🔮 &lt;strong&gt;Upstreams Session Stickiness:&lt;/strong&gt; Enable/Disable Sticky sessions globally.&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;TLS Termination:&lt;/strong&gt; Fully supports TLS for upstreams and downstreams.&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Built-in Authentication&lt;/strong&gt; Basic Auth, JWT, API key.&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Header Injection:&lt;/strong&gt; Global and per-route header configuration.&lt;/li&gt;
&lt;li&gt;🧪 &lt;strong&gt;Health Checks:&lt;/strong&gt; Pluggable health check methods for upstreams.&lt;/li&gt;
&lt;li&gt;🛰️ &lt;strong&gt;Remote Config Push:&lt;/strong&gt; Lightweight HTTP API to update configs from CI/CD or other systems.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📁 File Structure
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── main.yaml           # Main configuration loaded at startup
├── upstreams.yaml      # Watched config with upstream mappings
├── etc/
│   ├── server.crt      # TLS certificate (required if using TLS)
│   └── key.pem         # TLS private key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠 Configuration Overview
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔧 &lt;code&gt;main.yaml&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Example Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;threads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Number of running daemon threads. Optional, defaults to 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;user&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;aralez&lt;/td&gt;
&lt;td&gt;Optional, Username for running aralez after dropping root privileges, requires to launch as root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;aralez&lt;/td&gt;
&lt;td&gt;Optional,Group for running aralez after dropping root privileges, requires to launch as root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;daemon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;Run in background (boolean)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;upstream_keepalive_pool_size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Pool size for upstream keepalive connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pid_file&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;/tmp/aralez.pid&lt;/td&gt;
&lt;td&gt;Path to PID file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;error_log&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;/tmp/aralez_err.log&lt;/td&gt;
&lt;td&gt;Path to error log file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;upgrade_sock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;/tmp/aralez.sock&lt;/td&gt;
&lt;td&gt;Path to live upgrade socket file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;config_address&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0.0.0:3000&lt;/td&gt;
&lt;td&gt;HTTP API address for pushing upstreams.yaml from remote location&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;config_tls_address&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0.0.0:3001&lt;/td&gt;
&lt;td&gt;HTTPS API address for pushing upstreams.yaml from remote location&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;config_tls_certificate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;etc/server.crt&lt;/td&gt;
&lt;td&gt;Certificate file path for API. Mandatory if proxy_address_tls is set, else optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;proxy_tls_grade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(high, medium, unsafe)&lt;/td&gt;
&lt;td&gt;Grade of TLS ciphers, for easy configuration. High matches Qualys SSL Labs A+ (defaults to medium)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;config_tls_key_file&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;etc/key.pem&lt;/td&gt;
&lt;td&gt;Private Key file path. Mandatory if proxy_address_tls is set, else optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;proxy_address_http&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0.0.0:6193&lt;/td&gt;
&lt;td&gt;Aralez HTTP bind address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;proxy_address_tls&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0.0.0:6194&lt;/td&gt;
&lt;td&gt;Aralez HTTPS bind address (Optional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;proxy_certificates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;etc/certs/&lt;/td&gt;
&lt;td&gt;The directory containing certificate and key files. In a format {NAME}.crt, {NAME}.key.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;upstreams_conf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;etc/upstreams.yaml&lt;/td&gt;
&lt;td&gt;The location of upstreams file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;log_level&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;info&lt;/td&gt;
&lt;td&gt;Log level , possible values : info, warn, error, debug, trace, off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;hc_method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HEAD&lt;/td&gt;
&lt;td&gt;Healthcheck method (HEAD, GET, POST are supported) UPPERCASE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;hc_interval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Interval for health checks in seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;master_key&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5aeff7f9-7b94-447c-af60-e8c488544a3e&lt;/td&gt;
&lt;td&gt;Master key for working with API server and JWT Secret generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;file_server_folder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;/some/local/folder&lt;/td&gt;
&lt;td&gt;Optional, local folder to serve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;file_server_address&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;127.0.0.1:3002&lt;/td&gt;
&lt;td&gt;Optional, Local address for file server. Can set as upstream for public access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;config_api_enabled&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;Boolean to enable/disable remote config push capability&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  🌐 &lt;code&gt;upstreams.yaml&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;provider&lt;/code&gt;: &lt;code&gt;file&lt;/code&gt; or &lt;code&gt;consul&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;File-based upstreams define:

&lt;ul&gt;
&lt;li&gt;Hostnames and routing paths&lt;/li&gt;
&lt;li&gt;Backend servers (load-balanced)&lt;/li&gt;
&lt;li&gt;Optional request headers, specific to this upstream&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Global headers (e.g., CORS) apply to all proxied responses&lt;/li&gt;
&lt;li&gt;Optional authentication (Basic, API Key, JWT)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🛠 Installation
&lt;/h2&gt;

&lt;p&gt;Download the prebuilt binary for your architecture from releases section of &lt;a href="https://github.com/sadoyan/aralez/releases" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; repo&lt;br&gt;
Make the binary executable &lt;code&gt;chmod 755 ./aralez-VERSION&lt;/code&gt; and run.&lt;/p&gt;

&lt;p&gt;File names:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aralez-x86_64-musl.gz&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Static Linux x86_64 binary, without any system dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aralez-x86_64-glibc.gz&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dynamic Linux x86_64 binary, with minimal system dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aralez-aarch64-musl.gz&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Static Linux ARM64 binary, without any system dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aralez-aarch64-glibc.gz&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dynamic Linux ARM64 binary, with minimal system dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sadoyan/aralez&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Docker image on Debian 13 slim (&lt;a href="https://hub.docker.com/r/sadoyan/aralez" rel="noopener noreferrer"&gt;https://hub.docker.com/r/sadoyan/aralez&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Via docker&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /local/path/to/config:/etc/aralez:ro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 443:443 &lt;span class="se"&gt;\&lt;/span&gt;
  sadoyan/aralez
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 Note
&lt;/h2&gt;

&lt;p&gt;In general &lt;strong&gt;glibc&lt;/strong&gt; builds are working faster, but have few, basic, system dependencies for example :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    linux-vdso.so.1 (0x00007ffeea33b000)
    libgcc_s.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f09e7377000)
    libm.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libm.so.6 (0x00007f09e6320000)
    libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f09e613f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f09e73b1000)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are common to any Linux systems, so the binary should work on almost any Linux system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;musl&lt;/strong&gt; builds are 100% portable, static compiled binaries and have zero system depencecies.&lt;br&gt;
In general musl builds have a little less performance.&lt;br&gt;
The most intensive tests shows 107k-110k requests per second on &lt;strong&gt;Glibc&lt;/strong&gt; binaries against 97k-100k &lt;strong&gt;Musl&lt;/strong&gt; ones.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔌 Running the Proxy
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./aralez &lt;span class="nt"&gt;-c&lt;/span&gt; path/to/main.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  🔌 Systemd integration
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/systemd/system/aralez.service &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[Service]
Type=forking
PIDFile=/run/aralez.pid
ExecStart=/bin/aralez -d -c /etc/aralez.conf
ExecReload=kill -QUIT &lt;/span&gt;&lt;span class="nv"&gt;$MAINPID&lt;/span&gt;&lt;span class="sh"&gt;
ExecReload=/bin/aralez -u -d -c /etc/aralez.conf
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;aralez.service.
systemctl restart aralez.service.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  💡 Example
&lt;/h2&gt;

&lt;p&gt;A sample &lt;code&gt;upstreams.yaml&lt;/code&gt; entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file"&lt;/span&gt;
&lt;span class="na"&gt;sticky_sessions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;to_https&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;rate_limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Access-Control-Allow-Origin:*"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Access-Control-Allow-Methods:POST,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;GET,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;OPTIONS"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Access-Control-Max-Age:86400"&lt;/span&gt;
&lt;span class="na"&gt;authorization&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jwt"&lt;/span&gt;
  &lt;span class="na"&gt;creds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;910517d9-f9a1-48de-8826-dbadacbd84af-cb6f830e-ab16-47ec-9d8f-0090de732774"&lt;/span&gt;
&lt;span class="na"&gt;myhost.mydomain.com&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;rate_limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
      &lt;span class="na"&gt;to_https&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Some-Thing:Yaaaaaaaaaaaaaaa"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Proxy-From:Hopaaaaaaaaaaaar"&lt;/span&gt;
      &lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:8000"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.2:8000"&lt;/span&gt;
  &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/foo"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;to_https&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Another-Header:Hohohohoho"&lt;/span&gt;
      &lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.4:8443"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.5:8443"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This means:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sticky sessions are disabled globally. This setting applies to all upstreams. If enabled all requests will be 301 redirected to HTTPS.&lt;/li&gt;
&lt;li&gt;HTTP to HTTPS redirect disabled globally, but can be overridden by &lt;code&gt;to_https&lt;/code&gt; setting per upstream.&lt;/li&gt;
&lt;li&gt;Requests to each hosted domains will be limited to 10 requests per second per virtualhost.

&lt;ul&gt;
&lt;li&gt;Requests limits are calculated per requester ip plus requested virtualhost.&lt;/li&gt;
&lt;li&gt;If the requester exceeds the limit it will receive &lt;code&gt;429 Too Many Requests&lt;/code&gt; error.&lt;/li&gt;
&lt;li&gt;Optional. Rate limiter will be disabled if the parameter is entirely removed from config.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Requests to &lt;code&gt;myhost.mydomain.com/&lt;/code&gt; will be limited to 20 requests per second.&lt;/li&gt;

&lt;li&gt;Requests to &lt;code&gt;myhost.mydomain.com/&lt;/code&gt; will be proxied to &lt;code&gt;127.0.0.1&lt;/code&gt; and &lt;code&gt;127.0.0.2&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Plain HTTP to &lt;code&gt;myhost.mydomain.com/foo&lt;/code&gt; will get 301 redirect to configured TLS port of Aralez.&lt;/li&gt;

&lt;li&gt;Requests to &lt;code&gt;myhost.mydomain.com/foo&lt;/code&gt; will be proxied to &lt;code&gt;127.0.0.4&lt;/code&gt; and &lt;code&gt;127.0.0.5&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;SSL/TLS for upstreams is detected automatically, no need to set any config parameter.

&lt;ul&gt;
&lt;li&gt;Assuming the &lt;code&gt;127.0.0.5:8443&lt;/code&gt; is SSL protected. The inner traffic will use TLS.&lt;/li&gt;
&lt;li&gt;Self-signed certificates are silently accepted.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Global headers (CORS for this case) will be injected to all upstreams.&lt;/li&gt;

&lt;li&gt;Additional headers will be injected into the request for &lt;code&gt;myhost.mydomain.com&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;You can choose any path, deep nested paths are supported, the best match chosen.&lt;/li&gt;

&lt;li&gt;All requests to servers will require JWT token authentication (You can comment out the authorization to disable it),

&lt;ul&gt;
&lt;li&gt;Firs parameter specifies the mechanism of authorisation &lt;code&gt;jwt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Second is the secret key for validating &lt;code&gt;jwt&lt;/code&gt; tokens&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Hot Reload
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Changes to &lt;code&gt;upstreams.yaml&lt;/code&gt; are applied immediately.&lt;/li&gt;
&lt;li&gt;No need to restart the proxy — just save the file.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;consul&lt;/code&gt; provider is chosen, upstreams will be periodically update from Consul's API.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔐 TLS Support
&lt;/h2&gt;

&lt;p&gt;To enable TLS for A proxy server: Currently only OpenSSL is supported, working on Boringssl and Rustls&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set &lt;code&gt;proxy_address_tls&lt;/code&gt; in &lt;code&gt;main.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Provide &lt;code&gt;tls_certificate&lt;/code&gt; and &lt;code&gt;tls_key_file&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📡 Remote Config API
&lt;/h2&gt;

&lt;p&gt;Push new &lt;code&gt;upstreams.yaml&lt;/code&gt; over HTTP to &lt;code&gt;config_address&lt;/code&gt; (&lt;code&gt;:3000&lt;/code&gt; by default). Useful for CI/CD automation or remote config updates.&lt;br&gt;
URL parameter. &lt;code&gt;key=MASTERKEY&lt;/code&gt; is required. &lt;code&gt;MASTERKEY&lt;/code&gt; is the value of &lt;code&gt;master_key&lt;/code&gt; in the &lt;code&gt;main.yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-XPOST&lt;/span&gt; &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @./etc/upstreams.txt 127.0.0.1:3000/conf?key&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MASTERKEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔐 Authentication (Optional)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adds authentication to all requests.&lt;/li&gt;
&lt;li&gt;Only one method can be active at a time.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;basic&lt;/code&gt; : Standard HTTP Basic Authentication requests.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apikey&lt;/code&gt; : Authentication via &lt;code&gt;x-api-key&lt;/code&gt; header, which should match the value in config.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jwt&lt;/code&gt;: JWT authentication implemented via &lt;code&gt;araleztoken=&lt;/code&gt; url parameter. &lt;code&gt;/some/url?araleztoken=TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jwt&lt;/code&gt;: JWT authentication implemented via &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt; header.

&lt;ul&gt;
&lt;li&gt;To obtain JWT a token, you should send &lt;strong&gt;generate&lt;/strong&gt; request to built in api server's &lt;code&gt;/jwt&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;master_key&lt;/code&gt;: should match configured &lt;code&gt;masterkey&lt;/code&gt; in &lt;code&gt;main.yaml&lt;/code&gt; and &lt;code&gt;upstreams.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;owner&lt;/code&gt; : Just a placeholder, can be anything.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;valid&lt;/code&gt; : Time in minutes during which the generated token will be valid.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example JWT token generation request&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PAYLOAD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{
    "master_key": "910517d9-f9a1-48de-8826-dbadacbd84af-cb6f830e-ab16-47ec-9d8f-0090de732774",
    "owner": "valod",
    "valid": 10
}'&lt;/span&gt;

&lt;span class="nv"&gt;TOK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-XPOST&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAYLOAD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;  http://127.0.0.1:3000/jwt  | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'"'&lt;/span&gt; &lt;span class="nt"&gt;-f4&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$TOK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example Request with JWT token&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;Authorization: Bearer&lt;/code&gt; header&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOK&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Host: myip.mydomain.com'&lt;/span&gt; http://127.0.0.1:6193/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With URL parameter (Very useful if you want to generate and share temporary links)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Host: myip.mydomain.com'&lt;/span&gt; &lt;span class="s2"&gt;"http://127.0.0.1:6193/?araleztoken=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOK&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example Request with API Key&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-api-key: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APIKEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Host: myip.mydomain.com'&lt;/span&gt; http://127.0.0.1:6193/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example Request with Basic Auth&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl  &lt;span class="nt"&gt;-u&lt;/span&gt; username:password &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Host: myip.mydomain.com'&lt;/span&gt; http://127.0.0.1:6193/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📃 License
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.apache.org/licenses/LICENSE-2.0" rel="noopener noreferrer"&gt;Apache License Version 2.0&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Uses Pingora under the hood for efficiency and flexibility.&lt;/li&gt;
&lt;li&gt;Designed for edge proxying, internal routing, or hybrid cloud scenarios.&lt;/li&gt;
&lt;li&gt;Transparent, fully automatic WebSocket upgrade support.&lt;/li&gt;
&lt;li&gt;Transparent, fully automatic gRPC proxy.&lt;/li&gt;
&lt;li&gt;Sticky session support.&lt;/li&gt;
&lt;li&gt;HTTP2 ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 Why Choose Aralez? – Feature Comparison&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Aralez&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Nginx&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;HAProxy&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Traefik&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hot Reload&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes (live, API/file)&lt;/td&gt;
&lt;td&gt;⚠️ Reloads config&lt;/td&gt;
&lt;td&gt;⚠️ Reloads config&lt;/td&gt;
&lt;td&gt;✅ Yes (dynamic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JWT Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;❌ External scripts&lt;/td&gt;
&lt;td&gt;❌ External Lua or agent&lt;/td&gt;
&lt;td&gt;⚠️ With plugins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebSocket Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Automatic&lt;/td&gt;
&lt;td&gt;⚠️ Manual config&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gRPC Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Automatic (no config)&lt;/td&gt;
&lt;td&gt;⚠️ Manual + HTTP/2 + TLS&lt;/td&gt;
&lt;td&gt;⚠️ Complex setup&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TLS Termination&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in (OpenSSL)&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TLS Upstream Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Automatic&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP/2 Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Automatic&lt;/td&gt;
&lt;td&gt;⚠️ Requires extra config&lt;/td&gt;
&lt;td&gt;⚠️ Requires build flags&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sticky Sessions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Cookie-based&lt;/td&gt;
&lt;td&gt;⚠️ In plus version only&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prometheus Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;a href="https://github.com/sadoyan/aralez/blob/main/METRICS.md" rel="noopener noreferrer"&gt;Built in&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;⚠️ With Lua or exporter&lt;/td&gt;
&lt;td&gt;⚠️ With external script&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Built With&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🦀 Rust&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  💡 Simple benchmark by &lt;a href="https://github.com/hatoo/oha" rel="noopener noreferrer"&gt;Oha&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;⚠️ These benchmarks use :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 async Rust echo servers on a local network with 1Gbit as upstreams.&lt;/li&gt;
&lt;li&gt;A dedicated server for running &lt;strong&gt;Aralez&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A dedicated server for running &lt;strong&gt;Oha&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The following upstreams configuration.&lt;/li&gt;
&lt;li&gt;9 test URLs from simple &lt;code&gt;/&lt;/code&gt; to nested up to 7 subpaths.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;myhost.mydomain.com&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;to_https&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Proxy-From:Aralez"&lt;/span&gt;
        &lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.211.211:8000"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.211.212:8000"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.211.213:8000"&lt;/span&gt;
    &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/ping"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;to_https&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Some-Thing:Yaaaaaaaaaaaaaaa"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Proxy-From:Aralez"&lt;/span&gt;
        &lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.211.211:8000"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.211.212:8000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 Results reflect synthetic performance under optimal conditions.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CPU : Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz&lt;/li&gt;
&lt;li&gt;300 : simultaneous connections&lt;/li&gt;
&lt;li&gt;Duration : 10 Minutes&lt;/li&gt;
&lt;li&gt;Binary : aralez-x86_64-glibc
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Summary:
  Success rate: 100.00%
  Total:    600.0027 secs
  Slowest:  0.2138 secs
  Fastest:  0.0002 secs
  Average:  0.0023 secs
  Requests/sec: 129777.3838

  Total data:   0 B
  Size/request: 0 B
  Size/sec: 0 B

Response time histogram:
  0.000 [1]        |
  0.022 [77668026] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.043 [190362]   |
  0.064 [7908]     |
  0.086 [319]      |
  0.107 [4]        |
  0.128 [0]        |
  0.150 [0]        |
  0.171 [0]        |
  0.192 [0]        |
  0.214 [4]        |

Response time distribution:
  10.00% in 0.0012 secs
  25.00% in 0.0016 secs
  50.00% in 0.0020 secs
  75.00% in 0.0026 secs
  90.00% in 0.0033 secs
  95.00% in 0.0040 secs
  99.00% in 0.0078 secs
  99.90% in 0.0278 secs
  99.99% in 0.0434 secs


Details (average, fastest, slowest):
  DNS+dialup:   0.0161 secs, 0.0002 secs, 0.0316 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0000 secs

Status code distribution:
  [200] 77866624 responses

Error distribution:
  [158] aborted due to deadline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8sdz7mbyntrm2ab7kx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8sdz7mbyntrm2ab7kx0.png" alt="Aralez" width="600" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU : Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz&lt;/li&gt;
&lt;li&gt;300 : simultaneous connections&lt;/li&gt;
&lt;li&gt;Duration : 10 Minutes&lt;/li&gt;
&lt;li&gt;Binary : aralez-x86_64-musl
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Summary:
  Success rate: 100.00%
  Total:    600.0021 secs
  Slowest:  0.2182 secs
  Fastest:  0.0002 secs
  Average:  0.0024 secs
  Requests/sec: 123870.5820

  Total data:   0 B
  Size/request: 0 B
  Size/sec: 0 B

Response time histogram:
  0.000 [1]        |
  0.022 [74254679] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.044 [61400]    |
  0.066 [5911]     |
  0.087 [385]      |
  0.109 [0]        |
  0.131 [0]        |
  0.153 [0]        |
  0.175 [0]        |
  0.196 [0]        |
  0.218 [1]        |

Response time distribution:
  10.00% in 0.0012 secs
  25.00% in 0.0016 secs
  50.00% in 0.0021 secs
  75.00% in 0.0028 secs
  90.00% in 0.0037 secs
  95.00% in 0.0045 secs
  99.00% in 0.0077 secs
  99.90% in 0.0214 secs
  99.99% in 0.0424 secs


Details (average, fastest, slowest):
  DNS+dialup:   0.0066 secs, 0.0002 secs, 0.0210 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0000 secs

Status code distribution:
  [200] 74322377 responses

Error distribution:
  [228] aborted due to deadline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqftxo5i04kaah2fdqny3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqftxo5i04kaah2fdqny3.png" alt="Aralez" width="600" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Aralez, Nginx, Traefik performance benchmark
&lt;/h2&gt;

&lt;p&gt;This benchmark is done on 4 servers. With CPU Intel(R) Xeon(R) E-2174G CPU @ 3.80GHz, 64 GB RAM.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sever runs Aralez, Traefik, Nginx on different ports. Tuned as much as I could .&lt;/li&gt;
&lt;li&gt;3x Upstreams servers, running Nginx. Replying with dummy json hardcoded in config file for max performance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All servers are connected to the same switch with 1GB port in datacenter , not a home lab. The results:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6cbukjbxz49hjjj9u96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6cbukjbxz49hjjj9u96.png" alt="Aralez" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The results show requests per second performed by Load balancer. You can see 3 batches with 800 concurrent users.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Requests via http1.1 to plain text endpoint.&lt;/li&gt;
&lt;li&gt;Requests to via http2 to SSL endpoint.&lt;/li&gt;
&lt;li&gt;Mixed workload with plain http1.1 and htt2 SSL.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>rust</category>
      <category>webdev</category>
      <category>ingres</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
