官方文档:http://nginx.org/en/docs/
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器。
客户端发送多个请求到服务器,服务器随后分发处理请求到不同的服务器。服务器处理完毕后,再将结果返回给客户端。
在http模块内写入upstream模块,默认的策略时轮询。
upstream backend {
#轮询
server 192.168.1.101:8888;
server 192.168.1.102:8888;
server 192.168.1.103:8888;
}
upstream backend {
#weight
server 192.168.1.101 weight=1;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=3;
}
upstream backend {
#ip hash
ip_hash;
server 192.168.1.101:7777;
server 192.168.1.102:8888;
server 192.168.1.103:9999;
}
upstream backend {
#fair
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
fair;
}
其中还有:
down表示目前此server不参与负债均衡
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回
proxy_next_upstream 模块定义的错误
fail_timeout:max_fails次失败后,暂停的时间
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
用空格隔开即可
在location模块也要进行配置,具体看下面。
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析的速度,降低原来单个服务器的压力。
首先分别下载:
find / -name nginx.conf 查找 / 目录下 name 为nginx.conf的文件就可以查看nginx的congf文件。
Nginx由三块构成:全局块,events块,http块(http全局块,server块)。
从配置文件开始到events块之间的内容,主要是设置一些影响Nginx服务器整体运行的配置指令。
user nginx :配置允许运行Nginx的用户组。
worker_processes :允许生成的worker数量,越大处理并发数量也就越多,auto表示自适应。
error_log :错误日志的路径。
pid :pid文件。
events块的指令主要影响Nginx服务器与用户的网络连接
worker_connections:一个worker支持的最大连接数为1024。
一个请求占用2个或者4个连接数(client和server)。
最大并发数:
若为静态访问 worker_connections * worker_processes /2
若为动态访问 worker_connections * worker_processes /4
http块是Nginx服务器配置中最频繁的部分,代理、缓存、日指定以等绝大多数功能和第三方模块的配置都在这里。包括:http全局块,server块。
http全局块
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
sendfile:指定是否使用sendfile系统调用来传输文件。sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。
keepalive-timeout:连接超时时间xx秒。
log_format main:日志格式:addr地址 user用户名 time时间等等。
access_log:log的存放路径,并按log_format格式。每次访问都会记录。
tcp_nopush:防拥塞。
tcp_nodelay:无延迟。
include:nginx支持那些多媒体类型,mime.types
default_type:若在mime.types里面没有类型就默认为octet-stream流类型。
server块与虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机完成一样,该技术的产生是为了节省互联网服务器硬件成本。配置虚拟主机的相关参数,一个http中可以有多个server。
listen:default_server针对于端口,不针对server_name,也就是当有多个不同server_name的server都监听同一端口,但是没有找到匹配的,这时就会默认使用default_server这个server。
listen可以以ip:port的方式,这时就会先寻找ip和port都匹配的server,再从这些server中匹配server_name,同样没找到还是使用default。
default可以手动添加,不添加的话系统默认是第一个server块。
—————————————————————————
server_name:server_name为虚拟服务器的识别路径。不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。
server_name也支持正则匹配,匹配书顺序:完全匹配-通配符在前-通配符在后-正则匹配-default。
—————————————————————————
location:
= 表示精准匹配
^~ 前缀匹配,以某字符串开头 用来匹配目录
~ 表示区分大小写的正则匹配 开头
~* 表示区分大小写的正则匹配 结尾
/ 和 /xx/yy/zz 都是通用匹配
精准匹配会被第一个处理,若找到停止搜索。
通用匹配/xx/yy/zz。
前缀匹配,在找的时就停止搜索正则。
正则匹配,按照定义的顺序。
最后交给通用匹配/。
location =
location ~* \.(gif|jpg|jpeg)$ 匹配以gif,jpg,jepg结尾的
location / 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
location /documents/ 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索,只有后面的正则表达式没有匹配到时,才会采用这一条
location ~ /documents/Abc 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索,只有后面的正则表达式没有匹配到时,这一条才会采用这一条
location ^~ /images/ 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
用法:1.用 =/ ^~来加载静态资源 2.用 / 转发动态请求到后端
proxy_pass用于反向代理,前面的负载均衡就需要此语句实现。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ {
#请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表 deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
Nginx是基于Reactor模型,Reactor模式又是基于IO复用模型。
(什么是Reactor?什么是IO复用模型?后面会出Netty基础概念)
nginx启动后会有一个master进程和多个worker进程。
master主要用来管理worker进程,而worker负责实际的处理,相互之间是独立的,一个请求只能在一个worker中处理。
master在listen后,fork出多个进程,每个worker都会去争抢处理client的connect请求。
这种机制的好处:
这种机制的好处: