实战篇:Nginx反向代理与负载均衡

319 阅读1分钟

以前在有道云笔记中的记录会逐个发布分享,以及个人学习过程中的理解,欢迎交流

文章内容包括以下三点:

1. 反向代理

2. 负载均衡

3. 静态资源缓存

原理图1:负载均衡

clipboard.png

原理图2:反向代理

clipboard2.png

正向代理代理的对象是客户端,反向代理代理的对象是服务端

Linux下搭建Nginx环境

1.所需安装包

clipboard3.png

Nginx的环境依赖

clipboard4.png

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

安装完后

clipboard5.png

启动命令:./nginx

重启命令:./nginx -s reload

启动后,打开终端:ps -aux | grep nginx,查看nginx进程

clipboard6.png

nginx主线程占用80端口。打开浏览器:http://localhost:80,显示如下,搭建成功

clipboard7.png

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服务器

clipboard8.png

或者进入tomcat_9090服务器

clipboard9.png

负载均衡

随着业务不断拓展、用户量不断增多,原本一台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,就说明命中了缓存,也就是调用了缓存文件。

clipboard10.png

进入缓存路径查看(使用root权限查看):

clipboard11.png

cat 命令查看文件

clipboard12.png