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