Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用nginx网站用户有很多,例如:新浪、网易、 腾讯等。
Nginx 有哪些优点?- 跨平台、配置简单。
- 非阻塞、高并发连接:处理 2-3 万并发连接数,官方监测能支持 5 万并发。
- 内存消耗小:开启 10 个 Nginx 才占 150M 内存。
- 成本低廉,且开源。
- 稳定性高,宕机的概率非常小。
- 内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
- http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
- 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
- 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
- nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
server{ # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80;#提供服务的端口,默认80
server_name localhost;#提供服务的域名主机名
location / {#第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.html; #莫仍的首页文件,多个用空格分开
} # 第一个location区块结果
- 首先,Nginx 在启动时,会解析配置文件,得到需要监听的端口与 IP 地址,然后在 Nginx 的 Master 进程里面先初始化好这个监控的Socket(创建 S ocket,设置 addr、reuse 等选项,绑定到指定的 ip 地址端口,再 listen 监听)。
- 然后,再 fork(一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子进程 )出多个子进程出来。
- 之后,子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与nginx进行三次握手,与 nginx 建立好一个连接后。此时,某一个子进程会 accept 成功,得到这个建立好的连接的 Socket ,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体。
- 接着,设置读写事件处理函数,并添加读写事件来与客户端进行数据的交换。
- 最后,Nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了。
如果一个 server 采用一个进程(或者线程)负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。
而 Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。
Nginx是如何利用的呢,简单来说:同样的 4 个进程,如果采用一个进程负责一个 request 的方式,那么,同时进来 4 个 request 之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第 5 个request进来了。就无法及时反应了,因为 4 个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个 request ,就新开个进程来处理。
Nginx目录结构有哪些?tree /usr/ local/nginx
/usr/local/nginx
|-- client_body_temp
|-- conf #Nginx所有配置文件的目录
|-- fastcgi.conf # fastcgi相关参数的配置文件
|-- fastcgi.conf.default # fastcgi.conf的原始备份文件
|-- fastcgi_params # fastcgi的参数文件
|-- fastcgi_params.default
|-- koi-utf
|-- koi-winl- mime.types #媒体类型
|-- mime.types.default
|-- nginx.conf #Nginx主配置文件
|-- nginx.conf.default
|-- scgi_params #scgi相关参数文件
|-- scgi_params.default
|-- uwsgi_params #uwsgi相关参教文件
|-- uwsgi_params.default
|-- win-utf
|-- fastcgi_temp # fastcgi临时徵据目录
|-- html #Nginx就认站点目录
|-- 5ox.html #锗误页面优雅替代显示文件,例如当出现502错误时会调用此页面
|-- index.html #默认的首页文件
|-- logs # Nginx日志目录
|-- access.log #访闻日志文件
|-- error.log #错误日志文件
|-- nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
|-- proxy_temp #临时月录
|-- sbin # Nginx命令目录
|-- nginx # Nginx的启动命令
|-- scgi_temp # 临时目录
|--uwsgi_temp # 临时目录
Nginx配置文件nginx.conf有哪些属性模块?
worker_processes 1; # worker进程的数量
events { # 事件区块开始
worker_connections 1024; # 每个worker进程支持的最大连接数
} # 事件区块结束
http { # HTTP区块开始
include mime.types; # Nginx支持的媒体类型库文件
default_type application/octet-stream; # 默认的媒体类型
sendfile on; # 开启高效传输模式
keepalive_timeout 65; # 连接超时
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
error_page 500502503504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html; # 指定对应的站点目录为html
}
}
......
为什么 Nginx 不使用多线程?
Apache: 创建多个进程或线程,而每个进程或线程都会为其分配 cpu 和内存(线程要比进程小的多,所以 worker 支持比 perfork 高的并发),并发过大会榨干服务器资源。
Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置 Nginx 主进程的工作进程的数量)(epoll),不会为每个请求分配 cpu 和内存资源,节省了大量资源,同时也减少了大量的 CPU 的上下文切换。所以才使得 Nginx 支持更高的并发。



