一、环境

操作系统:CentOS7

nginx版本:nginx-1.12.1

二、反向代理

修改nginx.conf配置文件

location / {
    proxy_pass    http://www.test.com;    #被代理服务器的地址
    proxy_set_header    X-Real-IP    $remote_addr;    #加上客户端的真是IP

}

到此重启nginx就成功了。

如果被代理服务器是apache,想查看服务器访问日志的话,修改测试被代理服务器的配置文件,可在日志里记录访客真实IP。

[root@web1 ~]# vim /etc/httpd/conf/httpd.conf

t5

注,大家可以这里记录日志的参数还是%h,下面我们修改一下参数。

t6

注,这是修改后的参数,将h%修改为%{X-Real-IP}i,好的下面我们再来测试一下。

 

三、负载均衡

 

1.upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称test.net。这个名称可以任意指定,在后面需要用到的地方直接调用即可。

2.upstream 支持的负载均衡算法

Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。

  • 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
  • ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
  • fair。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
  • url_hash。此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。

3.upstream 支持的状态参数

在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

  • down,表示当前的server暂时不参与负载均衡。
  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。注,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
upstream webservers{    
    #负载均衡
    ip_hash;
    server 192.168.1.188 weight=1;
    server 127.0.0.1:81 weight=1;
    server 119.75.213.61 weight=1;
    server 192.168.10.13:80;
    server 192.168.10.14:80  down;
    server 192.168.10.15:8009  max_fails=3  fail_timeout=20s;
    server 192.168.10.16:8080;
}

server {
    listen 80;
    server_name localhost;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    location / {
        proxy_pass    http://webservers;
        proxy_set_header    X-Real-IP    $remote_addr;
    }
}

注,upstream是定义在server{ }之外的,不能定义在server{ }内部。定义好upstream之后,用proxy_pass引用一下即可。

配置完毕之后,重启nginx就ok了。

注,大家可以不断的刷新浏览的内容,可以发现web1与web2是交替出现的,达到了负载均衡的效果。

 

四、页面缓存

说明

proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];

指定缓存的路径和一些其他参数,缓存的数据存储在文件中,并且使用代理url的哈希值作为关键字与文件名。levels参数指定缓存的子目录数,例如:

proxy_cache_path  /data/nginx/cache  levels=1:2   keys_zone=one:10m

文件名类似于:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

levels指定目录结构,可以使用任意的1位或2位数字作为目录结构,如 X, X:X,或X:X:X 例如: “2”, “2:2”, “1:1:2“,但是最多只能是三级目录。
所有活动的key和元数据存储在共享的内存池中,这个区域用keys_zone参数指定。one指的是共享池的名称,10m指的是共享池的大小。

如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。一个名为cache manager的进程控制磁盘的缓存大小,它被用来删除不活动的缓存和控制缓存大小,这些都在max_size参数中定义,当目前缓存的值超出max_size指定的值之后,超过其大小后最少使用数据(LRU替换算法)将被删除。内存池的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,如FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节。

proxy_cache

设置一个缓存区域的名称,一个相同的区域可以在不同的地方使用。
在0.7.48后,缓存遵循后端的”Expires”, “Cache-Control: no-cache”, “Cache-Control: max-age=XXX”头部字段,0.7.66版本以后,”Cache-Control:“private”和”no-store”头同样被遵循。nginx在缓存过程中不会处理”Vary”头,为了确保一些私有数据不被所有的用户看到,后端必须设置 “no-cache”或者”max-age=0”头,或者proxy_cache_key包含用户指定的数据如$cookie_xxx,使用cookie的值作为proxy_cache_key的一部分可以防止缓存私有数据,所以可以在不同的location中分别指定proxy_cache_key的值以便分开私有数据和公有数据。

缓存指令依赖代理缓冲区(buffers),如果proxy_buffers设置为off,缓存不会生效。

proxy_cache_valid

为不同的应答设置不同的缓存时间,例如:、

proxy_cache_valid  200 302  10m;
proxy_cache_valid  404     1m;

为应答代码为200和302的设置缓存时间为10分钟,404代码缓存1分钟。

如果只定义时间:

proxy_cache_valid 5m;

那么只对代码为200, 301和302的应答进行缓存。
同样可以使用any参数任何应答。

缓存变量说明

$server_addr

服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。

$upstream_cache_status

其值可能为:

  • MISS 未命中
  • EXPIRED – expired。请求被传送到后端。
  • UPDATING – expired。由于proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答。
  • STALE – expired。由于proxy/fastcgi_cache_use_stale,后端将得到过期的应答。
  • HIT 命中

 

proxy_cache_path /data/nginx/cache/webserver levels=1:2 keys_zone=webserver:20m max_size=1g;
   server {
       listen       80;
       server_name  localhost;
       #charset koi8-r;
       #access_log  logs/host.access.log  main;
       #增加两头部
       add_header X-Via $server_addr;
       add_header X-Cache $upstream_cache_status;
       location / {
               proxy_pass      http://webservers;
               proxy_set_header  X-Real-IP  $remote_addr;
               proxy_cache webserver;
               proxy_cache_valid 200 10m;
       }
}

新建缓存目录

[root@nginx ~]# mkdir -pv /data/nginx/cache/webserver

搞定之后,重启nginx,打开浏览器访问,如图

X-Cache的值为HIT,说明我访问到的是已缓存页面。访问到非缓存页面的时候值为EXPIRED。

查看一下缓存目录

[root@nginx ~]# cd /data/nginx/cache/webserver,进入之后查看文件修改时间,每当页面被缓存的时候缓存文件的修改时间发生了变化,如图

 

 

我的这些操作都是按照:http://www.360doc.com/content/13/1114/12/7694408_329125489.shtml,这个页面的教程来的,很详细。

 

发表评论