简介
Nginx是一款轻量级的web服务器、反向代理服务器。
Nginx的Master-Worker模式
Nginx启动后其实就是在80端口启动了socket服务进行监听。
Master负责读取并按照配置文件、管理一个或多个Worker。
每一个Worker进程的维护一个线程,处理连接和请求;其中Worker进程个数由配置文件决定
,一般和CPU个数相关。
思考:Nginx挂了怎么办?
Keepalived+Nginx实现高可用。
第一:请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)
第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)
动静分离
静态文件放在Nginx,
反向代理和正向代理
例子:使用vpn代理访问外网。叫村里的小盆友帮忙买辣条,在这里小盆友就充当代理,商店就充当服务端,而“你”充当客户端。
反向代理:
总结:
正向代理:代理的是客户端;这个时候服务端是不知道真正的客户端。
反向代理:代理的是服务端;这个时候客户端是不知道真正的服务端。
反向代理demo
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
events {
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
sendfile on;
#连接超时时间
keepalive_timeout 65;
server {
listen 80;
server_name 127.0.0.01;
location / { #location / 表示处理所有请求
proxy_pass http://192.168.20.1:8080; #代理的服务端
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
负载均衡
Nginx支持4种负载均衡算法:
1.轮询算法:
默认情况下,nginx使用轮询算法根据权重分发请求到相应的服务器,可以通过server指令的weight参数指定权重,默认权重为1
upstream balanceServer{
server localhost:8080 weight=1 max_fails=2 fail_timeout=30s;
server localhost:8888 weight=2 max_fails=2 fail_timeout=30s;
# 即在 30s 内尝试 2 次失败即认为主机不可用
}
# weight表示权重,值越大,被分配到的几率越大。
#可以为每个 backserver 指定最大的重试次数,
#和重试时间间隔,所使用的关键字是 max_fails 和 fail_timeout。
# 代理
location / {
proxy_pass http://balanceServer;
}
2.ip_hash:
每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
upstream ipServer {
server 10.3.134.99;
server 10.3.134.111;
ip_hash;
}
location / {
proxy_pass http://ipServer ;
}
3.url_hash:
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
4.fair:
这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块
upstream ipServer {
server 10.3.134.99;
server 10.3.134.111;
fair;
}
思考:Nginx如何做到高并发下的高效处理?
Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。