Nginx基础及应用
负载均衡平摊单个服务器的压力,单个服务没必要用nginx的负载均衡功能,负载集群才需要;
用Nginx可以方便挂SSL证书,多个不同的服务也可以挂一个域名上面;
另外如果加了nginx还有其他功能比如gzip,限流,ip屏蔽静态文件也可以单独放nginx上面,
nginx对静态文件读取处理得比较好。
Nginx简介
- Nginx是一个高性能的http和反向代理服务器,特点是内存占用少、并发能力强。专为性能优化而开发,性能是其第一追求,其实际性能非常强悍,能经受高并发的考研,报告显示其能支持5万并发连接。
- 稳定,支持应用的热更新,可以实现7*24小时不间断工作。
反向代理:
- 正向代理:对客户端不透明,需要在客户端配置代理服务器做跳板。
- 反向代理:对客户端透明,客户端将请求发送给反向代理服务器,由反向代理服务器自行选择目标服务器完成数据交互。反向代理服务器和目标服务器组成了一个完整的体系,但只对外暴露反向代理服务器,此时真实的目标服务器的ip和端口等信息被隐藏起来,达到了隔离和保护的目的。
负载均衡:
- 当目标服务器由于业务量增长而采用副本集群部署后,在采用反向代理为外部集中暴露的前提下,需要代理服务器将访问负载平均地转发到各个目标服务器实例上去。
动静分离:
- 当服务访问压力很大时,可以将动态资源和静态资源分别放在不同的目标服务器上,功能分离后一方面可以提升各自的解析性能,另一方面可以方便针对性的性能升级。用Nginx根据不同的资源类型将请求分发到不同的目标服务器或集群,就达到了动静分离的目的。
高可用:
常用命令:
./sbin/nginx -v //查看nginx版本
./sbin/nginx -t //验证配置合法性
./sbin/nginx //启动nginx
./sbin/nginx -s stop //停止nginx
./sbin/nginx -s reload //热加载配置文件
配置
配置文件分为3块:
- 全局块:影响nginx服务器整体运行的参数
user nobody; //执行程序的用户名
worker_processes 4; //worker进程数,反映了并发能力,通常与cpu核数相等
error_log logs/error.log; //错误日志-记录位置
error_log logs/error.log info; //错误日志-级别,可选级别有[debug、info、notice、warn、error、crit、alert、emerg],生产环境【warn、error、crit】三选一
pid logs/nginx.pid; //进程id记录的文件位置
- events块:影响nginx服务器与用户网络连接:
worker_connections 1024 //代表每个worker支持的最大连接数
- http块:
- http全局块:
- http-server块:
反向代理:仅对外暴露Nginx服务器,隐藏真实服务器,提高安全性。
- 配置实例一(简单转发):
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://127.0.0.1:8080; # 转发到目标服务器
}
}
}
- 配置实例二(根据路由规则分发到不同目标服务器):
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name 127.0.0.1;
# 波浪线表示路由中包含“/edu/”,就转发到该路径,注意完整的路由除了“/edu/”,必须包含后续
# 如:http://localhost:9090/edu/login.html
location ~ /edu/ {
proxy_pass http://127.0.0.1:8081; # 转发到8081服务器
}
location ~ /org/ {
proxy_pass http://127.0.0.1:8080; # 转发到8080服务器
}
}
}
- server-location:
1.=:用于不含正则表达式的uri前,要求请求路由与指定uri严格匹配,如果匹配成功,就立即处理该请求,停止向下搜索。
2.~:表示uri包含正则表达式,且大小写敏感。
3.~:表示uri包含正则表达式,且大小写不敏感。
4.^~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用次location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
注意:如果uri包含正则表达式,则必须要有【】或【】标识。
负载均衡和高可用:
均衡策略:
- 轮询:每个请求按照时间顺序,轮流转发到副本集群中的各目标服务上,默认策略。
upstream myServerName {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
- weight:加权轮询,默认值为1,权重越大者,命中比例更大。
upstream myServerName {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=4;
}
- ip_hash:根据请求者的ip计算hash,将每个请求固定的转发到集群实例上,可以用于session共享。
upstream myServerName {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
- fair:根据集群实例的响应时间来决定,响应快的优先分配(需要安装扩展模块)。
- check:根据集群实例的健康状况来转发请求(需要安装扩展模块)。
- url_hash:根据请求的url计算hash,将每个请求固定的转发到集群实例上(需要安装扩展模块)。
动静分离:
严格意义上讲就是将动态和静态请求进行区别对待,分发到各自的后端服务器,方便缓存实施和有针对性的性能增强。
- 直接将静态资源分离为独立的域名,部署再独立的服务器上,Nginx直接根据域名或者路由转发请求(主流方式)。
- 动态和静态资源混合部署,利用Nginx通过路由来分离请求,甚至可以针对不同类型的文件配置不同的过期时间。
location的expires参数可以向浏览器指定资源的过期时间,利用浏览器的缓存机制减少对服务器的请求和流量。浏览器需要某资源时,发现它还没过期,就发送资源的签名给服务器,服务器用浏览器发来的的签名与本地的对比:
若没有变化:服务器就返回304,浏览器直接使用本地的缓存的静态资源【Status Code: 304 Not Modified】。
若有变化:则服务器返回200,同时返回最新的静态资源。
http {
include mime.types;
default_type application/octet-stream;
gzip on;
server {
listen 80;
server_name 127.0.0.1;
# 需注意配置方式,是一种拼接。
# 浏览器访问地址:http://localhost:8080/static/kkk.jpg
# 特别注意:图片文件磁盘路径:G:\test\【static】\kkk.jpg
# 浏览器访问:http://192.168.2.200/static/,可以看到G:\test\static目录下的文件列表
# 浏览器访问:http://192.168.2.200/static/FeiQ.exe,浏览器直接下载附件
location /static {
root G:/test/;
expires 10d; #30m:30分钟,2h:2小时,30d:30天
autoindex on;
}
}
}
主-备高可用集群
对外暴露集群的虚拟ip
- 准备两台服务器
- 两台服务器分别安装Nginx和keepalived
- 修改keepalived配置文件/etc/keepalived/keepalived.conf
原理
- 进程模型:Nginx是多进程的,一个master,多个worker;master是多路复用器【最好与linux服务器搭配食用,才能发挥多路复用IO的性能优势】。
- master负责监控和管理各worker的生命周期,某些worker退出后,master负责启动新worker补充。
- master进程负责请求的接入,worker以抢占的方式去master处获取请求并做后续处理。
- master进程统一加载配置信息,并统一分发,方便配置的热更换。
- 多worker进程模式的优点:
- 每个worker运行在独立的进程里面,不需要加锁,避免了锁的开销,提升性能。
- 进程隔离,能方便问题的查找。
- worker运行在独立进程中,可以避免相互干扰,一个进程故障或退出也不会影响其他worker,影响面被局限在一个worker的范围内,服务整体仍然可用。master也会尽快启动新worker进程补上。
- 【woker_processes 4】worker数量设置,一般与cpu核心数相等最为适宜。
- worker连接数设置:
- 每个请求占用几个连接?
静态资源请求:占用2个连接。
动态转发请求:占用4个连接。
- 每个worker最大支持几个连接?总共支持的最大连接数?最大并发数是多少?
worker_connections 1024
表示每个worker最大支持1024个连接。
总的最大连接数就是4 * 1024个。
针对不同类型的连接并发数就是除以2或4。
学习使我充实,分享给我快乐!