一、基本概念
1. Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务
2. Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
3. 官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数
二、Nginx常用功能
1. Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理
1)Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能
2)Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩
3)并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器
2. 负载均衡
1)Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。
2)Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题
3. web缓存
1)Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理
三、nginx原理
1. 概述
1)Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者
2)通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理
3)用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大
2. Nginx的模块分类
1)从结构上
(1)核心模块:HTTP模块、EVENT模块和MAIL模块
(2)基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块
(3)第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块
2)从功能上
(1)Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个
(2)Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出
(3)Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能
3. Nginx进程模型
1)概述
(1)Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程
(2)其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能
(3)worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求
2)流程
(1)在创建master进程时,先建立需要监听的socket(listenfd),然后从master进程中fork()出多个worker进程,如此一来每个worker进程多可以监听用户请求的socket
(2)一般来说,当一个连接进来后,所有在Worker都会收到通知,但是只有一个进程可以接受这个连接请求,其它的都失败,这是所谓的惊群现象
(3)nginx提供了一个accept_mutex(互斥锁),有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了
(4)先打开accept_mutex选项,只有获得了accept_mutex的进程才会去添加accept事件。nginx使用一个叫ngx_accept_disabled的变量来控制是否去竞争accept_mutex锁。ngx_accept_disabled = nginx单进程的所有连接总数 / 8 -空闲连接数量,当ngx_accept_disabled大于0时,不会去尝试获取accept_mutex锁,ngx_accept_disable越大,于是让出的机会就越多,这样其它进程获取锁的机会也就越大。不去accept,每个worker进程的连接数就控制下来了,其它进程的连接池就会得到利用,这样,nginx就控制了多进程间连接的平衡
(5)每个worker进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组
(6)并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面。一个nginx能建立的最大连接数,应该是worker_connections * worker_processes
(7)当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接
四、配置文件
nginx服务器的配置信息主要集中在nginx.conf这个配置文件中,并且所有的可配置选项大致分为以下几个部分
main # 全局配置
events { # nginx工作模式配置
}
http { # http设置
....
server { # 服务器主机配置
....
location { # 路由配置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 负载均衡配置
....
}
}
1. main模块 —— 全局配置
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;
1)user 用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
2)worker_processes 指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
3)error_log 定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
4)pid 用来指定进程id的存储文件的位置
5)worker_rlimit_nofile 用于指定一个进程可以打开最多文件数量的描述
2. event 模块 —— 针对nginx服务器的工作模式的一些操作配置
event {
worker_connections 1024;
multi_accept on;
use epoll;
}
1)worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的
2)multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
3)use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
3. http模块 —— 作为web服务器,http模块是nginx最核心的一个模块
1)基础配置
(1)keepalive_timeout 10:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
(2)send_timeout 10:指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接
(3)include /etc/nginx/mime.types:指定在当前文件中包含另一个文件的指令
(4)default_type application/octet-stream:指定默认处理的文件类型可以是二进制
2)日志配置
(1)access_log logs/access.log:设置存储访问记录的日志
(2)error_log logs/error.log:设置存储记录错误发生的日志
3)压缩配置
(1)gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量
4. server模块 —— srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息
server {
listen 80;
server_name localhost 192.168.1.100;
root /nginx/www;
index index.php index.html index.html;
charset utf-8;
access_log logs/access.log;
error_log logs/error.log;
......
}
1)server 一个虚拟主机的配置,一个http中可以配置多个server
2)server_name 指定ip地址或者域名,多个配置之间用空格分隔
3)root 表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
4)index 用户访问web网站时的全局首页
5)charset 用于设置www/路径中配置的网页的默认编码格式
6)access_log 用于指定该虚拟主机服务器中的访问记录日志存放路径
7)error_log 用于指定该虚拟主机服务器中访问错误日志的存放路径
5. location模块 —— location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息
location / {
root /nginx/www;
index index.php index.html index.htm;
}
反向代理配置方式:
location / {
proxy_pass upstreamName; #(代理配置)请求转向upstreamName定义的服务器列表
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}
1)location /: 表示匹配访问根目录
2)root 用于指定访问根目录时,访问虚拟主机的web目录
3)index 在不指定访问具体资源时,默认展示的资源文件列表
6. upstream模块 —— 主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
1)ip_hash 指定请求调度算法,默认是weight权重轮询调度,可以指定
2)server host:port: 分发服务器的列表配置
3)-- down: 表示该主机暂停服务
4)-- max_fails: 表示失败最大次数,超过失败最大次数暂停服务
5)-- fail_timeout: 表示如果请求受理失败,暂停指定的时间之后重新发起请求
参考网址
注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激