Nginx-基础知识

基本介绍

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了 IMAP/POP3/SMTP服务,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用

Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的,worker只需要从epoll队列循环处理即可

反向代理

正向代理的概念:

正向代理是指客户端与目标服务器之间增加一个代理服务器,客户端直接访问代理服务器,在由代理服务器访问目标服务器并返回客户端并返回 。这个过程当中客户端需要知道代理服务器地址,并配置连接

反向代理的概念:

反向代理是指 客户端访问目标服务器,在目标服务内部有一个统一接入网关将请求转发至后端真正处理的服务器并返回结果。这个过程当中客户端不需要知道代理服务器地址,代理对客户端而言是透明的

  正向代理 反向代理
代理服务器位置 客户端与服务都能连接的们位置 目标服务器内部
主要作用 屏蔽客户端IP、集中式缓存、解决客户端不能直连服务端的问题。 屏蔽服务端内部实现、负载均衡、缓存。
应用场景 爬虫、*、maven 的nexus 服务 Nginx 、Apache负载均衡应

代理基本配置

Nginx 代理只需要配置 location 中配置proxy_pass 属性即可。其指向代理的服务器地址

# 正向代理到baidu 服务
location = /baidu.html {
         proxy_pass http://www.baidu.com;
}
 
# 反向代理至 本机的8010服务
location /luban/ {
     proxy_pass http://127.0.0.1:8010;  
}

代理相关参数:

proxy_pass           # 代理服务
proxy_redirect off;   # 是否允许重定向
proxy_set_header Host $host; # 传 header参数至后端服务
proxy_set_header X-Forwarded-For $remote_addr; # 设置request header即客户端IP地址
proxy_connect_timeout 90; # 连接代理服务超时时间
proxy_send_timeout 90; # 请求发送最大时间
proxy_read_timeout 90;  # 读取最大时间
proxy_buffer_size 4k; 
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k; 
proxy_temp_file_write_size 64k;

高性能原因

Nginx-基础知识

Nginx 采用:多进程 + 异步非阻塞方式(IO多路复用epoll)

 

cpu亲和

有双cpu每个cpu4个核心 ,然后我们把8个工作进程绑定到不同的cpu上 相当于每个cpu处理一个work这样 。减少切换cpu带来的性能损失。一用这种cpu亲 和的绑定方式可以减少额外的性能损失,提升工作效率。

 

是一种把cpu核心和nginx工作进程绑定的方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的cache miss ,获得更好的性能

 

sengfile

当我们去请求一个文件的时候他要进过操作系统的内核空间和用户空间 最终到达socket 通过socket 使用response传递给用户 对于上述的流程来说需要进过多次的切换,而对于静态文件来说不需要进过用户空间进行处理直接可以通过内存空间到socket进行传输

 

sendfile 正式利用到了这种模式也就是nginx在2.2版本后新加入的0拷贝的传输模式。把静态文件通过内核空间直接通过socket相应给用户。那么nginx在许多cdn的服务里面和许多处理静态文件的服务里面和动静分离处理静态文件的服务里面nginx的处理性能会比许多其他的http服务的性能要高很多

Master和Worker进程

启动Nginx后,其实就是在80端口启动了Socket服务进行监听,如图所示,Nginx涉及Master进程和Worker进程

Nginx-基础知识

Nginx在启动后以daemon的方式在后台运行,会有一个master进程和多个worker进程

 

master进程:主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程

 

worker进程:处理基本的网络事件了,多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的,一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,或者直接设置参数worker_processes auto

 

当我们输入./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行,这里面是如何做到的?

执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号。master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了

 

新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出,所以使用上面命令重启Nginx的时候服务是不中断的

核心模块

模块化设计,nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等

 

而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器

Nginx-基础知识

  •