前言
负载均衡:请求分发(转发)–一次请求
反向代理:代理服务器重新发起请求(重定向)–两次请求
一、nginx的安装
1、下载
http://nginx.org/download/ –> ./configure 运行nginx配置文件 –> make 编译 –> make install 安装
brew install nginx
2、启动
终端输入 > nginx
访问 http://localhost:8080/
3、目录
mac下使用brew安装其目录在/usr/local/etc/中。
配置文件:nginx.conf
二、常用命令
nginx # 启动Nginx
nginx -t # 测试配置文件是否有错误
nginx -v # 查看Nginx版本
nginx -V # 查看Nginx版本和编译安装时的编译参数
nginx -s stop # 强制停止Nginx服务
nginx -s quit # 优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx -s reload # 重新加载Nginx配置文件,然后以优雅的方式重启Nginx
三、常用配置
#运行用户
#user nobody;
#开启进程数<=CPU数
worker_processes 1;
#错误日志保存位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#进程号PID保存文件
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
}
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#日志文件输出格式 这个位置相于全局设置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#请求日志保存位置
#access_log logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
keepalive_timeout 65;
#打开gzip压缩
#gzip on;
#设定请求缓冲
#client_header_buffer_size 1k;
#large_client_header_buffers 4 4k;
#设定[负载均衡]的服务器列表
upstream myapp {
#指定负载均衡算法
#ip_hash;
server 192.168.1.171:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
server 192.168.1.172:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
server 192.168.1.173:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80 backup;
#service 反向服务地址,加端口
#weigth 参数表示权值,权值越高被分配到的几率越大
#max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,踢出。默认为1,将其设置为0可以关闭检查
#fail_timeout 踢出后重新探测时间
#max_conns 服务允许的最大连接数,可以控制并发量
#backup 指的是这台服务不启动,当所有服务不可用时再启用
}
#配置虚拟主机
server {
#监听端口
listen 80;
#监听域名
server_name hoaven.com; #测试时需要配置hosts,线上可配置域名解析
#nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
#access_log logs/host.access.log main;
#站点,指客户端访问虚拟服务时,拦截某些特定路由,反向代理到某个负载均衡服务列表
#一个server可以配置多个location
location / { #拦截所有请求
#指的就是location站点
#配置的值是相对路径(相对于nginx目录:/usr/local/etc/nginx/)
root html;
#默认访问文件
index index.html index.htm;
#负载均衡反向代理
#如果不配置此项,客户端访问到此站点时,直接访问/usr/local/etc/nginx/html/uri资源,资源没找到就会访问index.html或index.htm资源,不会被代理
proxy_pass http://myapp;
}
#整体访问流程:
#1、客户端请求http:hoaven.com访问(server_name + listen)到nginx的虚拟主机;
#2、nginx将请求转发到myapp的web集群(选择服务器:权重+轮询,如果权重一样,每个服务轮流进行服务);
#配置[反向代理]tomcat服务器:拦截.jsp结尾的请求转向到指定的服务器及端口
#location ~ \.jsp$ {
# proxy_pass http://192.168.1.171:8080;
#}
#错误页面及其返回地址
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
四、负载均衡算法
权重+轮询(默认)
权重相同的情况下,‘一人一次’
ip_hash
同一ip,每次请求都负载到一台服务,应用于保持session的一致性
url_hash
同一url,每次请求都负载到一台服务,应用于静态资源的缓存优化(每台服务节点只需要从文件服务器缓存该客户端需要访问的文件资源)
弊端:当某台服务器挂掉后,某些url客户端就访问不到静态资源了
least_conn:最少连接
选择当前最少连接的服务节点
least_time:最小响应时间
计算节点平均响应时间,选取响应最快的节点
五、server和location
客户端访问流程:
(1) 客户端通过server_name + listen找到相应的nginx虚拟服务server;
(2) 通过请求uri定位到具体的location(根据uri和location后面配置的目录路径、正则表达式、条件语句等进行匹配);
(3) 通过location代理到具体的upstream,再通过负载均衡算法请求具体的服务节点;
注:location可以直接定位到具体的服务节点地址或静态地址
六、动静分离的实现
静态资源请求代理到静态资源服务节点(前端);动态请求代理到动态服务节点(后端);
方案一:
upstream static_servers {
server 192.168.1.171:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
server 192.168.1.172:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
}
upstream dynamic_servers {
server 192.168.1.191:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
server 192.168.1.192:8080 weight=1 max_fails=2 fail_timeout=30s max_conns=80;
}
server {
listen 80;
#访问任何一个域名都能定位到这个虚拟服务
server_name static.hoaven.com dynamic.hoaven.com;
location static.hoaven.com {
root html;
index index.html index.htm;
proxy_pass http://static_servers;
}
location dynamic.hoaven.com {
root html;
index index.html index.htm;
proxy_pass http://dynamic_servers;
}
}
标题方案二:配置两个server
server {
listen 80;
server_name static.hoaven.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://static_servers;
}
}
server {
listen 80;
server_name dynamic.hoaven.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://dynamic_servers;
}
}