Nginx 反向代理负载均衡页面缓存URL重写及读写分离具体解释

Posted yxwkaifa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 反向代理负载均衡页面缓存URL重写及读写分离具体解释相关的知识,希望对你有一定的参考价值。

大纲

一、前言

二、环境准备

三、安装与配置nginx

四、Nginx之反向代理

五、Nginx之负载均衡

六、Nginx之页面缓存

七、Nginx之URL重写

八、Nginx之读写分离

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


一、前言

       在前面的几篇博文中我们主要解说了Nginx作为Webserver知识点,基本的知识点有nginx的理论具体解释、nginx作为webserver的操作解说、nginx作为LNMP架构的解说。不清楚的博友能够回头看看。在这一篇博客中我们主要解说。 nginx的反向代理、负载均衡、缓存、URL重写以及读写分离具体解释。好了,以下我们来具体说一说。

二、环境准备

1. 操作系统

  • CentOS 6.4 x86_64

2.软件版本号

  • Nginx 1.4.2

3.实验拓扑

注,实验拓扑见下文。

4.安装yum源

1
2
3
[[email protected] ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[[email protected] ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[[email protected] ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

5.各节点时间同步

1
2
3
[[email protected] ~]# ntpdate 202.120.2.101
[[email protected] ~]# ntpdate 202.120.2.101
[[email protected] ~]# ntpdate 202.120.2.101

6.关闭防火墙与SELinux

1
2
3
4
5
6
7
8
9
10
11
12
[[email protected] ~]# service iptables stop
[[email protected] ~]# chkconfig iptables off 
[[email protected] ~]# getenforce 
Disabled
[[email protected] ~]# service iptables stop
[[email protected] ~]# chkconfig iptables off 
[[email protected] ~]# getenforce 
Disabled
[[email protected] ~]# service iptables stop
[[email protected] ~]# chkconfig iptables off 
[[email protected] ~]# getenforce 
Disabled

三、安装Nginx

1.解压

1
[[email protected] src]# tar xf nginx-1.4.2.tar.gz

2.新建nginx用户与组

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

3.准备编译配置文件

1
2
[[email protected] src]# yum install -y pcre-devel openssl-devel
[[email protected] 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
[[email protected] 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
[[email protected] ~]# 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
[[email protected] ~]# chmod +x /etc/init.d/nginx

7.加入至服务管理列表,并让其开机自己主动启动

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

8.启动nginx

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

9.查看一下port

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

10.測试一下

技术分享

好了,Nginx安装与配置就到这里。以下我们来说一说Nginx的反向代理。

四、Nginx之反向代理

在配置nginx反向代理之间我们得先准备两台測试server,Web1与Web2。

1.安装httpd

1
2
[[email protected] ~]# yum install -y httpd
[[email protected] ~]# yum install -y httpd

2.提供測试页面

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

3.启动httpd服务

1
2
3
4
[[email protected] ~]# service httpd start
正在启动 httpd:                                           [确定]
[[email protected] ~]# service httpd start
正在启动 httpd:                                           [确定]

4.測试一下

技术分享

技术分享

5.简单说一下。正向代理与反向代理

(1).正向代理的概念

       正向代理。也就是传说中的代理,他的工作原理就像一个跳板,简单的说。我是一个用户,我訪问不了某站点,可是我能訪问一个代理server。这个代理server呢,他能訪问那个我不能訪问的站点,于是我先连上代理server,告诉他我须要那个无法訪问站点的内容,代理server去取回来。然后返回给我。

从站点的角度,仅仅在代理server来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料。这取决于代理告不告诉站点。

       结论就是。正向代理 是一个位于client和原始server(origin server)之间的server。为了从原始server取得内容,client向代理发送一个请求并指定目标(原始server),然后代理向原始server转交请求并将获得的内容返回给client。client必需要进行一些特别的设置才干使用正向代理。

(2).反向代理的概念

继续举例:    
       例用户訪问
http://www.test.com/readme,但www.test.com上并不存在readme页面。他是偷偷从另外一台server上取回来,然后作为自己的内容返回用户,但用户并不知情。这里所提到的 www.test.com 这个域名相应的server就设置了反向代理功能。

       结论就是,反向代理正好相反,对于client而言它就像是原始server。而且client不须要进行不论什么特别的设置。

client向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将推断向何处(原始server)转交请求。并将获得的内容返回给client。就像这些内容原本就是它自己的一样。

(3).两者差别

用途上来讲:

       正向代理的典型用途是为在防火墙内的局域网client提供訪问Internet的途径。正向代理还能够使用缓冲特性降低网络使用率。反向代理的典型用途是将防火墙后面的server提供给Internet用户訪问。

反向代理还能够为后端的多台server提供负载平衡。或为后端较慢的server提供缓冲服务。另外,反向代理还能够启用高级URL策略和管理技术。从而使处于不同webserver系统的web页面同一时候存在于同一个URL空间下。

安全性来讲:

       正向代理同意client通过它訪问随意站点而且隐藏client自身,因此你必须採取安全措施以确保仅为经过授权的client提供服务。反向代理对外都是透明的,訪问者并不知道自己訪问的是一个代理。

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,想了解很多其它代理指令请參考官方中文文档。

这个模块能够转发请求到其它的server。

HTTP/1.0无法使用keepalive(后端server将为每一个请求创建而且删除连接)。nginx为浏览器发送HTTP/1.1并为后端server发送HTTP/1.0,这样浏览器就能够为浏览器处理keepalive。

   
例如以下例:

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

注意,当使用http proxy模块(甚至FastCGI),全部的连接请求在发送到后端server之前nginx将缓存它们,因此,在測量从后端传送的数据时,它的进度显示可能不对。

实验拓扑:

技术分享

7.配置http反向代理

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

指令说明:proxy_pass

语法:proxy_pass URL
默认值:no      
使用字段:location, location中的if字段      
这个指令设置被代理server的地址和被映射的URI,地址能够使用主机名或IP加port号的形式,比如:
proxy_pass http://localhost:8000/uri/;

8.又一次载入一下配置文件

1
2
3
4
[[email protected] ~]# 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.測试一下

技术分享

注,大家能够看到,当我们訪问192.168.18.208时。被








以上是关于Nginx 反向代理负载均衡页面缓存URL重写及读写分离具体解释的主要内容,如果未能解决你的问题,请参考以下文章

nginx_3_反向代理负载均衡缓存URL重写

nginx配置详解-url重写反向代理负载均衡

nginx rewrite url重写, if,负载均衡 ,nginx反向代理配置

nginx反向代理

nginx实现反向代理负载均衡

Nginx缓存