Nginx 소스 코드 초기 탐지 데이터 구조 - 링크 데이터 구조
1.ngx_listening_s 데이터 구조
typedef struct ngx_listening_s ngx_listening_t;
struct ngx_listening_s {
ngx_socket_t fd;/*socket */
struct sockaddr *sockaddr;/*socket */
socklen_t socklen; /*sockaddr size of sockaddr */
size_t addr_text_max_len;
ngx_str_t addr_text;
int type;/*socket */
int backlog;
int rcvbuf;/* work */
int sndbuf;/* work */
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
int keepidle;
int keepintvl;
int keepcnt;
#endif
/* handler of accepted connection */
ngx_connection_handler_pt handler;/* */
void *servers; /* */
ngx_log_t log;
ngx_log_t *logp;
size_t pool_size;
/* should be here because of the AcceptEx() preread */
size_t post_accept_buffer_size;
/* should be here because of the deferred accept */
ngx_msec_t post_accept_timeout;
ngx_listening_t *previous;
ngx_connection_t *connection;/* */
ngx_rbtree_t rbtree;
ngx_rbtree_node_t sentinel;
ngx_uint_t worker;/* */
unsigned open:1;/*socket ,1 ,0 */
unsigned remain:1;/* ,1 ,0 */
unsigned ignore:1;/* ,1 socket ,0 */
unsigned bound:1; /* already bound */
unsigned inherited:1; /* i */
unsigned nonblocking_accept:1;
unsigned listen:1;/* ,1 */
unsigned nonblocking:1;
unsigned shared:1; /* shared between threads or processes */
unsigned addr_ntop:1;
unsigned wildcard:1;
#if (NGX_HAVE_INET6)
unsigned ipv6only:1;
#endif
unsigned reuseport:1;
unsigned add_reuseport:1;
unsigned keepalive:2;
unsigned deferred_accept:1;
unsigned delete_deferred:1;
unsigned add_deferred:1;
#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
char *accept_filter;
#endif
#if (NGX_HAVE_SETFIB)
int setfib;
#endif
#if (NGX_HAVE_TCP_FASTOPEN)
int fastopen;
#endif
};
2.ngx_connection_s 데이터 구조
struct ngx_connection_s {
void *data;
ngx_event_t *read;
ngx_event_t *write;
ngx_socket_t fd;
ngx_recv_pt recv;
ngx_send_pt send;
ngx_recv_chain_pt recv_chain;
ngx_send_chain_pt send_chain;
ngx_listening_t *listening;
off_t sent;
ngx_log_t *log;
ngx_pool_t *pool;
int type;
struct sockaddr *sockaddr;
socklen_t socklen;
ngx_str_t addr_text;
…………………………………………………………………………………………
#if (NGX_HAVE_AIO_SENDFILE || NGX_COMPAT)
unsigned busy_count:2;
#endif
#if (NGX_THREADS || NGX_COMPAT)
ngx_thread_task_t *sendfile_task;
#endif
};
3. 라 이 프 사이클 연결 ngx_connection_t 는 Nginx 가 tcp 연결 에 대한 패키지 입 니 다.우 리 는 TCP 의 생명주기 에서 ngx 를 고찰 할 수 있다connnection_t 의 생명 주기, 여기 서 나 는 그 를 두 부분 으로 나 누 었 다. 하 나 는 환경 을 연결 하 는 준비 단계 이 고 다른 하 나 는 connection 의 관리 단계 이다.3.1 준비 단계 nginx 는 시작 할 때 설정 파일 을 분석 하여 감청 이 필요 한 포트 와 IP 를 얻 습 니 다.그리고 Nginx 는 master 프로 세 스에 서 socket 연결 을 초기 화한 다음 fork 에서 여러 개의 work 하위 프로 세 스 를 내 고 하위 프로 세 스 간 에 경쟁 클 라 이언 트 의 연결 요청 을 합 니 다.3.2 connection 의 관리 단계 work 프로 세 스 가 클 라 이언 트 요청 을 가 져 온 후 socket 을 가 져 와 연결 대상 을 만 든 다음 읽 기와 쓰기 이벤트 처 리 를 하고 마지막 으로 클 라 이언 트 나 서버 에서 연결 을 끊 습 니 다.