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 107 nxt_queue_t spare_ports; /* of nxt_port_t.idle_link */ 108 nxt_queue_t idle_ports; /* of nxt_port_t.idle_link */ 109 nxt_work_t adjust_idle_work; 110 nxt_event_engine_t *engine; 111 112 nxt_queue_t requests; /* of nxt_request_app_link_t */ 113 nxt_queue_t pending; /* of nxt_request_app_link_t */ 114 nxt_str_t name; 115 116 uint32_t pending_processes; 117 uint32_t processes; 118 uint32_t idle_processes; 119 120 uint32_t max_processes; 121 uint32_t spare_processes; 122 uint32_t max_pending_processes; 123 uint32_t max_pending_responses; 124 uint32_t max_requests; 125 126 nxt_msec_t timeout; 127 nxt_nsec_t res_timeout; 128 nxt_msec_t idle_timeout; 129 130 nxt_str_t *targets; 131 132 nxt_app_type_t type:8; 133 134 nxt_mp_t *mem_pool; 135 nxt_queue_link_t link; 136 137 nxt_str_t conf; 138 139 nxt_atomic_t use_count; 140 141 nxt_app_joint_t *joint; 142 }; 143 144 145 typedef struct { 146 size_t max_frame_size; 147 nxt_msec_t read_timeout; 148 nxt_msec_t keepalive_interval; 149 } nxt_websocket_conf_t; 150 151 152 typedef struct { 153 uint32_t count; 154 nxt_queue_link_t link; 155 nxt_router_conf_t *router_conf; 156 157 nxt_http_action_t *action; 158 159 /* 160 * A listen socket time can be shorter than socket configuration life 161 * time, so a copy of the non-wildcard socket sockaddr is stored here 162 * to be used as a local sockaddr in connections. 163 */ 164 nxt_sockaddr_t *sockaddr; 165 166 nxt_listen_socket_t *listen; 167 168 size_t header_buffer_size; 169 size_t large_header_buffer_size; 170 size_t large_header_buffers; 171 size_t body_buffer_size; 172 size_t max_body_size; 173 size_t proxy_header_buffer_size; 174 size_t proxy_buffer_size; 175 size_t proxy_buffers; 176 177 nxt_msec_t idle_timeout; 178 nxt_msec_t header_read_timeout; 179 nxt_msec_t body_read_timeout; 180 nxt_msec_t send_timeout; 181 nxt_msec_t proxy_timeout; 182 nxt_msec_t proxy_send_timeout; 183 nxt_msec_t proxy_read_timeout; 184 185 nxt_websocket_conf_t websocket_conf; 186 187 nxt_str_t body_temp_path; 188 189 #if (NXT_TLS) 190 nxt_tls_conf_t *tls; 191 #endif 192 } nxt_socket_conf_t; 193 194 195 typedef struct { 196 uint32_t count; 197 nxt_queue_link_t link; 198 nxt_event_engine_t *engine; 199 nxt_socket_conf_t *socket_conf; 200 201 nxt_upstream_t **upstreams; 202 203 /* Modules configuraitons. */ 204 } nxt_socket_conf_joint_t; 205 206 207 struct nxt_router_access_log_s { 208 void (*handler)(nxt_task_t *task, nxt_http_request_t *r, 209 nxt_router_access_log_t *access_log); 210 nxt_fd_t fd; 211 nxt_str_t path; 212 uint32_t count; 213 }; 214 215 216 void nxt_router_new_port_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg); 217 void nxt_router_conf_data_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg); 218 void nxt_router_remove_pid_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg); 219 void nxt_router_access_log_reopen_handler(nxt_task_t *task, 220 nxt_port_recv_msg_t *msg); 221 222 void nxt_router_process_http_request(nxt_task_t *task, nxt_http_request_t *r, 223 nxt_app_t *app); 224 void nxt_router_app_port_close(nxt_task_t *task, nxt_port_t *port); 225 void nxt_router_listener_application(nxt_router_temp_conf_t *tmcf, 226 nxt_str_t *name, nxt_http_action_t *action); 227 void nxt_router_app_use(nxt_task_t *task, nxt_app_t *app, int i); 228 void nxt_router_listen_event_release(nxt_task_t *task, nxt_listen_event_t *lev, 229 nxt_socket_conf_joint_t *joint); 230 void nxt_router_conf_release(nxt_task_t *task, nxt_socket_conf_joint_t *joint); 231 232 233 #endif /* _NXT_ROUTER_H_INCLUDED_ */ 234