Nginx 反为代理、负载均衡、页面缓存、URL重写及读写分离详解

转载:http://freeloda.blog.51cto.com/2033581/1288553

假设一个热爱生活,爱吃好玩脑洞无限的逗逼吗?你烦中规中矩的办事,喜欢接受创意的挑衅吧?你嗜互联网,热爱新媒体吗?假使是,这尔还犹疑什么?疾速进入大家吧!

大纲

电子商务 1

一、前言

亚、环境准备

其三、安装以及安排Nginx

季、Nginx之相反往代理

五、Nginx之负载均衡

六、Nginx之页面缓存

七、Nginx之URL重写

八、Nginx之念写分离

—关于大家—品创者,一丛决心搞好一款互联网产品之人头,我们带来在重任进入酒行业,希望会提供平等缓大格调而以未值钱的制品让不同消费层次之丁,深知只有诚实的产品才可以吃买主带来健康之在,大家希望会由一个点来点一个行之盲区,从而让酒这些行业越来越透明化。这便是品创者的沉重及初衷。一丛年轻的口带在年轻的学问,梦想在转一个行之腐败现象。

横流,操作系统为 CentOS 6.4 x86_64 , Nginx
是本子是风靡版本的1.4.2,所以实验用到的软件要点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm

电子商务 2

 

品创者最爱这些由当大有能力的人数入手会叫你们知道,品创者一直不说鬼话
大家出打闹至死的营业所文化及同事互黑,和首席执行官撕逼大家从未规则的束缚,工作快乐就是好我们是同样丛闹精力之子弟做丰裕有义的互联网事业将来时有产生无限好之发展空间

一、前言

电子商务 3

     
 在前边的几篇博文被我们最紧要助教了Nginx作为Web服务器知识点,紧要的知识点有nginx的争论详解、nginx作为web服务器的操作讲解、nginx作为LNMP架构的上书,不知底的博友可以回头看,在当时同首博客中我们要教师,
nginx的反向代理、负载均衡、缓存、URL重写及读写分离详解。好了,下边大家来具体说一样游说。

你只要来力量以及大家耍
品创者不在意你随便玩
招聘职位文案&编辑(懂点PS更好)
而你有幼儿园以上学历(拒绝应试教育之监禁)有比强的仿功底,热爱文字写作脑洞够好,想法新奇特(不明白凡是啊的即便甭投简历了)关注时事热点,擅长和人口交换(Duang!Duang!······)着重,有团体协作精神(工作无是一个丁之转业,你通晓之)
电商&运营 千方百计新奇,对品牌有显的敏感度 有超市运营更熟习又老百货集团的性状将点多少解析以及用户调研会搞点品牌营销,事件营销能够勾勒出品牌之神气理念传递出品牌思想还得是交际达人够活泼开朗
设计狮&U/VI 脑洞够好,想法够新奇有过品牌设计案例/经验(专业出身)设计创作暴发准儿的精通力和增长的新意能力
倘解的技术板块就未多说了审美观要后来居上,白羊座的极品(也即使是生人格障碍)
上述职务待遇面议福利看前边就掌握了保险尔中意
以上职位都只是承受突出实习生快参加我们吧或者推荐而身边可以之同伙在品创者,必来重谢。

次、环境准备

电子商务 4

  1. 操作系统

—简历投递—邮箱:971313671@qq.com电话:18708510894微信:pcz5894
吉林品创者电子商务有限公司地址:花果园财富广场R区1哀号楼2810

  • CentOS 6.4 x86_64

电子商务 5

2.软件版本

电子商务,读书原文:http://2671732454.lofter.com/post/1e246c11\_b5d5b5b

  • Nginx 1.4.2

3.实验拓扑

流淌,实验拓扑见下文。

4.安装yum源

1
2
3
[root@nginx ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@web1 ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@web2 ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

5.各节点时间同步

1
2
3
[root@nginx ~]# ntpdate 202.120.2.101
[root@web1 ~]# ntpdate 202.120.2.101
[root@web2 ~]# ntpdate 202.120.2.101

6.关闭防火墙与SELinux

1
2
3
4
5
6
7
8
9
10
11
12
[root@nginx ~]# service iptables stop
[root@nginx ~]# chkconfig iptables off 
[root@nginx ~]# getenforce 
Disabled
[root@web1 ~]# service iptables stop
[root@web1 ~]# chkconfig iptables off 
[root@web1 ~]# getenforce 
Disabled
[root@web2 ~]# service iptables stop
[root@web2 ~]# chkconfig iptables off 
[root@web2 ~]# getenforce 
Disabled

三、安装Nginx

1.解压

1
[root@nginx src]# tar xf nginx-1.4.2.tar.gz

2.新建nginx用户与组

1
2
3
4
[root@nginx src]# groupadd -g 108  -r nginx
[root@nginx src]# useradd -u 108 -r -g 108 nginx 
[root@nginx src]# id nginx 
uid=108(nginx) gid=108(nginx) 组=108(nginx)

3.备选编译配置文件

1
2
[root@nginx src]# yum install -y pcre-devel openssl-devel
[root@nginx nginx-1.4.2]# ./configure   --prefix=/usr   --sbin-path=/usr/sbin/nginx   --conf-path=/etc/nginx/nginx.conf   --error-log-path=/var/log/nginx/error.log   --http-log-path=/var/log/nginx/access.log   --pid-path=/var/run/nginx/nginx.pid    --lock-path=/var/lock/nginx.lock   --user=nginx   --group=nginx   --with-http_ssl_module   --with-http_flv_module   --with-http_stub_status_module   --with-http_gzip_static_module   --http-client-body-temp-path=/var/tmp/nginx/client/   --http-proxy-temp-path=/var/tmp/nginx/proxy/   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi   --http-scgi-temp-path=/var/tmp/nginx/scgi   --with-pcre

4.编翻并设置

1
[root@nginx nginx-1.4.2]# make && make install

5.为nginx提供SysV init脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
[root@nginx ~]# cat /etc/init.d/nginx
#!/bin/sh 
# nginx - this script starts and stops the nginx daemon 
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 
#               proxy and IMAP/POP3 proxy server 
# processname: nginx 
# config:      /etc/nginx/nginx.conf 
# config:      /etc/sysconfig/nginx 
# pidfile:     /var/run/nginx.pid 
# Source function library. 
/etc/rc.d/init.d/functions 
# Source networking configuration. 
/etc/sysconfig/network 
# Check that networking is up. 
"$NETWORKING" "no" ] && exit 
nginx="/usr/sbin/nginx" 
prog=$(basename $nginx) 
NGINX_CONF_FILE="/etc/nginx/nginx.conf" 
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 
lockfile=/var/lock/subsys/nginx 
make_dirs() { 
   # make required directories 
   user=`nginx -V 2>&1 | grep "configure arguments:" sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
   options=`$nginx -V 2>&1 | grep 'configure arguments:'
   for opt in $options; do 
       if [ `echo $opt | grep '.*-temp-path'` ]; then 
           value=`echo $opt | cut -d "=" -f 2` 
           if [ ! -d "$value" ]; then 
               # echo "creating" $value 
               mkdir -p $value && chown -R $user $value 
           fi 
       fi 
   done 
start() { 
    [ -x $nginx ] || exit 
    [ -f $NGINX_CONF_FILE ] || exit 
    make_dirs 
    echo -n $"Starting $prog: " 
    daemon $nginx -c $NGINX_CONF_FILE 
    retval=$? 
    echo 
    [ $retval -eq 0 ] && touch $lockfile 
    return $retval 
stop() { 
    echo -n $"Stopping $prog: " 
    killproc $prog -QUIT 
    retval=$? 
    echo 
    [ $retval -eq 0 ] && rm -f $lockfile 
    return $retval 
restart() { 
    configtest || return $? 
    stop 
    sleep 
    start 
reload() { 
    configtest || return $? 
    echo -n $"Reloading $prog: " 
    killproc $nginx -HUP 
    RETVAL=$? 
    echo 
force_reload() { 
    restart 
configtest() { 
  $nginx -t -c $NGINX_CONF_FILE 
rh_status() { 
    status $prog 
rh_status_q() { 
    rh_status >/dev/null 2>&1 
case "$1" in 
    start) 
        rh_status_q && exit 
        $1 
        ;; 
    stop) 
        rh_status_q || exit 
        $1 
        ;; 
    restart|configtest) 
        $1 
        ;; 
    reload) 
        rh_status_q || exit 
        $1 
        ;; 
    force-reload) 
        force_reload 
        ;; 
    status) 
        rh_status 
        ;; 
    condrestart|try-restart) 
        rh_status_q || exit 
            ;; 
    *) 
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 
        exit 
esac

6.呢是脚本赋予执行权

1
[root@nginx ~]# chmod +x /etc/init.d/nginx

7.添加至服务管理列表,并于这开机自动启动

1
2
3
4
[root@nginx ~]# chkconfig --add nginx
[root@nginx ~]# chkconfig nginx on 
[root@nginx ~]# chkconfig nginx --list 
nginx              0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭

8.启动nginx

1
2
[root@nginx ~]# service nginx start
正在启动 nginx:                                           [确定]

9.翻转端口

1
2
[root@nginx ~]# netstat -ntlp | grep :80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3889/nginx

10.测试一下

电子商务 6

哼了,Nginx安装及配置就顶此,下面我们来说无异于说Nginx的反向代理。

季、Nginx之相反往代理

每当配置nginx反朝代理之间我们得先准备简单贵测试服务器,Web1与Web2。

1.安装httpd

1
2
[root@web1 ~]# yum install -y httpd
[root@web2 ~]# yum install -y httpd

2.提供测试页面

1
2
[root@web1 ~]# echo "<h1>web1.test.com</h1>" > /var/www/html/index.html
[root@web2 ~]# echo "<h1>web2.test.com</h1>" > /var/www/html/index.html

3.启动httpd服务

1
2
3
4
[root@web1 ~]# service httpd start
正在启动 httpd:                                           [确定]
[root@web2 ~]# service httpd start
正在启动 httpd:                                           [确定]

4.测试一下

电子商务 7

电子商务 8

5.简说一下,正为代理和反向代理

(1).正向代理的定义

       正向代理,也就是是风传着之代理,他的行事规律就是像一个跳板,一句话来说,我是一个用户,我看不了有网站,不过自力所能及顾一个代理服务器,那一个代理服务器呢,他可以访问分外我非克看的网站,于是自己事先连上代理服务器,告诉他本人急需大不可能访问网站的始末,代理服务器去取回来,然后重回给我。从网站的角度,只于代理服务器来取内容的时发生相同涂鸦记录,有时候并不知道是用户之呼吁,也藏了用户的素材,这有赖于代理告不报告网站。

       结论就是是,正为代理 是一个厕客户端与旧服务器(origin
server)之间的服务器,为了打旧服务器取得内容,客户端向代理发送一个告并指定目的(原始服务器),然后代理于原服务器转交请求并将取得的情节再次回到给客户端。客户端必须要开展局部特其它设置才会下正朝着代理。

(2).反为代理的定义

延续举例:    
     
 例用户访问 http://www.test.com/readme,但www.test.com高达并无在readme页面,他是背后从另外一高服务器上拿到回来,然后作为团结的情重临用户,但用户并无了解。这里所关联的 www.test.com 这多少个域名对应的服务器即装了反朝代理效率。

     
 结论就是是,反向代理正好相反,对于客户端而言它就如是原始服务器,并且客户端不待展开任何特其它安。客户端向相反朝代理的命名空间(name-space)中之情发送普通请求,接着反向代理将判断为什么地方(原始服务器)转交请求,并拿拿到的内容再次来到给客户端,就像那一个情节原本就是其和谐的如出一辙。

(3).两者区别

用途上来讲:

     
 正往代理的超人用途是啊当防火墙内之局域网客户端提供访问Internet的门路。正于代理还可运用缓冲特性收缩网络使用率。反向代理的头名用途是拿防火墙前边的服务器提供于Internet用户访问。反向代理还好啊晚端的多台服务器提供负载平衡,或也后端较缓的服务器提供缓冲服务。另外,反向代理仍是可以够启用高级URL策略及治本技术,从而使处于不同web服务器系统的web页面同时是叫与一个URL空间下。

安全性来讲:

     
 正向代理允许客户端通过其访问任意网站并且隐藏客户端自身,由此而不可能不使用安全法为确保单独为通过授权的客户端提供服务。反向代理对外都是晶莹底,访问者并不知道自己看的是一个代理。

6.nginx 摄模块

http
代理官方中文文档
http://www.howtocn.org/nginx:nginx%E6%A8%A1%E5%9D%97%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E7%89%88:standardhttpmodules:httpproxy

证:代理模块的命发出众多自身此唯有讲解首要的proxy_pass,想询问再多代理指令请参见官方中文文档。

这个模块可转化呼吁到其它的服务器。HTTP/1.0不可能使用keepalive(后端服务器将为每个请求创制以删除连接)。nginx为浏览器发送HTTP/1.1连为后端服务器发送HTTP/1.0,这样浏览器就足以呢浏览器处理keepalive。
    
如下例:

1
2
3
4
location / {
  proxy_pass        http://localhost:8000;
  proxy_set_header  X-Real-IP  $remote_addr;
}

注意,当使用http
proxy模块(甚至法斯特(Fast)(Fast)CGI),所有的连年要于发送至后端服务器在此之前nginx将缓存它们,由此,在测量从后端传送的数通常,它的速度显示可能未科学。

尝试拓扑:

电子商务 9

7.安排http反为代理

1
2
3
4
5
6
[root@nginx ~]# cd /etc/nginx/
[root@nginx nginx]# cp nginx.conf nginx.conf.bak #备份一个原配置文件
[root@nginx nginx]# vim nginx.conf
location / {
               proxy_pass      http://192.168.18.201;
       }

一声令下表达:proxy_pass

语法:proxy_pass URL
默认值:no       
选拔字段:location, location中的if字段       
斯令设置于代理服务器的地址与被映射的URI,地址可以拔取主机名或IP加端口号的样式,例如:proxy_pass http://localhost:8000/uri/;

8.重新加载一下布置文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

9.测试一下

电子商务 10

流淌,我们可看出,当我们访问192.168.18.208通常,被摄重新定向到Web1达标。

10.查看转Web服务器日志

1
2
3
4
5
6
7
8
9
10
11
[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.208 - - [04/Sep/2013:00:14:20 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:14:20 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:14:20 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.138 - - [04/Sep/2013:00:14:45 +0800] "GET / HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.138 - - [04/Sep/2013:00:14:48 +0800] "GET /favicon.ico HTTP/1.1" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:14:55 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:15:05 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:15:13 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:15:16 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:15:16 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

横流,我们可以望我们这里的客户之IP全是,nginx代理服务器的IP,并无是确实实客户端的IP。下边我们修改一下,让日志的IP显示真实的客户端的IP。

11.改nginx配置文件

 

1
2
3
4
location / {
        proxy_pass      http://192.168.18.201;
        proxy_set_header  X-Real-IP  $remote_addr; #加上这一行
}

一声令下表明:proxy_set_header

语法:proxy_set_header header value 
默认值: Host and Connection 
使用字段:http, server, location 
这命令允许用发送到为代理服务器的呼吁头又定义或者扩充部分字段。这几个价值好是一个文书,变量或者其的构成。proxy_set_header在指定的字段中一贯不定义时会于她的上司字段继承。

12.复加载一下布局文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

13.测试并查阅日志

1
2
3
4
5
6
7
8
9
10
11
[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

横流,我们可看出日志记录的或者代理的IP,没有显得真实客户端的IP,为何呢?我们来拘禁一下httpd的配备文件。

14.查看并修改httpd配置文件

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

电子商务 11

横流,我们好此记录日志的参数依旧%h,下边大家修改一下参数。

电子商务 12

横流,这是改后底参数,将h%修改为%{X-Real-IP}i,好之下边我们再次来测试一下。

15.更开并测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@web1 ~]# service httpd restart
停止 httpd:                                               [确定]
正在启动 httpd:                                           [确定]
[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [03/Sep/2013:17:09:14 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:14 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

注,咱们可以见到现在之日记里记录之IP地址便是开诚布公的客户端地址了。好了,到此处Nginx代理后端一光服务器即演示到此,下面大家后续游说。

五、Nginx之负载均衡

流淌,我们可看出,由于我们网站是提高初,nginx只代理了后端一高服务器,但由于我们网站名气大涨访问的人头更为多一致光服务器实在是暨不歇,于是我们加了差不多尊服务器,那么多大服务器又岂安排代理呢,我们这边以单薄台服务器也案例,为我们做示范。

1.upstream 载重均衡模块表明

案例:

下设定负载均衡的服务器列表。

1
2
3
4
5
6
7
8
9
10
11
12
upstream test.net{
ip_hash;
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 {
  location / {
    proxy_pass  http://test.net;
  }
}

       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。

4.试行拓扑

电子商务 13

5.部署nginx负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
      server 192.168.18.201 weight=1;
      server 192.168.18.202 weight=1;
  }
  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引用一下即可。

6.又加载一下布局文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

7.测试一下

电子商务 14

电子商务 15

流动,大家可不停的刷新浏览的情,可以发现web1及web2凡是轮番出现的,达到了负荷均衡的功能。

8.查转Web访问服务器日志

Web1:

1
2
3
4
5
6
7
8
9
10
11
[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [04/Sep/2013:09:41:58 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:58 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:59 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:59 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:21 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:22 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:22 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

Web2:

优先改一下,Web服务器记录日志的格式。

1
2
3
4
5
[root@web2 ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@web2 ~]# service httpd restart
停止 httpd:                                               [确定]
正在启动 httpd:                                           [确定]

随后,再拜数,继续查看日志。

1
2
3
4
5
6
7
8
9
10
11
[root@web2 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:29 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:29 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

流动,我们美观到,两令服务器日志都记录是192.168.18.138造访的日志,也印证了负荷均衡配置成功。

9.布置nginx举行健康状态检查

  • max_fails,允许请求败北的次数,默认为1。当跨越最要命次数时,重临proxy_next_upstream
    模块定义的谬误。

  • fail_timeout,在经历了max_fails次破产后,暂停服务的时间。max_fails可以和fail_timeout一起利用,举行正规状态检查。

1
2
3
4
5
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
    }

10.再加载一下配备文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

11.住服务器并测试

1
2
3
先停止Web1,进行测试。
[root@web1 ~]# service httpd stop
停止 httpd:                                               [确定]

电子商务 16

流淌,大家雅观来,现在只能看Web2,再还启航Web1,再度做客一下。

1
2
[root@web1 ~]# service httpd start
正在启动 httpd:                                           [确定]

电子商务 17

电子商务 18

横流,我们好观看,现在还要得再次访问,表明nginx的正规状态查检配置成功。但我们想转手,假使不幸的凡兼具服务器都未可知提供劳务了怎么惩罚,用户打开页面就会师现出有错页面,那么会带来用户体验的下落,所以我们可以不可能像安排LVS是布置sorry_server呢,答案是可的,但这里不是部署sorry_server而是配置backup。

12.配置backup服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@nginx ~]# vim /etc/nginx/nginx.conf
server {
                listen 8080;
                server_name localhost;
                root /data/www/errorpage;
                index index.html;
        }
upstream webservers {
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
        server 127.0.0.1:8080 backup;
    }
[root@nginx ~]# mkdir -pv /data/www/errorpage
[root@nginx errorpage]# cat index.html
<h1>Sorry......</h1>

13.更加载配置文件

1
2
3
4
[root@nginx errorpage]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

14.关闭Web服务器并拓展测试

1
2
3
4
[root@web1 ~]# service httpd stop
停止 httpd:                                               [确定]
[root@web2 ~]# service httpd stop
停止 httpd:                                               [确定]

电子商务 19

流淌,大家可望,当有着服务器都未可以干活时,就相会启动备份服务器。好了,backup服务器就安排到这里,下边我们来配置ip_hash负载均衡。

15.配置ip_hash负载均衡

  • ip_hash,每个请求遵照访问IP的hash结果分配,那样来和一个IP的访客固定访问一个后端服务器,有效化解了动态网页存在的session共享问题。(一般电子商务网站因而的比多)
1
2
3
4
5
6
7
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
        ip_hash;
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
        #server 127.0.0.1:8080 backup;
    }

流淌,当负载调度算法也ip_hash时,后端服务器在负载均衡调度中之状态不克起backup。(有人或许相会咨询,为何也?大家想什么,如若负载均衡将你分配至backup服务器上,你能看到页面吗?不可知,所以了未可以安排backup服务器)

16.又加载一下服务器

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

17.测试一下

电子商务 20

横流,我们可望,你不断的刷新页面一贯会显示的民Web2,说明ip_hash负载均衡布局成功。下面我们来总括一下Web2之拜访连接数。

18.总结Web2底拜会连接数

1
2
[root@web2 ~]# netstat -an | grep :80 | wc -l
304

流动,你不停的刷新,连接数会晤进一步多。好了,nginx的载荷均衡就尽演示到此处下边大家来说同样游说,页面缓存。

六、Nginx之页面缓存

1.命令说明

proxy_cache_path

语法:proxy_cache_path path [levels=number]
keys_zone=zone_name:zone_size [inactive=time] [max_size=size];
 
默认值:None  
利用字段:http  
指令指定缓存的路径和部分其他参数,缓存的数存储于文书中,并且动用代理url的哈希值作为重大字与公事称。levels参数指定缓存的子目录数,例如:

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

文件称类似于:

1
/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指的凡一同享池的大大小小。
 
顾每一个概念之外存池必须是勿又的途径,例如:

1
2
3
proxy_cache_path  /data/nginx/cache/one    levels=1      keys_zone=one:10m;
proxy_cache_path  /data/nginx/cache/two    levels=2:2    keys_zone=two:100m;
proxy_cache_path  /data/nginx/cache/three  levels=1:1:2  keys_zone=three:1000m;

假定当inactive参数指定的年华内缓存的数据尚未受请虽被删去,默认inactive为10分钟。一个名叫也cache
manager的过程控制磁盘的苏存大小,它让用来删除不移动之缓存和控制缓存大小,这个还在max_size参数中定义,当近期缓存的价大于max_size指定的值后,抢先其尺寸后至少使用数据(LRU替换算法)将为去除。内存池的轻重缓急随缓存页面数的百分比举办设置,一个页面(文件)的头条数据大小论操作系统来定,如FreeBSD/i386生吧64字节,FreeBSD/amd64生啊128字节。

proxy_cache

语法:proxy_cache zone_name;  
默认值:None  
应用字段:http, server, location  
设置一个缓存区域之名目,一个同的区域可以以不同之地点选择。  
当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 reply_code [reply_code …] time;  
默认值:None  
以字段:http, server, location  
啊歧之应对设置不同的缓存时间,例如:

1
2
proxy_cache_valid  200 302  10m;
proxy_cache_valid  404      1m;

也诺答代码为200和302之安装缓存时间呢10分钟,404代码缓存1分钟。  
使就定义时间:

1
proxy_cache_valid 5m;

这就是说单纯对代码为200, 301以及302的回答举行缓存。  
相同可使any参数任何对。

1
2
3
proxy_cache_valid  200 302 10m;
proxy_cache_valid  301 1h;
proxy_cache_valid  any 1m;

2.定义一个简单易行nginx缓存服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@nginx ~]# vim /etc/nginx/nginx.conf
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;
       location / {
               proxy_pass      http://webservers;
               proxy_set_header  X-Real-IP  $remote_addr;
               proxy_cache webserver;
               proxy_cache_valid 200 10m;
       }
}

3.新建缓存目录

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

4.重新加载一下布局文件

1
2
3
4
[root@nginx webserver]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

5.脚大家来测试一下(Google浏览器)

电子商务 21

横流,大家于是Google浏览器测试的当儿,可以按F12调用开发工具,选取Network选项,我们可以看出,Response
Headers,在此处大家得看来,我们呼吁的是不是是缓存,但现在还看不到,下边大家来布局一下,再来测试。

  1. 缓存变量表明
$server_addr

服务器地址,在成就同样不善系统调用后可以确定这个价值,假使如绕开系统调用,则必须在listen中指定地址以动bind参数。

$upstream_cache_status

0.8.3版中其值可能吗:

  • MISS 未命中

  • EXPIRED – expired。请求让传送至后端。

  • UPDATING –
    expired。由于proxy/fastcgi_cache_use_stale正在更新,将动用初的答应。

  • STALE –
    expired。由于proxy/fastcgi_cache_use_stale,后端将收获过的应对。

  • HIT 命中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@nginx ~]# vim /etc/nginx/nginx.conf
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;
        }
}

7.复加载一下布局文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

8.测试一下

电子商务 22

注,从图备受我们得以视,我们访问的服务器是192.168.18.208,缓存命中。我们好寓目是不是生直观啊。下面我们看一下缓存目录。

9.查看转缓存目录

1
2
3
[root@nginx ~]# cd /data/nginx/cache/webserver/f/63/
[root@nginx 63]# ls
681ad4c77694b65d61c9985553a2763f

横流,缓存目录里的确暴发缓存文件。好了,nginx缓存配置就到就边了,更多配备请依照需要看安排文档。下面我们来说一下,URL重写。

七、Nginx之URL重写

1.URL又写模块(Rewrite)

摘要

其一模块允许以正则表明式重写URI(需PCRE库),并且可以因相关变量重定向同抉择不同之安排。假使这命令在server字段中指定,那么用以叫请的location确定在此以前实施,假设在命令执行后所采纳的location中生其它的重写规则,那么其也于执行。倘诺在location中实践之令发出了新的URI,那么location又平等差确定了初的URI。这样的大循环可以尽多行10软,超越之后nginx将赶回500误。

指令

break

语法:break  
默认值:none  
下字段:server, location, if  
完了服装的规则,截至执行此外的重写指令。  
示例:

1
2
3
4
if ($slow) {
  limit_rate  10k;
  break;
}
if

语法:if (condition) { … }  
默认值:none  
利用字段:server, location  
注意:在应用if指令在此以前要查看if is evil
page
以尽量考虑就此try_files代替。
 
看清一个规范,假设基准建立,则后边的大括哀号内之言语以推行,相关配置起下边继承。
 
可以在认清语句被指定下列值:

  • 一个变量的称号;不起的价为:空字符传”“或者有些由此“0”先导的字符串。

  • 一个运=或者!=运算符的可比语句。

  • 用标志~*和~情势匹配的正则表明式:

  • ~为分轻重缓急写的配合。

  • ~*莫分轻重缓急写的匹配(firefox匹配FireFox(Fox))。

  • !~和!~*毕为“不匹配的”。

  • 使用-f和!-f检查一个文书是否留存。

  • 使用-d和!-d检查一个目录是否在。

  • 使用-e和!-e检查一个文本,目录或者软链接是否是。

  • 使用-x和!-x检查一个文书是否也可执行文件。

正则表明式的一模一样组成部分足就此圆括号,方便之后仍顺序用$1-$9来引用。  
示范配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}
                                                                                                                                                        
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;
}
                                                                                                                                                        
if ($request_method = POST ) {
  return 405;
}
                                                                                                                                                        
if (!-f $request_filename) {
  break;
  proxy_pass  http://127.0.0.1;
}
                                                                                                                                                        
if ($slow) {
  limit_rate  10k;
}
                                                                                                                                                        
if ($invalid_referer) {
  return   403;
}
                                                                                                                                                        
if ($args ~ post=140){
  rewrite ^ http://example.com/ permanent;
}

置变量$invalid_referer用指令valid_referers指定。

return

语法:return code  
默认值:none  
利用字段:server, location, if  
本条令截止执行配置语句并为客户端重临状态代码,可以应用下列的价:204,400,402-406,408,410,
411, 413,
416与500-504。此外,非标准代码444以关门连接而不发送任何的脑壳。

rewrite

语法:rewrite regex replacement flag  
默认值:none  
下字段:server, location, if  
本相关的正则表明式与字符串修改URI,指令以在配置文件中出现的顺序执行。
 
好以再一次写指令后加加标记。  
假定替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
 
尾部底号(flag)可以是以下的价:

  • last – 完成再写指令,之后搜索相应的URI或location。

  • break – 完成再写指令。

  • redirect – 再次来到302现再定向,如若替换字段用http://开头则被使用。

  • permanent – 再次来到301永远重定向。

只顾要一个重定向是对立的(没有主机名有),nginx将在再次定向的长河遭到行使匹配server_name指令的“Host”头或者server_name指令指定的率先个名称,假使头不般配或非设有,倘使没安装server_name,将拔取当地主机名,假诺你连思念被nginx使用“Host”头,可以于server_name使用“*”通配符(查看http主旨模块中之server_name)。例如:

1
2
3
rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  last;
rewrite  ^(/download/.*)/audio/(.*)\..*$  $1/mp3/$2.ra   last;
return   403;

可是只要我们拿其放入一个名为/download/的location中,则用将last标记改也break,否则nginx将实施10破巡回并返500错误。

1
2
3
4
5
location /download/ {
  rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  break;
  rewrite  ^(/download/.*)/audio/(.*)\..*$  $1/mp3/$2.ra   break;
  return   403;
}

如替换字段中寓参数,那么其他的央求参数将叠加到前面,为了制止附加,可以当最后一个字符前边与一个问号:

1
rewrite  ^/users/(.*)$  /show?user=$1?  last;

注意:大括如泣如诉({和}),可以以用在正则表明式和布置块被,为了避免争执,正则表明式使用大括号要用双引号(或者单引号)。例如要再次写以下的URL:

1
/photos/123456

为:

1
/path/to/photos/12/1234/123456.png

虽说以以下正则表明式(注意引号):

1
rewrite  "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;

假若指定一个“?”在又写的末尾,Nginx将抛弃请求中之参数,即变量$args,当使用$request_uri$uri&$args每每得以在rewrite结尾使用“?”以防止nginx处理两不行参数拧。
 
在rewrite中使用$request_uri将www.example.com重写到example.com:

1
2
3
4
server {
   server_name www.example.com;
   rewrite ^ http://example.com$request_uri? permanent;
}

相同,重写单针对路线举办操作,而未是参数,假诺假如又写一个带动参数的URL,可以利用以下代替:

1
2
3
if ($args ^~ post=100){
  rewrite ^ http://example.com/new-address.html? permanent;
}

留神$args变量不会见于编译,与location过程遭到之URI不同(参考http核心模块中的location)。

rewrite_log

语法:rewrite_log on | off  
默认值:rewrite_log off  
应用字段:server, location, if  
变量:无  
启用时用于error log中著录notice 标记的重写日志。

set

语法:set variable value  
默认值:none  
运用字段:server, location, if  
命令设置一个变量并也这赋值,其值能够是文本,变量和其的构成。  
君得运用set定义一个新的变量,可是未可知以set设置$http_xxx头部变量的价。

uninitialized_variable_warn

语法:uninitialized_variable_warn on|off  
默认值:uninitialized_variable_warn on  
使用字段:http, server, location, if  
被或关闭在不初叶化变量中记录警告日志。  
实则,rewrite指令在布局文件加载时一度编译到里头代码中,在解释器爆发请求时使用。
 
此解释器是一个概括的库房虚拟机,如下列指令:

1
2
3
4
5
6
7
8
location /download/ {
  if ($forbidden) {
    return   403;
  }
  if ($slow) {
    limit_rate  10k;
  }
  rewrite  ^/(download/.*)/media/(.*)\..*$  /$1/mp3/$2.mp3  break;

以给编译成以下依次:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
variable $forbidden
checking to zero
recovery 403
completion of entire code
variable $slow
checking to zero
checkings of regular excodession
copying "/"
copying $1
copying "/mp3/"
copying $2
copying ".mp3"
completion of regular excodession
completion of entire sequence

专注并没有关于limit_rate的代码,因为它们并未提及ngx_http_rewrite_module模块,“if”块好接近”location”指令在配置文件之一律部分还即使。
 
设若$slow为真,对应的if块将生效,在那多少个布局中limit_rate的值为10k。  
指令:

1
rewrite  ^/(download/.*)/media/(.*)\..*$  /$1/mp3/$2.mp3  break;

假如我们用首先只斜杠括入圆括号,则足以减掉执行顺序:

1
rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  break;

自此的逐条类似如下:

1
2
3
4
5
6
7
checking regular excodession
copying $1
copying "/mp3/"
copying $2
copying ".mp3"
completion of regular excodession
completion of entire code
2.简单案例

注,由于配置文件内容较多,为了让大家看着方便,我们备份一下配置文件,打开一个新的配置文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@nginx ~]# cd /etc/nginx/
[root@nginx nginx]# mv nginx.conf nginx.conf.proxy
[root@nginx nginx]# cp nginx.conf.bak nginx.conf
[root@nginx nginx]# vim /etc/nginx/nginx.conf
server {
      listen       80;
      server_name  localhost;
      #charset koi8-r;
      #access_log  logs/host.access.log  main;
      location / {
          root   html;
          index  index.html index.htm;
          rewrite ^/bbs/(.*)$ http://192.168.18.201/forum/$1;
      }
}
准备forum目录与测试文件
1
2
3
4
5
6
7
[root@web1 ~]# cd /var/www/html/
[root@web1 html]# ls
index.html
[root@web1 html]# mkdir forum
[root@web1 html]# cd forum/
[root@web1 forum]# vim index.html
<h1>forum page!</h1>

测试一下

电子商务 23

好了,下边我们来测试一下rewrite重写。

3.重新加载一下配置文件
1
2
3
4
[root@nginx 63]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

4.测试一下

电子商务 24

流动,我们可由图被扣有,status code
302依靠的凡临时再定向,这就是印证大家rewrite重写配置成功。大家清楚302凡是临时重定向设301凡世代重定向,那么怎么落实世代重定向为。一般服务器和服务器之间是现又定向,服务器间是永久重定向。上面我们来演示一下千古重定向。

5.布局永久重定向

1
2
3
4
5
6
7
8
9
10
11
12
[root@nginx nginx]# vim /etc/nginx/nginx.conf
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
            rewrite ^/bbs/(.*)$ /forum/$1;
        }
}
准备forum目录与测试文件
1
2
3
4
5
6
7
[root@nginx ~]# cd /usr/html/
[root@nginx html]# ls
50x.html  index.html
[root@nginx html]# mkdir forum
[root@nginx html]# cd forum/
[root@nginx forum]# vim index.html
<h1>192.168.18.208 forum page</h1>

6.还加载一下配置文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

7.测试一下

电子商务 25

注,大家打图被好观看,大家走访bbs/是一向扶持大家跨越反至forum/下,这种本机的跳转就是永恒重定向为给隐式重定向。好了,rewrite重定向我们虽说交此处了,想假如询问更多关于重定向的命令请参见官方文档。最后,我们吧一下朗诵写分离。

八、Nginx之念写分离

1.试拓扑

电子商务 26

     
 需求分析,前端一华nginx做负载均衡反朝代理,前边两大httpd服务器。整个架构是供BBS(论坛)服务,有一致得求得实现读写分离,就是上传附件的法力,我们上传的附件只好上传到Web1,然后以Web1达标采纳rsync+inotify实现附件同步,我们还知情rsync+inotify只可以是主向从协同,不可知双向共。所以Web1只是举办勾勒操作,而Web2光会拓展读操作,这就是带来读写分离的要求,下边我们就算来说一下,读写分离怎么落实。

2.WebDAV功能表达

       WebDAV (Web-based Distributed Authoring and Versioning)
一栽基于 HTTP 1.1探究的通信协议。它扩张了HTTP
1.1,在GET、POST、HEAD等几单HTTP标准方法外添加了一些初的方法,使应用程序可径直对Web
Server直接读写,并扶助写文件锁定(Locking)及解锁(Unlock),还好帮忙文件的版本控制。这样大家即使能配置读写分离功效了,下面我们来具体部署一下。

3.改动配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@nginx nginx]# vim /etc/nginx/nginx.conf
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
                proxy_pass http://192.168.18.202;
                if ($request_method = "PUT"){
                        proxy_pass http://192.168.18.201;
                }
        }
}

4.再次加载一下布局文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

5.配置httpd的WebDAV功能

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

电子商务 27

流动,在<Directory “/var/www/html”>下启用就实施。

6.再启航一下httpd

1
2
3
[root@web1 ~]# service httpd restart
停止 httpd:                                               [确定]
正在启动 httpd:                                           [确定]

7.测试一下

1
2
3
4
[root@nginx ~]# curl http://192.168.18.201
<h1>web1.test.com</h1>
[root@nginx ~]# curl http://192.168.18.202
<h1>web2.test.com</h1>

流淌,web1同web2访问都未曾问题。

1
2
3
4
5
6
7
8
9
10
[root@nginx ~]# curl -T /etc/issue  http://192.168.18.202
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>405 Method Not Allowed</title>
</head><body>
<h1>Method Not Allowed</h1>
The requested method PUT is not allowed for the URL /issue.
<hr>
<address>Apache/2.2.15 (CentOS) Server at 192.168.18.202 Port 80</address>
</body></html>

流动,我们上传文件及,web2齐时,因为web2只人朗读功用,所以并未开户WebDAV功用,所以显示是405
Method Not Allowed。  

1
2
3
4
5
6
7
8
9
10
11
[root@nginx ~]# curl -T /etc/issue  http://192.168.18.201
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
You don't have permission to access /issue
on this server.
<hr>
<address>Apache/2.2.15 (CentOS) Server at 192.168.18.201 Port 80</address>
</body></html>

横流,大家以Web1敞开了WebDAV效用,但我们目录是root目录是休容许apache用户上传的,所以体现的凡403
Forbidden。下面我们让apache授权,允许上传。

1
[root@web1 ~]# setfacl -m u:apache:rwx /var/www/html/

下面我们再一次来测试一下,

1
2
3
4
5
6
7
8
9
10
[root@nginx ~]# curl -T /etc/issue  http://192.168.18.201
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>201 Created</title>
</head><body>
<h1>Created</h1>
Resource /issue has been created.
<hr />
<address>Apache/2.2.15 (CentOS) Server at 192.168.18.201 Port 80</address>
</body></html>

横流,我们雅观我们成功的上传了文件,表明nginx读写分离功用配置好。最终,大家来查看转上传的公文。

1
2
3
4
5
6
[root@web1 ~]# cd /var/www/html/
[root@web1 html]# ll
总用量 12
drwxr-xr-x 2 root   root   4096 9月   4 13:16 forum
-rw-r--r-- 1 root   root     23 9月   3 23:37 index.html
-rw-r--r-- 1 apache apache   47 9月   4 14:06 issue

 

Leave a Comment.