以前在有道云笔记中的记录会逐个发布分享,以及个人学习过程中的理解,欢迎交流
文章内容包括以下三点:
1. 反向代理
2. 负载均衡
3. 静态资源缓存
原理图1:负载均衡
原理图2:反向代理
正向代理代理的对象是客户端,反向代理代理的对象是服务端
Linux下搭建Nginx环境
1.所需安装包
Nginx的环境依赖
Nginx安装包
2.编译安装环境依赖
2.1切换root权限
zjp@zjp-virtual-machine:~$ sudo su
[sudo] password for zjp:
root@zjp-virtual-machine:/home/zjp#
2.2进入安装包所在文件夹
-> tar zxvf openssl-1.0.0e.tar.gz 解压压缩包
-> cd openssl-1.0.0e 进入文件夹
->./config && make && make install 开始安装 或->./configure && make && make install
3.安装Nginx
-> tar zxvf nginx-1.12.1.tar.gz 解压压缩包
-> cd nginx-1.12.1 进入文件夹
->./config && make && make install 开始安装
4.启动Nginx
安装完后
启动命令:./nginx
重启命令:./nginx -s reload
启动后,打开终端:ps -aux | grep nginx,查看nginx进程
nginx主线程占用80端口。打开浏览器:http://localhost:80,显示如下,搭建成功
5.修改nginx.conf
root权限进入/usr/local/nginx/conf/ 命令:gedit nginx.conf 用文本编辑器(或者 vi)打开文件
upstream 集群名{
server 192.168.0.155:8080;
server 192.168.0.155:9090;
}
在server中添加:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://集群名;
#root html;
#index index.html index.htm;
}
...
}
修改后保存,重启Nginx
浏览器访问 http://localhost:80/+集群中项目名
进入tomcat_8080服务器
或者进入tomcat_9090服务器
负载均衡
随着业务不断拓展、用户量不断增多,原本一台Nginx代理的服务器已经显得吃力,不论在性能、响应速度等都显得力不从心,所以需要对后台服务器做负载均衡,缓解一台或几台服务器的高并发请求压力。
1、Upstream
负载均衡需要使用Nginx支持的HTTP Upstream模块,该模块通过一个简单的算法调度来实现客户端ip到服务端负载均衡。Upstream目前支持4种调度算法:
- A、默认的轮循:默认的调度算法,在处理客户端的每次请求时,按照时间顺序逐一分配到均衡服务器,可以设定服务器的权重(weight)比值,比值越大访问的几率越大,一般用在后台服务器列表访问性能不均匀情况。
- B、ip_hash:记录每次访客的ip地址,固定分配给指定的服务器,有效的解决了不同服务器网页Session的问题。
- C、fair:根据后端服务器响应的时间长短来分配,响应时间越短被分配几率越大,它属于第三方插件,Nginx本身并不支持,如需使用必须下载Nginx的upstream_fair模块。
- D、url_hash:按访问的地址url的hash值结果分配, 使每个url定向到指定的服务器,可以提高后端服务器的缓存效率,同样的,Nginx本身也不支持该算法,需要第三方的hash软件。
2、Upstream支持的状态参数
在Nginx的Upstream模块中,除了可以通过server指定到特定服务器和端口,还可以设置服务器在负载均衡中的状态。目前的状态如下:
- A、down:代表当前的服务器server不参与负载均衡。
- B、backup:预留的备用设备,也就是当其它的服务器故障或忙时才会分配它给客户请求,所以它的压力最小。
- C、max_fails:服务器server允许请求失败的次数,默认为1次,当失败次数超过限定的次数,就会返回proxy_next_upstream错误信息。
- D、fail_timeout:当经历了max_fails的次数后,暂停服务的时间,一般与max_fails配合使用。
注意:当服务器的调度算法为ip_hash时,服务器在负载均衡中的状态不能是weight和backup
例子1:
upstream backend {
server A max_fails=3 fail_timeout=4s weight=9;
server B max_fails=3 fail_timeout=4s weight=9;
server C max_fails=3 fail_timeout=4s weight=9;
server D backup;
Server E backup;
}
例子2:
upstream backend {
ip_hash;
server A max_fails=3 fail_timeout=4s;
server B max_fails=3 fail_timeout=4s;
server C max_fails=3 fail_timeout=4s;
}
proxy_connect_timeout:与服务器连接的超时时间,默认60s
fail_timeout:当该时间内服务器没响应,则认为服务器失效,默认10s
max_fails:允许连接失败次数,默认为1
某一台服务器宕机后,等待时间 = proxy_connect_timeout + fail_timeout*max_fails
静态资源缓存
1.缓存指令: proxy_cache_path
格式:proxy_cache_path + path + levels + keys_zone + inactive + max_size
- path -缓存文件存放的位置
- levels -缓存目录结构,可以是1、2、3位数字作为目录,最多是3位数字如:1,1:2
- keys_zone -指定缓存池名字及大小,每个定义缓存路径必须不同
- inactive -设置每个缓存区缓存文件的有效时长,超过该时长没被访问的缓存被删除
- max_size -设置不活动的缓存大小,不活动的缓存超过该大小后被删除
例:proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=webpages:30m max_size=2g;
proxy_cache
格式:proxy_cache + cache_name
指定缓存区域的名字,一个相同的区域可以在不同的地方使用。
proxy_cache_valid
格式:proxy_cache_valid + reply_code + time;
例:proxy_cache_valid 200 10m;
nginx.conf配置示例:
events {
worker_connections 1024;
}
http {
upstream tomcatServers {
server 192.168.0.155:8080 weight=1 max_fails=2 fail_timeout=2;
server 192.168.0.155:9090 weight=1 max_fails=2 fail_timeout=2;
server 192.168.0.155:9091 backup;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=webpages:30m max_size=2g;
server {
listen 80;
server_name localhost;
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
location / {
proxy_pass http://tomcatServers;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache webpages;
proxy_cache_valid 200 10m;
#root html;
#index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
新建缓存页面路径:
$ mkdir –pv /nginx/cache/webpages
$server_addr - 显示的服务器地址
$upstream_cache_status - 缓存的状态 可能的值为:MISS(未命中)、Hint(命中)、Expired(请求传递到后台)、Stale(后端得到过期的应答)、Updating(正更新,使用旧的应答)等。 那么,在这里如果缓存的状态为HINT,就说明命中了缓存,也就是调用了缓存文件。
进入缓存路径查看(使用root权限查看):
cat 命令查看文件