xref: /unit/src/nxt_router.h (revision 1936:953434450ea9)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #ifndef _NXT_ROUTER_H_INCLUDED_
8 #define _NXT_ROUTER_H_INCLUDED_
9 
10 
11 #include <nxt_main.h>
12 #include <nxt_runtime.h>
13 #include <nxt_main_process.h>
14 
15 typedef struct nxt_http_request_s  nxt_http_request_t;
16 #include <nxt_application.h>
17 
18 
19 typedef struct nxt_http_action_s        nxt_http_action_t;
20 typedef struct nxt_http_routes_s        nxt_http_routes_t;
21 typedef struct nxt_http_client_ip_s     nxt_http_client_ip_t;
22 typedef struct nxt_upstream_s           nxt_upstream_t;
23 typedef struct nxt_upstreams_s          nxt_upstreams_t;
24 typedef struct nxt_router_access_log_s  nxt_router_access_log_t;
25 
26 
27 #define NXT_HTTP_ACTION_ERROR  ((nxt_http_action_t *) -1)
28 
29 
30 typedef struct {
31     nxt_thread_spinlock_t    lock;
32     nxt_queue_t              engines;
33 
34     nxt_queue_t              sockets;  /* of nxt_socket_conf_t */
35     nxt_queue_t              apps;     /* of nxt_app_t */
36 
37     nxt_router_access_log_t  *access_log;
38 } nxt_router_t;
39 
40 
41 typedef struct {
42     uint32_t                 count;
43     uint32_t                 threads;
44 
45     nxt_mp_t                 *mem_pool;
46 
47     nxt_router_t             *router;
48     nxt_http_routes_t        *routes;
49     nxt_upstreams_t          *upstreams;
50 
51     nxt_lvlhsh_t             mtypes_hash;
52     nxt_lvlhsh_t             apps_hash;
53 
54     nxt_router_access_log_t  *access_log;
55 } nxt_router_conf_t;
56 
57 
58 typedef struct {
59     nxt_event_engine_t     *engine;
60     nxt_work_t             *jobs;
61 
62     enum {
63         NXT_ROUTER_ENGINE_KEEP = 0,
64         NXT_ROUTER_ENGINE_ADD,
65         NXT_ROUTER_ENGINE_DELETE,
66     }                      action;
67 } nxt_router_engine_conf_t;
68 
69 
70 typedef struct {
71 #if (NXT_TLS)
72     nxt_queue_t            tls;        /* of nxt_router_tlssock_t */
73 #endif
74 
75     nxt_queue_t            apps;       /* of nxt_app_t */
76     nxt_queue_t            previous;   /* of nxt_app_t */
77 
78     uint32_t               new_threads;
79     uint32_t               stream;
80     uint32_t               count;
81 
82     nxt_event_engine_t     *engine;
83     nxt_port_t             *port;
84     nxt_array_t            *engines;
85     nxt_router_conf_t      *router_conf;
86     nxt_mp_t               *mem_pool;
87 } nxt_router_temp_conf_t;
88 
89 
90 typedef struct {
91     nxt_task_t              task;
92     nxt_work_t              work;
93     nxt_router_temp_conf_t  *tmcf;
94 } nxt_joint_job_t;
95 
96 
97 typedef struct {
98     uint32_t               use_count;
99     nxt_app_t              *app;
100     nxt_timer_t            idle_timer;
101     nxt_work_t             free_app_work;
102 } nxt_app_joint_t;
103 
104 
105 struct nxt_app_s {
106     nxt_thread_mutex_t     mutex;       /* Protects ports queue. */
107     nxt_queue_t            ports;       /* of nxt_port_t.app_link */
108     nxt_lvlhsh_t           port_hash;   /* of nxt_port_t */
109 
110     nxt_queue_t            spare_ports; /* of nxt_port_t.idle_link */
111     nxt_queue_t            idle_ports;  /* of nxt_port_t.idle_link */
112     nxt_work_t             adjust_idle_work;
113     nxt_event_engine_t     *engine;
114 
115     nxt_str_t              name;
116 
117     uint32_t               port_hash_count;
118 
119     uint32_t               active_requests;
120     uint32_t               pending_processes;
121     uint32_t               processes;
122     uint32_t               idle_processes;
123 
124     uint32_t               max_processes;
125     uint32_t               spare_processes;
126     uint32_t               max_pending_processes;
127     uint32_t               max_requests;
128 
129     uint32_t               generation;
130 
131     nxt_msec_t             timeout;
132     nxt_msec_t             idle_timeout;
133 
134     nxt_str_t              *targets;
135 
136     nxt_app_type_t         type:8;
137 
138     nxt_mp_t               *mem_pool;
139     nxt_queue_link_t       link;
140 
141     nxt_str_t              conf;
142 
143     nxt_atomic_t           use_count;
144     nxt_queue_t            ack_waiting_req; /* of nxt_http_request_t.app_link */
145 
146     nxt_app_joint_t        *joint;
147     nxt_port_t             *shared_port;
148 
149     nxt_port_mmaps_t       outgoing;
150 };
151 
152 
153 typedef struct {
154     size_t                 max_frame_size;
155     nxt_msec_t             read_timeout;
156     nxt_msec_t             keepalive_interval;
157 } nxt_websocket_conf_t;
158 
159 
160 typedef struct {
161     uint32_t               count;
162     nxt_queue_link_t       link;
163     nxt_router_conf_t      *router_conf;
164 
165     nxt_http_action_t      *action;
166 
167     /*
168      * A listen socket time can be shorter than socket configuration life
169      * time, so a copy of the non-wildcard socket sockaddr is stored here
170      * to be used as a local sockaddr in connections.
171      */
172     nxt_sockaddr_t         *sockaddr;
173 
174     nxt_listen_socket_t    *listen;
175 
176     size_t                 header_buffer_size;
177     size_t                 large_header_buffer_size;
178     size_t                 large_header_buffers;
179     size_t                 body_buffer_size;
180     size_t                 max_body_size;
181     size_t                 proxy_header_buffer_size;
182     size_t                 proxy_buffer_size;
183     size_t                 proxy_buffers;
184 
185     nxt_msec_t             idle_timeout;
186     nxt_msec_t             header_read_timeout;
187     nxt_msec_t             body_read_timeout;
188     nxt_msec_t             send_timeout;
189     nxt_msec_t             proxy_timeout;
190     nxt_msec_t             proxy_send_timeout;
191     nxt_msec_t             proxy_read_timeout;
192 
193     nxt_websocket_conf_t   websocket_conf;
194 
195     nxt_str_t              body_temp_path;
196 
197     uint8_t                discard_unsafe_fields;  /* 1 bit */
198 
199     nxt_http_client_ip_t   *client_ip;
200 
201 #if (NXT_TLS)
202     nxt_tls_conf_t         *tls;
203 #endif
204 } nxt_socket_conf_t;
205 
206 
207 typedef struct {
208     uint32_t               count;
209     nxt_queue_link_t       link;
210     nxt_event_engine_t     *engine;
211     nxt_socket_conf_t      *socket_conf;
212 
213     nxt_joint_job_t        *close_job;
214 
215     nxt_upstream_t         **upstreams;
216 
217     /* Modules configuraitons. */
218 } nxt_socket_conf_joint_t;
219 
220 
221 struct nxt_router_access_log_s {
222     void                   (*handler)(nxt_task_t *task, nxt_http_request_t *r,
223                                       nxt_router_access_log_t *access_log);
224     nxt_fd_t               fd;
225     nxt_str_t              path;
226     uint32_t               count;
227 };
228 
229 
230 void nxt_router_process_http_request(nxt_task_t *task, nxt_http_request_t *r,
231     nxt_http_action_t *action);
232 void nxt_router_app_port_close(nxt_task_t *task, nxt_port_t *port);
233 nxt_int_t nxt_router_application_init(nxt_router_conf_t *rtcf, nxt_str_t *name,
234     nxt_str_t *target, nxt_http_action_t *action);
235 void nxt_router_listen_event_release(nxt_task_t *task, nxt_listen_event_t *lev,
236     nxt_socket_conf_joint_t *joint);
237 void nxt_router_conf_release(nxt_task_t *task, nxt_socket_conf_joint_t *joint);
238 
239 
240 #endif  /* _NXT_ROUTER_H_INCLUDED_ */
241