From 286ea6a66c6c16b581089f85c36536c6687e71fe Mon Sep 17 00:00:00 2001 From: psun256 Date: Thu, 6 Nov 2025 12:48:00 -0500 Subject: [PATCH] initial commit --- README.md | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ab29caf --- /dev/null +++ b/README.md @@ -0,0 +1,105 @@ +# nginy +Production't graden't load balancer. + +## Quick links + +## Todo +- [ ] architecture astronauting +- [ ] stream / session handling (i think wrapper around tokio TcpStream) +- [ ] basic backend pooling +- [ ] layer 4 load balancing + +## notes +tcp, for nginx (and haproxy, its similar): +```c +// nginx +struct ngx_connection_s { + void *data; + ngx_event_t *read; + ngx_event_t *write; + + ngx_socket_t fd; + + ngx_recv_pt recv; // fn pointer to whatever recv fn used (different for idfferent platforms / protocol + ngx_send_pt send; // ditto + ngx_recv_chain_pt recv_chain; + ngx_send_chain_pt send_chain; + + ngx_listening_t *listening; + + off_t sent; + + ngx_log_t *log; + + ngx_pool_t *pool; + + int type; + + struct sockaddr *sockaddr; + socklen_t socklen; + ngx_str_t addr_text; + + ngx_proxy_protocol_t *proxy_protocol; + +#if (NGX_QUIC || NGX_COMPAT) + ngx_quic_stream_t *quic; +#endif + +#if (NGX_SSL || NGX_COMPAT) + ngx_ssl_connection_t *ssl; +#endif + + ngx_udp_connection_t *udp; // additional stuff for UDP (which is technically connectionless, but they use timeouts and a rbtree to store "sessions") + + struct sockaddr *local_sockaddr; + socklen_t local_socklen; + + ngx_buf_t *buffer; + + ngx_queue_t queue; + + ngx_atomic_uint_t number; + + ngx_msec_t start_time; + ngx_uint_t requests; + + unsigned buffered:8; + + unsigned log_error:3; /* ngx_connection_log_error_e */ + + unsigned timedout:1; + unsigned error:1; + unsigned destroyed:1; + unsigned pipeline:1; + + unsigned idle:1; + unsigned reusable:1; + unsigned close:1; + unsigned shared:1; + + unsigned sendfile:1; + unsigned sndlowat:1; + unsigned tcp_nodelay:2; /* ngx_connection_tcp_nodelay_e */ + unsigned tcp_nopush:2; /* ngx_connection_tcp_nopush_e */ + + unsigned need_last_buf:1; + unsigned need_flush_buf:1; + +#if (NGX_HAVE_SENDFILE_NODISKIO || NGX_COMPAT) + unsigned busy_count:2; +#endif + +#if (NGX_THREADS || NGX_COMPAT) + ngx_thread_task_t *sendfile_task; +#endif +}; +``` +process to load balance: +- accept incoming connection +- create some kind of stream / session object + - nginx use this to abstract around tcp and udp layers + - for us we probably don't need as detailed as them, since we have tokio::net, so itll be a wrapper around TcpStream +- ask the load balancing algorithm which server in the pool to route to +- connect to the server +- proxy the data (copy_bidirectional? maybe we want some metrics or logging, so might do manually) +- cleanup when smoeone leavesr or something goes wrong (with TCP, OS / tokio will tell us, with UDP probably just timeout based, and a periodic sweep of all sessions) \ No newline at end of file