一、正向代理和反向代理
正向代理.png正向代理的对象是客户端,客户端向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端。常见情景如:翻墙。 反向代理.png
反向代理的对象是服务端,客户端是无感知代理的存在的,运行方式是:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
(1) proxy_pass模块配置语法
Syntax:proxy_pass URL;
Default:--;
Context:location, if in location,limit_except;
(2)反向代理配置示例
server {
listen 80;
server_name candy.com;
location / test_proxy.html$ {
proxy_pass http://127.0.0.1:8080;
}
...
}
假设域名candy.com
8080端口不对外开放,那么直接访问http://www.candy.com:8080/test_proxy.html
将访问不到。通过以上配置,当访问http://www.candy.com/test_proxy.html
时(不写端口则默认80端口),服务器将会去请求http://127.0.0.1:8080
,可成功访问。
二、负载均衡
nginx是7层负载均衡的SLB(Server Load Balance)
(1) 配置语法
Syntax: upstream name { ... }
Default: --
Context:http
(2)最简单的轮询演示示例
- 步骤一,创建html文件
vi /opt/app/code1/index.html
并写入以下内容,同理创建code2, code3。
<!-- code1/index.html -->
<html>
<body> server 1</body>
</html>
- 步骤二,创建配置文件
vi /etc/nginx/conf.d/server1.conf
创建server1.conf 配置文件,并写入以下内容,同理创建server2.conf,server3.conf
// server1.conf
server {
listen 8001;
access_log /var/log/nginx/log/server1.access.log main;
location / {
root /opt/app/code1;
index index.html index.htm;
}
}
- 步骤三, 创建负载均衡配置文件
vi /etc/nginx/conf.d/upstream_test.conf
创建 upstream_test.conf配置文件,并写入以下内容:
配置释义:
upstream 后接该组虚拟服务的名字(自定义的),里面的每一个server可以是ip、域名或是socket。location 中的proxy_pass 后接希望分配给的虚拟服务名称。
所有访问server_name(此处设为 localhost)的请求都将以轮询的方式分配给upstream的三个server。
此时的/etc/nginx/conf.d/
目录中有四个配置文件:
-
步骤四,查看负载均衡的轮询效果
多次刷新,发现请求是以轮询的方式分配到upstream的三个server中。
轮询效果.png
(3) 负载均衡调度算法
调度算法.png- 加权轮询配置示例
upstream candy {
server 192.168.122.1:8081 weight=5;
server 192.168.122.1:8082 ;
server 192.168.122.1:8083;
}
...
如上配置server8081的权重为5,则当有7次请求时,会有5次分配给server8081;
- ip_hash配置示例
upstream candy {
ip_hash;
server 192.168.122.1:8081;
server 192.168.122.1:8082 ;
server 192.168.122.1:8083;
}
...
由于ip_hash是基于remote_addr(客户端ip)进行分配,故而来自同一个ip的请求将固定分配给某一服务器。
ip_hash缺陷:由于ip_hash是基于remote_addr进行分配,而remote_addr不一定是真实的客户端ip(如存在代理的情况下),故而有了基于url_hash的配置方法。
- url_hash 配置语法
Syntax:hash key [consistent];
Default:--
Context:upstream
注:This directive appeared in version 1.7.2
url_hash 配置示例:
upstream candy {
hash $request_uri;
server 192.168.122.1:8081;
server 192.168.122.1:8082 ;
server 192.168.122.1:8083;
}
...
通常,$request_uri
中会有很多内容,如果想针对uri
中的某一个值来做配置,只要加一行判断语句,把对应值用正则表达式提取出来,再将自定义变量进行hash即可。
(4) 其它配置参数
参数配置.png配置示例:
upstream candy {
server 192.168.122.1:8081 down;
server 192.168.122.1:8082 backup;
server 192.168.122.1:8083 max_fails=1 fail_timeout=12s;
}
server {
location / {
proxy_pass http://candy;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
...
按照以上配置,server8081不提供服务,server8082是备用服务器,只有server8083能访问,且server8083设置了max_fails=1
和 fail_timeout=10s
,意思是说,server8083允许的最大连接失败次数是1,超过这个次数,则服务暂停,暂停时间为12s(默认为10s)。
如果server8003的服务挂掉了,那么备用服务器server8082将自动启用,可以通过设置iptable规则来模拟这个过程: 执行iptables -I INPUT -p tcp --dport 8083 -j DROP
把所有访问8083的请求都drop掉(即不对外提供8083端口的服务),此时server8082将自动启用。
proxy_next_upstream
:如果服务器发生错误,如发生500,502等,则跳过该服务器,去访问其它服务器。
三、Nginx作为缓存服务
缓存类型:服务端缓存(缓存在服务器),代理缓存(缓存在Nginx),客户端缓存(缓存在浏览器)
(1)配置语法
proxy_cache配置语法
Syntax:proxy_cache zone | off;
Default:proxy_cache off;
Context:http,server,location;
缓存过期周期配置语法:
Syntax:proxy_cache_valid [code...] time;
Default:--;
Context:http,server,location;
缓存维度配置语法:
Syntax:proxy_cache_key string;
Default:proxy_cache_key$scheme$proxy_host$request_uri
;
Context:http,server,location;
(2) 实例演示
将负载均衡中的最简单的轮询实例中的代码稍作修改做演示:
- 步骤一:
将文件/etc/nginx/conf.d/upstream_test.conf
更名为cache_test.conf
;
并做如下配置:
JPY94LI_I2~IZ~5OM{L(U6W.png
配置释意:
proxy_cache_path
:缓存目录;
levels
:缓存目录按照两层目录的方式进行分级
keys_zone=candy_cache:10m
:开辟名为candy_cache的缓存空间,大小为10m(一般1m可以存放8000个key);
max_size=10g
: 控制缓存目录最大为10G, 若存满了,则nginx会触发自己的淘汰规则,把不常访问的淘汰掉;
inactive=60m
:清除60分钟之内未被访问到的缓存文件;
use_temp_path
:建议关闭,用于存放临时文件,打开的话需要另外建立一个目录来存储,对性能有影响;
proxy_cache_valid
:对于头信息为200和300的缓存过期时间为12小时,除了200和304外的,10分钟过期;
proxy_cache_key
: 需要缓存的key;
add_header
: 增名称为Nginx-Cache加的头信息;
proxy_next_upstream
:如果服务器发生错误,如发生500,502等,则跳过该服务器,去访问另其它服务器。
-
步骤二
打开浏览器,发现刷新后页面不再轮询变化,Nginx-Cache 头信息也被成功写入。
缓存效果.png
(3)如何让部分页面不缓存
vi /etc/nginx/conf.d/cache_test.conf
修改配置文件:
释意:uri中凡是以 login,register,password开头,或包含reset的,创建自定义变量 $cookie_nocache
,值为1,而在proxy_no_cache $cookie_nocache $arg_nocache $arg_comment
此链式中,只要有一个,$cookie_nocache
、$arg_nocache
和$arg_comment
只要有一个变量的值为1,则该uri不会被缓存。
网友评论