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