产品主管练级攻略

出品COO练级攻略

大纲

图片 1

style=”font-family: 微软雅黑, ‘microsoft yahei’;”>一、前言

style=”font-family: 微软雅黑, ‘microsoft yahei’;”>二、环境准备

style=”font-family: 微软雅黑, ‘microsoft yahei’;”>三、安装与计划Nginx

style=”font-family: 微软雅黑, ‘microsoft yahei’;”>四、Nginx之反向代理

style=”font-family: 微软雅黑, ‘microsoft yahei’;”>五、Nginx之负载均衡

style=”font-family: 微软雅黑, ‘microsoft yahei’;”>六、Nginx之页面缓存

style=”font-family: 微软雅黑, ‘microsoft yahei’;”>七、Nginx之URL重写

style=”font-family: 微软雅黑, ‘microsoft yahei’;”>八、Nginx之读写分离

123123

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

世家都叫“产品经营”,但做的事体却全然两样?
“产品主管”这些词到底是怎么意思?
以此话题恐怕也是各位同行都一直在想,也一向想不了然的吗,我也是。
老是看到各样“产品经营的能力模型”,我都觉得有些扯淡,总以为模型里少了点什么,没错,就是“适用范围”,那一张张美丽的图,必定只适合某些人,那么,到底是哪些人?于是,我的思绪就是忘记所有模型,先去看各样顶着“产品经营”职位的人,他们做的事务怎么差距?
初想下去,和多个元素有关——内在vs外在,符合MECE原则哦。
内在是指个体力量,不可能不能认,一个叫“产品经营”的高等学校结束学业生与一个一律叫“产品主任”的,有着3年工作经历的人,做的事务、必要的能力肯定分化。所以您思考,他们观察标是同一个“能力模型”,都遵从那上边的孤本去修炼,可靠么?
对于外在,又分为事和人,事指行业,人指团队。行业——决定了成品特性,电子商务的成品经营、移动互连网的制品老总,伸张至软件、电信,甚至传统行业的产品高管,各自的力量模型也终将迥异。团队——拿网络产品的话,团队里技术同学是或不是强大?团队里是还是不是有专职的项目CEO、用户商讨人士?运营同学是还是不是强势?等等也都会使得出品经营最要害的天职有两样。
可以说,我心里中的能力模型,是一个三维的立体,方今有的能力模型,都是模型作者在他领略的“内在力量&外在事和人”的前提下,给出的一个低维“模型切片”,甚至是一个点而已,往往大家能观望行业的有些限量,比如“网络产品经营的能力模型”,但却很少见到针对团队、个人力量阶段的叙述。那么,哪个人能交付整个模型?苦笑两声,我想到了唯一的答案——大家。每个人付出自己的切片,也许我得以试着去做个拼图游戏。
日前本人初阶试着做一些统计,也不得不是从点到面,先从阿里系说起,投砾引珠,再听听大家的。首先,我把阿里系的制品COO的终极目标定位“业务Leader”,或者说事业部的头。而源点各个各类,反正是完全无经验的人。行业有了,对于协会,阿里里面各样公司即使有距离,但和表面比起来总还算相似,可以看看我在博客里关于团协会的描述。上边紧要从个体力量的维度切,我参考集团内的Job
Model,先划分为2层,其中每一层又细分为3级。
先看最早的3级。
产品经营-0,本科结束学业的应届生,或接近能力的别样人士。能不辱义务明确的作用点,编写PRD,跟踪实施为止上线,那时候,产品CEO仍旧一个头名的“须要分析师”,也常叫“产品助理”。此时的技艺须求还偏重于“产品设计”,对于网络产品,做的广大业务,会与UED团队陆续,更加是并行设计、视觉设计规模。
产品经营-1,约2年工作经验的本科生,或者博士毕业的应届生,可以独自承担一个微型产品,或者大型产品中的一个完整功效模块。与上一级其余紧要性不同,在于不只是失落的接要求,那里的主动性,须要产品经营初阶有所用户研究的力量,须要管理的能力。并且,对产品涉及的技能,须要有必然的打听,至少,能和技巧团队一起谈论方案吧。
产品高管-2,工作3~5年的本科生,或者工作约2年的硕士大学生(尤其声明,学历不是重视,那里的发挥只是为着便于通晓,也可以是有相似能力的人士)。关键技术是可以单独负责一个完全的出品,有档次管理能力,衍生出来的,就是无授权领导的团伙管理力量,更加是跨机构的公司,所以对联系方面的软技能须要,开首显现。
前3级可以归为一类,其特点是——可以培育出来。所需要的都是一对很引人侧目、很通用的技能。而上面3级,个人成长的关键开始从显性知识转变为隐性知识,要靠不断的实战,与各样前辈调换,加上自己精通来压实,看书、看材料神马的意义渐少。
出品老板-3,从这一层级早先,已经黔驴技穷用工作年限来衡量。关键技术是索要有企划能力。可以独立负责一条产品线,比如Taobao网的交易线(旗下包括较完整的产品如购物车、各个垂直市场的一定交易流程……)。此时统筹能力的骨子里,必要产品经营须要对成品除外功用外的文化也有支配,比如市面运营层面。
产品经营-4。关键不同是要有一个专业享誉的中标案例来表明自己,能够独立承担一条复杂的完整产品线,比如整个天猫商城商城。很分明,这么些成功案例,只好靠一遍至少4个月以上的全体战役取得,并不是各样人都有那样的时机和运气。此时,产品经营开首显示出“业务Leader”的威仪。
出品首席营业官-5。关键不相同在于有跨职能部门的军事管制经验,也就代表到了这一层级,出去就足以做小集团的总裁,或者大公司的事业部管事人,或者直接创业。那几个层级的出品高管,影响力已经不局限于产品团队,对营业策略、集团高层的大方向都有着很强的话语权。
私家才刚好在所在特定行业、特定协会里修炼到中游地点,还要大力,人生苦短,我也没可能去尝尝所有的正业和公司,所以,期待你的享受。
Via:苏杰

 

一、前言

     
 在头里的几篇博文中大家最首要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的辩护详解、nginx作为web服务器的操作讲解、nginx作为LNMP架构的上课,不明白的博友可以回头看看,在这一篇博客中我们根本教学,
nginx的反向代理、负载均衡、缓存、URL重写以及读写分离详解。好了,下边咱们来具体说一说。

二、环境准备

1.
操作系统

  • CentOS 6.4
    x86_64

2.软件版本

  • 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.测试一下

图片 2

好了,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.测试一下

图片 3

图片 4

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模块(甚至法斯特CGI),所有的连天请求在发送到后端服务器之前nginx将缓存它们,因而,在测量从后端传送的多寡时,它的进程突显可能不正确。

尝试拓扑:

图片 5

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.测试一下

图片 6

注,我们可以观望,当我们访问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

图片 7

注,大家可以那里记录日志的参数仍旧%h,上边大家修改一下参数。

图片 8

注,那是修改后的参数,将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.试验拓扑

图片 9

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.测试一下

图片 10

图片 11

注,大家可以穿梭的基础代谢浏览的内容,可以窥见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:                                               [确定]

图片 12

注,大家可以看看,现在只得访问Web2,再重复起动Web1,再度做客一下。

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

图片 13

图片 14

注,我们可以看来,现在又足以重复访问,表明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:                                               [确定]

图片 15

注,大家可以观看,当有着服务器都不可能工作时,就会启动备份服务器。好了,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.测试一下

图片 16

注,我们可以观察,你不休的基础代谢页面一向会显得的民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.底下大家来测试一下(谷歌浏览器)

图片 17

注,我们用谷歌浏览器测试的时候,可以按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.测试一下

图片 18

注,从图中我们得以看看,大家走访的服务器是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)。

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

  • 使用-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>

测试一下

图片 19

好了,上面我们来测试一下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.测试一下

图片 20

注,我们可以从图中看出,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.测试一下

图片 21

注,大家从图中可以看看,大家走访bbs/是平素帮大家跳转到forum/下,那种本机的跳转就是永恒重定向也叫隐式重定向。好了,rewrite重定向大家就说到这边了,想要查询越来越多关于重定向的指令请参考官方文档。最终,大家来说一下读写分离。

八、Nginx之读写分离

1.实验拓扑

图片 22

     
 必要分析,前端一台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

图片 23

注,在<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

好了,到此处nginx的反向代理、负载均衡、页面缓存、URL重写及读写分离就所有助教已毕。希望大家有所收获,^_^……

Leave a Comment.