xref: /unit/src/nxt_router.h (revision 743:e0f0cd7d244a)
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_router_access_log_s  nxt_router_access_log_t;
20 
21 
22 typedef struct {
23     nxt_thread_spinlock_t    lock;
24     nxt_queue_t              engines;
25 
26     nxt_queue_t              sockets;  /* of nxt_socket_conf_t */
27     nxt_queue_t              apps;     /* of nxt_app_t */
28 
29     nxt_router_access_log_t  *access_log;
30 } nxt_router_t;
31 
32 
33 typedef struct {
34     uint32_t                 count;
35     uint32_t                 threads;
36     nxt_router_t             *router;
37     nxt_mp_t                 *mem_pool;
38 
39     nxt_router_access_log_t  *access_log;
40 } nxt_router_conf_t;
41 
42 
43 typedef struct {
44     nxt_event_engine_t     *engine;
45     nxt_work_t             *jobs;
46 
47     enum {
48         NXT_ROUTER_ENGINE_KEEP = 0,
49         NXT_ROUTER_ENGINE_ADD,
50         NXT_ROUTER_ENGINE_DELETE,
51     }                      action;
52 } nxt_router_engine_conf_t;
53 
54 
55 typedef struct {
56     nxt_queue_t            creating;   /* of nxt_socket_conf_t */
57     nxt_queue_t            pending;    /* of nxt_socket_conf_t */
58     nxt_queue_t            updating;   /* of nxt_socket_conf_t */
59     nxt_queue_t            keeping;    /* of nxt_socket_conf_t */
60     nxt_queue_t            deleting;   /* of nxt_socket_conf_t */
61 
62     nxt_queue_t            apps;       /* of nxt_app_t */
63     nxt_queue_t            previous;   /* of nxt_app_t */
64 
65     uint32_t               new_threads;
66     uint32_t               stream;
67     uint32_t               count;
68 
69     nxt_event_engine_t     *engine;
70     nxt_port_t             *port;
71     nxt_array_t            *engines;
72     nxt_router_conf_t      *router_conf;
73     nxt_mp_t               *mem_pool;
74 } nxt_router_temp_conf_t;
75 
76 
77 typedef struct {
78     nxt_task_t              task;
79     nxt_work_t              work;
80     nxt_router_temp_conf_t  *tmcf;
81 } nxt_joint_job_t;
82 
83 
84 struct nxt_app_s {
85     nxt_thread_mutex_t     mutex;    /* Protects ports queue. */
86     nxt_queue_t            ports;    /* of nxt_port_t.app_link */
87 
88     nxt_queue_t            spare_ports; /* of nxt_port_t.idle_link */
89     nxt_queue_t            idle_ports;  /* of nxt_port_t.idle_link */
90     nxt_timer_t            idle_timer;
91     nxt_work_t             adjust_idle_work;
92     nxt_event_engine_t     *engine;
93 
94     nxt_queue_t            requests; /* of nxt_req_app_link_t */
95     nxt_queue_t            pending;  /* of nxt_req_app_link_t */
96     nxt_str_t              name;
97 
98     uint32_t               pending_processes;
99     uint32_t               processes;
100     uint32_t               idle_processes;
101 
102     uint32_t               max_processes;
103     uint32_t               spare_processes;
104     uint32_t               max_pending_processes;
105     uint32_t               max_pending_responses;
106     uint32_t               max_requests;
107 
108     nxt_msec_t             timeout;
109     nxt_nsec_t             res_timeout;
110     nxt_msec_t             idle_timeout;
111 
112     nxt_app_type_t         type:8;
113     uint8_t                live;   /* 1 bit */
114 
115     nxt_queue_link_t       link;
116 
117     nxt_str_t              conf;
118 
119     nxt_atomic_t           use_count;
120 };
121 
122 
123 typedef struct {
124     uint32_t               count;
125     nxt_queue_link_t       link;
126     nxt_router_conf_t      *router_conf;
127 
128     nxt_app_t              *application;
129 
130     /*
131      * A listen socket time can be shorter than socket configuration life
132      * time, so a copy of the non-wildcard socket sockaddr is stored here
133      * to be used as a local sockaddr in connections.
134      */
135     nxt_sockaddr_t         *sockaddr;
136 
137     nxt_listen_socket_t    *listen;
138 
139     size_t                 header_buffer_size;
140     size_t                 large_header_buffer_size;
141     size_t                 large_header_buffers;
142     size_t                 body_buffer_size;
143     size_t                 max_body_size;
144     nxt_msec_t             idle_timeout;
145     nxt_msec_t             header_read_timeout;
146     nxt_msec_t             body_read_timeout;
147     nxt_msec_t             send_timeout;
148 } nxt_socket_conf_t;
149 
150 
151 typedef struct {
152     uint32_t               count;
153     nxt_queue_link_t       link;
154     nxt_event_engine_t     *engine;
155     nxt_socket_conf_t      *socket_conf;
156 
157     /* Modules configuraitons. */
158 } nxt_socket_conf_joint_t;
159 
160 
161 struct nxt_router_access_log_s {
162     void                   (*handler)(nxt_task_t *task, nxt_http_request_t *r,
163                                       nxt_router_access_log_t *access_log);
164     nxt_fd_t               fd;
165     nxt_str_t              path;
166     uint32_t               count;
167 };
168 
169 
170 void nxt_router_new_port_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
171 void nxt_router_conf_data_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
172 void nxt_router_remove_pid_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
173 void nxt_router_access_log_reopen_handler(nxt_task_t *task,
174     nxt_port_recv_msg_t *msg);
175 
176 void nxt_router_process_http_request(nxt_task_t *task, nxt_app_parse_ctx_t *ar);
177 void nxt_router_app_port_close(nxt_task_t *task, nxt_port_t *port);
178 void nxt_router_app_use(nxt_task_t *task, nxt_app_t *app, int i);
179 void nxt_router_listen_event_release(nxt_task_t *task, nxt_listen_event_t *lev,
180     nxt_socket_conf_joint_t *joint);
181 void nxt_router_conf_release(nxt_task_t *task, nxt_socket_conf_joint_t *joint);
182 
183 
184 #endif  /* _NXT_ROUTER_H_INCLUDED_ */
185