nginx 源码阅读中的问题

2015-02-02 21:10:30   最后更新: 2015-11-19 21:43:05   访问数量:1171




  1. 父进程为什么要给所有子进程同步 fd
  2. 为什么说 Apache rewrite 比 nginx 强大
  3. nginx log 是否有缓冲,怎么解决并发写问题
  4. 连接池分配和释放的策略是什么
  5. 是不是每个子进程都有自己的连接池
  6. request、response 和 connection 之间的关系是什么
  7. http 协议怎么解析,如何提高性能
  8. 怎么处理拒绝服务攻击
  9. 同一个用户的多个连接是一个 worker 处理的吗?
  10. 怎么保证负载均衡
  11. 怎么保证 worker 重启时他的连接不丢失
  12. 为什么没有获取到自旋锁的进程反而调用了 accept

 

父进程为什么要给所有子进程同步 fd

虽然在主流程中子进程间并没有任何通信,但是这并不意味着永远都不会有,也许在自定义的 module 中会发生子进程间的协同与通信,预先建立域连接就是非常有必要的了

 

为什么说 Apache rewrite 比 nginx 强大

下面的日志介绍了 nginx 如何配置 rewrite 规则:

nginx rewrite 规则的配置

尽管通过 http://winginx.com/en/htaccess 可以将任何 Apache 的 rewrite 规则转换为对应的 nginx 的 rewrite 规则,但这并不意味着 nginx 可以做到 Apache rewrite 能做到的任何事

Apache 可以通过目录下的 .htaccess 文件定义访问该目录时独有的 rewrite 规则,而 nginx 只能通过统一的配置文件进行统一的配置(可以通过 location 配置不同路径自己的规则,但仍然没有 Apache rewrite 配置的灵活性)

 

nginx log 是否有缓冲,怎么解决并发写问题

nginx log 结构:

nginx log 模块初始化

可以看到,log 结构中并没有缓存的存在,事实上,nginx 写 log 也并没有进行缓存

那么,不会发生并发写造成的乱序问题吗,参看:

linux 系统调用 write 的原子性

 

是不是每个子进程都有自己的连接池

nginx 连接池结构:

nginx 连接池

可见,每个 ngx_cycle_t 结构都有一个对应的连接池结构,每个 worker 都有自己的连接池

 

http 协议怎么解析,如何提高性能

参看:

Nginx 内核源码解析

 

同一个用户的多个连接是一个 worker 处理的吗

不是

 

怎么保证负载均衡

nginx 负载均衡是通过连接池容量实现的:

惊群现象的处理与负载均衡的实现

 

怎么保证 worker 重启时他的连接不丢失

nginx 重启 worker 时会给 worker 发送 SIGTERM 信号,然后启动相应数量的新进程

旧的 worker 收到信号后不再处理新的连接,当完成旧连接的处理后会自动退出

参看:

worker 的信号处理 -- nginx worker 进程主循环流程

 

为什么没有获取到自旋锁的进程反而调用了 accept

为什么没有获取到自旋锁的进程反而调用了 accept

 






读书笔记      linux      unix      龙潭书斋      技术分享      遗留问题      nginx      server      源码      httpserver      sourcecode      http     


京ICP备15018585号