xref: /unit/src/nxt_router.h (revision 2450:14277f21a722)
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_forward_s       nxt_http_forward_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     nxt_tstr_state_t         *tstr_state;
47 
48     nxt_router_t             *router;
49     nxt_http_routes_t        *routes;
50     nxt_upstreams_t          *upstreams;
51 
52     nxt_lvlhsh_t             mtypes_hash;
53     nxt_lvlhsh_t             apps_hash;
54 
55     nxt_router_access_log_t  *access_log;
56     nxt_tstr_t               *log_format;
57 } nxt_router_conf_t;
58 
59 
60 typedef struct {
61     nxt_event_engine_t     *engine;
62     nxt_work_t             *jobs;
63 
64     enum {
65         NXT_ROUTER_ENGINE_KEEP = 0,
66         NXT_ROUTER_ENGINE_ADD,
67         NXT_ROUTER_ENGINE_DELETE,
68     }                      action;
69 } nxt_router_engine_conf_t;
70 
71 
72 typedef struct {
73 #if (NXT_TLS)
74     nxt_queue_t            tls;        /* of nxt_router_tlssock_t */
75 #endif
76 
77 #if (NXT_HAVE_NJS)
78     nxt_queue_t            js_modules;
79 #endif
80 
81     nxt_queue_t            apps;       /* of nxt_app_t */
82     nxt_queue_t            previous;   /* of nxt_app_t */
83 
84     uint32_t               new_threads;
85     uint32_t               stream;
86     uint32_t               count;
87 
88     nxt_event_engine_t     *engine;
89     nxt_port_t             *port;
90     nxt_array_t            *engines;
91     nxt_router_conf_t      *router_conf;
92     nxt_mp_t               *mem_pool;
93 } nxt_router_temp_conf_t;
94 
95 
96 typedef struct {
97     nxt_task_t              task;
98     nxt_work_t              work;
99     nxt_router_temp_conf_t  *tmcf;
100 } nxt_joint_job_t;
101 
102 
103 typedef struct {
104     uint32_t               use_count;
105     nxt_app_t              *app;
106     nxt_timer_t            idle_timer;
107     nxt_work_t             free_app_work;
108 } nxt_app_joint_t;
109 
110 
111 struct nxt_app_s {
112     nxt_thread_mutex_t     mutex;       /* Protects ports queue. */
113     nxt_queue_t            ports;       /* of nxt_port_t.app_link */
114     nxt_lvlhsh_t           port_hash;   /* of nxt_port_t */
115 
116     nxt_queue_t            spare_ports; /* of nxt_port_t.idle_link */
117     nxt_queue_t            idle_ports;  /* of nxt_port_t.idle_link */
118     nxt_work_t             adjust_idle_work;
119     nxt_event_engine_t     *engine;
120 
121     nxt_str_t              name;
122 
123     uint32_t               port_hash_count;
124 
125     uint32_t               active_requests;
126     uint32_t               pending_processes;
127     uint32_t               processes;
128     uint32_t               idle_processes;
129 
130     uint32_t               max_processes;
131     uint32_t               spare_processes;
132     uint32_t               max_pending_processes;
133 
134     uint32_t               generation;
135     uint32_t               proto_port_requests;
136 
137     nxt_msec_t             timeout;
138     nxt_msec_t             idle_timeout;
139 
140     nxt_str_t              *targets;
141 
142     nxt_app_type_t         type:8;
143 
144     nxt_mp_t               *mem_pool;
145     nxt_queue_link_t       link;
146 
147     nxt_str_t              conf;
148 
149     nxt_atomic_t           use_count;
150     nxt_queue_t            ack_waiting_req; /* of nxt_http_request_t.app_link */
151 
152     nxt_app_joint_t        *joint;
153     nxt_port_t             *shared_port;
154     nxt_port_t             *proto_port;
155 
156     nxt_port_mmaps_t       outgoing;
157 };
158 
159 
160 typedef struct {
161     size_t                 max_frame_size;
162     nxt_msec_t             read_timeout;
163     nxt_msec_t             keepalive_interval;
164 } nxt_websocket_conf_t;
165 
166 
167 typedef struct {
168     uint32_t               count;
169     nxt_queue_link_t       link;
170     nxt_router_conf_t      *router_conf;
171 
172     nxt_http_action_t      *action;
173 
174     /*
175      * A listen socket time can be shorter than socket configuration life
176      * time, so a copy of the non-wildcard socket sockaddr is stored here
177      * to be used as a local sockaddr in connections.
178      */
179     nxt_sockaddr_t         *sockaddr;
180 
181     nxt_listen_socket_t    *listen;
182 
183     size_t                 header_buffer_size;
184     size_t                 large_header_buffer_size;
185     size_t                 large_header_buffers;
186     size_t                 body_buffer_size;
187     size_t                 max_body_size;
188     size_t                 proxy_header_buffer_size;
189     size_t                 proxy_buffer_size;
190     size_t                 proxy_buffers;
191 
192     nxt_msec_t             idle_timeout;
193     nxt_msec_t             header_read_timeout;
194     nxt_msec_t             body_read_timeout;
195     nxt_msec_t             send_timeout;
196     nxt_msec_t             proxy_timeout;
197     nxt_msec_t             proxy_send_timeout;
198     nxt_msec_t             proxy_read_timeout;
199 
200     nxt_websocket_conf_t   websocket_conf;
201 
202     nxt_str_t              body_temp_path;
203 
204     uint8_t                log_route;  /* 1 bit */
205 
206     uint8_t                discard_unsafe_fields;  /* 1 bit */
207 
208     uint8_t                server_version;         /* 1 bit */
209 
210     nxt_http_forward_t     *forwarded;
211     nxt_http_forward_t     *client_ip;
212 
213 #if (NXT_TLS)
214     nxt_tls_conf_t         *tls;
215 #endif
216 } nxt_socket_conf_t;
217 
218 
219 typedef struct {
220     uint32_t               count;
221     nxt_queue_link_t       link;
222     nxt_event_engine_t     *engine;
223     nxt_socket_conf_t      *socket_conf;
224 
225     nxt_joint_job_t        *close_job;
226 
227     nxt_upstream_t         **upstreams;
228 
229     /* Modules configuraitons. */
230 } nxt_socket_conf_joint_t;
231 
232 
233 struct nxt_router_access_log_s {
234     void                   (*handler)(nxt_task_t *task, nxt_http_request_t *r,
235                                       nxt_router_access_log_t *access_log,
236                                       nxt_tstr_t *format);
237     nxt_fd_t               fd;
238     nxt_str_t              path;
239     uint32_t               count;
240 };
241 
242 
243 void nxt_router_process_http_request(nxt_task_t *task, nxt_http_request_t *r,
244     nxt_http_action_t *action);
245 void nxt_router_app_port_close(nxt_task_t *task, nxt_port_t *port);
246 nxt_int_t nxt_router_application_init(nxt_router_conf_t *rtcf, nxt_str_t *name,
247     nxt_str_t *target, nxt_http_action_t *action);
248 void nxt_router_listen_event_release(nxt_task_t *task, nxt_listen_event_t *lev,
249     nxt_socket_conf_joint_t *joint);
250 
251 void nxt_router_conf_apply(nxt_task_t *task, void *obj, void *data);
252 void nxt_router_conf_error(nxt_task_t *task, nxt_router_temp_conf_t *tmcf);
253 void nxt_router_conf_release(nxt_task_t *task, nxt_socket_conf_joint_t *joint);
254 
255 nxt_int_t nxt_router_access_log_create(nxt_task_t *task,
256     nxt_router_conf_t *rtcf, nxt_conf_value_t *value);
257 void nxt_router_access_log_open(nxt_task_t *task, nxt_router_temp_conf_t *tmcf);
258 void nxt_router_access_log_use(nxt_thread_spinlock_t *lock,
259     nxt_router_access_log_t *access_log);
260 void nxt_router_access_log_release(nxt_task_t *task,
261     nxt_thread_spinlock_t *lock, nxt_router_access_log_t *access_log);
262 void nxt_router_access_log_reopen_handler(nxt_task_t *task,
263     nxt_port_recv_msg_t *msg);
264 
265 
266 extern nxt_router_t  *nxt_router;
267 
268 
269 #endif  /* _NXT_ROUTER_H_INCLUDED_ */
270