Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,nginx的并发能力在同类型的网页服务器中表现较好。(百度百科)
异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决。
nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址。
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点 listen 80; # 提供服务的端口,默认80 server_name localhost; # 提供服务的域名主机名 location / { # 第一个location区块开始 root html; # 站点的根目录,相当于Nginx的安装目录 index index.html index.htm; # 默认的首页文件,多个用空格分开 } # 第一个location区块结果 }
反向代理可以隐藏服务器的地址和特征,作为web服务器与后端服务器的中间层。安全。
优点:
缺点:
动态处理能力较差,一般作为前端服务器
├── client_body_temp ├── conf # Nginx所有配置文件的目录 │ ├── fastcgi.conf # fastcgi相关参数的配置文件 │ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件 │ ├── fastcgi_params # fastcgi的参数文件 │ ├── fastcgi_params.default │ ├── koi-utf │ ├── koi-win │ ├── 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默认站点目录 │ ├── 50x.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 # 临时目录
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 } }
nignx进行请求转发,将跨域的接口写成调本域的接口,再将这些接口转发到真正的请求地址
基于域名的虚拟主机(外部网站):
#当客户端访问www.xxx.com,监听端口号为80,直接跳转到data/www目录下文件 server { listen 80; server_name www.xxx.com; location / { root data/www; index index.html index.htm; } } #当客户端访问www.xxxx.com,监听端口号为80,直接跳转到data/bbs目录下文件 server { listen 80; server_name www.xxxx.com; location / { root data/bbs; index index.html index.htm; } }
基于端口的虚拟主机(内部网站):
#当客户端访问www.xxx.com,监听端口号为8080,直接跳转到data/www目录下文件 server { listen 8080; server_name 8080.xxx.com; location / { root data/www; index index.html index.htm; } } #当客户端访问www.xxxx.com,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080 server { listen 80; server_name www.xxxx.com; location / { proxy_pass http://127.0.0.1:8080; index index.html index.htm; } }
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精准匹配 | 1 |
^~ | 以某个字符串开头 | 2 |
~ | 区分大小写的正则 | 3 |
~* | 不区分大小写的正则 | 4 |
!~ | 区分大小写不匹配的正则 | 5 |
!~* | 不区分大小写不匹配的正则 | 6 |
/ | 通用匹配 | 7 |
#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; #绑定限流维度 server{ location/seckill.html{ limit_req zone=zone; proxy_pass http://lj_seckill; } }
1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。
#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; #绑定限流维度 server{ location/seckill.html{ limit_req zone=zone burst=5 nodelay; proxy_pass http://lj_seckill; } }
burst=5 nodelay; 代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落
http { limit_conn_zone $binary_remote_addr zone=myip:10m; limit_conn_zone $server_name zone=myServerName:10m; } server { location / { limit_conn myip 10; limit_conn myServerName 100; rewrite / http://www.lijie.net permanent; } }
单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。
nginx使用的算法。
突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。
令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。
令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶。
location /image/ { root /usr/local/static/; autoindex on; } mkdir /usr/local/static/image # 创建目录 cd /usr/local/static/image xx.jpg nginx -s reload server_name/image/1.jpg # 访问图片资源
upstream xx-windows { server 127.0.0.1:8091; server 127.0.0.1:8092; server 127.0.0.1:8093; } #后台管理服务器 用户访问manage.xx.com时访问localhost:8091 server { listen 80; server_name manage.xx.com; location / { #代理路径 proxy_pass http://xx-windows; } }
upstream jt-windows { server 127.0.0.1:8091 weight=6; server 127.0.0.1:8092 weight=3; server 127.0.0.1:8093 weight=1; }
upstream jt-windows { ip_hash; server 127.0.0.1:8091; server 127.0.0.1:8092; server 127.0.0.1:8093; }
问题描述:用户信息保存到Seesion中时,由于负载均衡的配置.导致用户每次访问的服务器都不同,导致用户信息不能共享.
策略说明:使用IPHASH策略.将用户IP地址与tomcat服务器进行绑定.保证每次访问都是相同的tomcat.
缺点:
总结:IPhash工作中不常使用. 测试操作时可能用到.
实际开发中使用SSO(单点登录)实现用户数据共享
SSO:只要用户登录其中一台服务器,则可能访问相互之间信任的全部服务器.
第三方插件
upstream backserver { server server1; server server2; fair; }
对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。
哪个服务器的响应速度快,就将请求分配到那个服务器上。
第三方插件
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
server { listen 80; server_name www.lijie.com; location / { ### 指定上游服务器负载均衡服务器 proxy_pass http://backServer; ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间 proxy_connect_timeout 1s; ###nginx发送给上游服务器(真实访问的服务器)超时时间 proxy_send_timeout 1s; ### nginx接受上游服务器(真实访问的服务器)超时时间 proxy_read_timeout 1s; index index.html index.htm; } }
# 如果访问的ip地址为192.168.9.115,则返回403 if ($remote_addr = 192.168.9.115) { return 403; }
## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500 if ($http_user_agent ~ Chrome) { return 500; }
变量 | 含义 |
---|---|
$args | 请求行中的参数 |
$content length | 请求头中的content length字段 |
$content_type | 请求头中的content_type字段 |
$document_root | 当前请求在root指令中的值 |
$host | 请求主机头字段,否则为服务器名称 |
$http_user_agent | 客户端agent信息 |
$http_cookie | 客户端cookie信息 |
$limit_rate | 限制链接速率 |
$request_mehtod | 客户端请求动作,get post |
$remote_addr | 客户端ip地址 |
$remote_port | 客户端端口 |
$remote_user | 已经经过auth验证过的用户名 |
$request_filename | 当前请求的文件路径 |
$scheme | http方法(http,https) |
$server_protocol | 请求使用的协议(http/1.0,http/1.1) |
$server_addr | 服务器地址 |
$server_name | 服务器名称 |
$server_port | 请求到达的服务端端口 |
$request)uri | 包含请求参数的原始url,不含主机名 |
$uri | 不带请求参数的当前url,不包含主机名 |
$document_uri | 不带请求参数的当前url,不包含主机名 |