并发数理论上在3万以上。

获取本机地址

 r->headers_in.host->value 得到如:10.80.3.17:8090


struct sockaddr_in *ip = (struct sockaddr_in *) (r->connection->local_sockaddr);
uint16_t port = ntohs(ip->sin_port);

定时器

static ngx_event_t ev; 

static void
ngx_http_hello_print(ngx_event_t *ev) 
{
    printf("hello world\n");

    ngx_add_timer(ev, 1000);
}

static ngx_int_t
ngx_http_hello_process_init(ngx_cycle_t *cycle)
{
    ngx_memzero(&ev, sizeof(ngx_event_t));

    ev.handler = ngx_http_hello_print;
    ev.log = cycle->log;
    ev.data = NULL;

    ngx_add_timer(&ev, 1000);

    return NGX_OK;
}


这段代码将注册一个定时事件——每过一秒钟打印一次hello world。ngx_add_timer函数就是用来完成将一个新的定时事件加入定时器红黑树中,定时事件被执行后,就会从树中移除,因此要想不断的循环打印hello world,就需要在事件回调函数被调用后再将事件给添加到定时器红黑树中。 ngx_http_hello_process_init是注册在模块的进程初始化阶段的回调函数上。由于,ngx_even_core_module模块排在自定义模块的前面,所以我们在进程初始化阶段添加定时事件时,定时器已经被初始化好了。

多维数据初始化

static  uint8_t  s_priadv_slices[2][10][200] = {{{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0}}};

变量

typedef unsigned char        uint8_t;
typedef unsigned short int    uint16_t;
typedef unsigned int        uint32_t;
typedef unsigned long int    uint64_t;

日志

Nginx中日志相关的函数最重要的三个分别是ngx_log_error, ngx_log_error_core 和ngx_log_debug。其中ngx_log_error和ngx_log_debug又是对ngx_log_error_core的封装。封装的方式包括三种,区分了C99, GCC 和普通的可变参数方式。
   stderr (0)>= emerg(1) >= alert(2) >= crit(3) >= err(4)>= warn(5) >= notice(6) >= info(7) >= debug(8),debug级别最低,stderr级别最高;圆括号中的数据是对应日志
等级的值。
    默认: error_log  logs/error.logs   error,日志有三种输出方式,输出到文件(file)、输出到屏幕(stderr)、输出到syslog(syslog),以debug_开头的表示输出的调试日志类型。输出日志信息时转入的日志等级大于等于指定的等级时才会输出日志,如: error_log  logs/err.logs err,所有大于等于err等级的日志信息输出到logs/err.logs文件中,即err、crit、alert、emerg、stderr日志信息被输出。
  当配置文件中有多条error_log配置项生效时,情况就不一样,如下所示:
error_log  logs/warn.logs  warn
error_log  logs/alert.logs   alert
当日志级别大于alert时会同时输出到warn.logs及alert.logs文件中,当日志级别介于alert到warn之间时只输出到warn.logs文件中。当日志级别低于warn时不会输出。

获取时间

struct timeval tvnow;            
ngx_gettimeofday(&tvnow);string 赋初值
#define ngx_str_null(str)   (str)->len = 0; (str)->data = NULL
ngx_str_null属于库函数,如:  ngx_str_null(&uid);
ngx_palloc:分配内存,不置空
u_char* b = ngx_palloc(r->pool, len); 


ngx_pcalloc: 分配内存,并置空 

u_char* b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));

格式化

需要介绍的是格式化参数%系列,因为如果误用的话,轻则输出不正确,重则nginx可能core。
1. 格式:
    %{格式描述}{输出类型描述}{数据类型描述}
2. 数据类型描述:
    V:字符串,对应ngx_str_t *(注意是指针)
    v:变量值,对应ngx_variable_value_t *(也是指针)
    s:可定长字符串,对应uchar *(不使用定长功能的话,等价于标准C的s)
    O:偏移量,对应off_t
    P:进程ID,对应ngx_pid_t
    T:时间,对应time_t
    M:毫秒计时,对应ngx_msec_t
    z:容量,对应ssize_t或size_t
    i:nginx整数,对应ngx_int_t

对应ngx_uint_t

    d:系统整数,对应int
    l:系统长整数,对应long
    D:32位整数,对应int32_t或uint32_t
    L:64位长整数,对应int64_t或uint64_t
    A:原子整数,对应ngx_atomic_int_t或ngx_atomic_uint_t
    f:浮点数,对应double,但是如果传入的参数是float,也会被C升级为double。
    p:指针,对应void *
    c:字符,对应int,但是如果传入的参数是char,也会被C升级为int。
    Z:字符串尾0
    N:换行
    %:%
这里之所谓强调类型描述符,是因为这个类型在不同的系统下定义的长度不一(32位和64位系统),如果乱用,会导致移植性差。
3. 输出类型描述符
    u:无符号数值
    m:指定按数据类型的最大值所占宽度输出数字
    x:小写16进制
    X:大写16进制
    .:后面的数字表示小数位数
    *:指定输出字符串直至字符长度限制
这里需要说明的是输出类型描述符无法单独使用,必须与数据类型描述符一同使用,这和标准C是可能不一样的。
4.  格式描述
    描述输出的宽度和填充内容,填充内容以%后第一个数字而定,‘0’代表以‘0’填出,其他内容则使用默认的‘ ’填充。宽度描述则是填充设定以后的数字。整个格式描述类似于021、2等等。
5.  整体举例
    %5.2f:宽度5,小数位数2,输出double
    %*s:限定长度输出字符串,数据定义需要两个参数,length和ptr
    % 010ud,宽度10,以0补齐,输出unsigned int(新浪博客吃字符,所以在%和0之间加了空格,实际没有的)
    % 10ui, 宽度10,以空格补齐,输出ngx_uint_t(同上)

u_char* p  = ngx_palloc(r->pool, 64);
u_char*pe =  ngx_sprintf(p,"%d,pts:%L\n",k,pts);
*pe = 0;
 printf((char*)p);


字符串函数


ngx_copy: 拷贝,类似memcpy,返回结束位置。


u_char* pe = ngx_copy(ps, "#EXTM3U\r\n", 9);

pe = 0;

如果写成ngx_copy(ps, "#EXTM3U\r\n", 9),会警告,未处理计算的值。

ngx_strlcasestrn



q = ngx_strstr(p, "#EXTINF:");

q = ngx_strstrn(p, "#EXTINF:", 8);

ngx_string初始化函数
ngx_null_string 初始化空字符串函数
ngx_tolower 字符转小写函数
ngx_toupper 字符转大写函数
ngx_strncmp 比较指定长度的字符串是否相同
ngx_strcmp 比较字符串是否相同
ngx_strstr 跟strstr一样

ngx_strstrn 类似ngx_strstr
     p  =  ngx_strstrn(url->data, ".m3u8", 5);

ngx_strnstr

    p  =  ngx_strnstr(url->data, ".m3u8", url->len);

ngx_strlen 字符串的长度
ngx_strchr 在字符串中找到匹配的字符,返回 0为匹配
ngx_strlchr 在字符串中找到匹配的字符,返回匹配的指针
ngx_memzero 把一片内存区设置为0
ngx_memset 把一片内存区设置为指定的数
ngx_memcpy 复制内存,没有返回
ngx_cpymem 复制内存,返回复制完了 dst的最后一个字符的下一个字符的指针
ngx_copy 同ngx_cpymem
ngx_memcmp 比较内存中的数据是否相同
ngx_strlow 把字符串都转换成小写
ngx_cpystrn 复制字符串,并且返回字符串的最后一个字符的下一个字符的指针
ngx_pstrdup 复制字符串到pool,返回字符串的指针
ngx_sprintf 把各种类型的数据格式化输出到buf,最大的长度为65536

ngx_sprintf(sub, "asdfa"
"dd"
"a");

ngx_snprintf 把各种类型的数据格式化输出到指定长度的buf
ngx_strcasecmp 不分大小写比较两个字符串是否相同
ngx_strncasecmp 指定长短不分大小写比较两个字符串是否相同
ngx_strnstr 在指定大小一个字符串中是否有子字符串
ngx_strstrn 在一个字符串中是否有子指定大小的字符串
ngx_strcasestrn


/* 
 * ngx_strlcasestrn() is intended to search for static substring 

 * with known length in string until the argument last. The argument n 

 * must be length of the second substring - 1. 

 */  
    end = ngx_strlcasestrn(p, b->last, (u_char *) "]", 0);



ngx_rstrncmp 从后往前比较两个字符串是否相同,返回相同的位置
ngx_rstrncasecmp 从后往前比较两个字符串是否相同,返回相同的位置,不区分大小写
ngx_memn2cmp 比较两个指定长度的内存是否相同,也比较长的内存是否包含短的内存
ngx_atoi 指定长度的字符串转换成数字
ngx_atosz 指定长度的字符串转换成 ssize_t类型数字
ngx_atoof 指定长度的字符串转换成off_t类型数字
ngx_atotm 指定长度的字符串转换成time_t类型数字

问题:

nginx Empty reply from server
原因是nginx进程崩溃。