[关闭]
@Bios 2018-12-10T08:47:20.000000Z 字数 1979 阅读 875

不得不学的Nginx

nginx


Ngnix是一个开源且高性能、可靠的HTTP中间件、代理服务

常见的HTTP服务

为什么选择ngnix

IO多路复用epoll

多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个线程。

I/O多路复用实际上就是用select, poll, epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。

(1)当用户进程调用了select,那么整个进程会被block;

(2)而同时,kernel会“监视”所有select负责的socket;

(3)当任何一个socket中的数据准备好了,select就会返回;

(4)这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

轻量级

模块 内容
核心模块 HTTP模块、EVENT模块和MAIL模块
基础模块 HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块
第三方模块 HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块

CPU亲和(affinity)

CPU affinity 是一种调度属性(scheduler property), 它可以将一个进程"绑定" 到一个或一组CPU上.

在SMP(Symmetric Multi-Processing对称多处理)架构下,Linux调度器(scheduler)会根据CPU affinity的设置让指定的进程运行在"绑定"的CPU上,而不会在别的CPU上运行.

Linux调度器同样支持自然CPU亲和性(natural CPU affinity): 调度器会试图保持进程在相同的CPU上运行, 这意味着进程通常不会在处理器之间频繁迁移,进程迁移的频率小就意味着产生的负载小。

因为程序的作者比调度器更了解程序,所以我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起,所有设置CPU亲和性可以使某些程序提高性能。

sendfile

传统的文件读写方式(read/write方式):

  1. read(file, tmp_buf, len);
  2. write(socket, tmp_buf, len);

1、调用read函数,文件数据被copy到内核缓冲区。
2、read函数返回,文件数据从内核缓冲区copy到用户缓冲区。
3、write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。
4、数据从socket缓冲区copy到相关协议引擎。

sendfile:

相较传统read/write方式,2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关缓冲区的文件copy,而在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,系统调用方式仍然一样,细节与2.1版本的不同之处在于,当文件数据被复制到内核缓冲区时,不再将所有数据copy到socket相关的缓冲区,而是仅仅将记录数据位置和长度相关的数据保存到socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎,再次减少了一次copy操作。

配置代理服务

  1. // conf/nginx.conf
  2. include servers/*.conf; // 引用单独建的配置文件
  1. // server/test.conf
  2. server {
  3. listen 80; // 监听端口
  4. server_name test.com; // host name
  5. location / {
  6. proxy_pass http://127.0.0.1:8888; // 代理的服务地址
  7. proxy_set_header Host $host; // 服务器端就能拿到代理的host 而不是http://127.0.0.1:8888
  8. }
  9. }

代理缓存

所有用户都可以使用同一个代理缓存。如果服务器端设置了'Cache-Control':'private',那代理服务器就不能缓存了

  1. // server/test.conf
  2. proxy_cache_path cache levels=1:2 keys_zone=my_cache:10m;
  3. server {
  4. listen 80; // 监听端口
  5. server_name test.com; // host name
  6. location / {
  7. proxy_cache my_cache;
  8. proxy_pass http://127.0.0.1:8888; // 代理的服务地址
  9. proxy_set_header Host $host; // 服务器端就能拿到代理的host 而不是http://127.0.0.1:8888
  10. }
  11. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注