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