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