(1).正向代理的观点
正向代理,也便是传说中的代理,他的事情事理就像一个跳板,大略的说,我是一个用户,我访问不了某网站,但是我能访问一个代理做事器,这个代理做事器 呢,他能访问那个我不能访问的网站,于是我先连上代理做事器,见告他我须要那个无法访问网站的内容,代理做事器去取回来,然后返回给我。从网站的角度,只 在代理做事器来取内容的时候有一次记录,有时候并不知道是用户的要求,也隐蔽了用户的资料,这取决于代理告不见告网站。
结论便是,正向代理 是一个位于客户端和原始做事器(origin server)之间的做事器,为了从原始做事器取得内容,客户端向代理发送一个要求并指定目标(原始做事器),然后代理向原始做事器转交要求并将得到的内 容返回给客户端。客户端必须要进行一些特殊的设置才能利用正向代理。
(2).反向代理的观点
连续举例:
例用户访问 http://www.cluster.com/readme,但www. cluster.com上并不存在readme页面,他是偷偷从其余一台做事器上取回来,然后作为自己的内容返回用户,但用户并不知情。这里所提到的 www. cluster.com 这个域名对应的做事器就设置了反向代理功能。
结论便是,反向代理恰好相反,对付客户端而言它就像是原始做事器,并且客户端不须要进行任何特殊的设置。客户端向反向代理的命名空间(name- space)中的内容发送普通要求,接着反向代理将判断向何处(原始做事器)转交要求,并将得到的内容返回给客户端,就像这些内容原来便是它自己的一样。
(3).两者差异
从用场上来讲:
正向代理的范例用场是为在防火墙内的局域网客户端供应访问Internet的路子。正向代理还可以利用缓冲特性减少网络利用率。反向代理的范例用场是将 防火墙后面的做事器供应给Internet用户访问。反向代理还可以为后真个多台做事器供应负载平衡,或为后端较慢的做事器供应缓冲做事。其余,反向代理 还可以启用高等URL策略和管理技能,从而使处于不同web做事器系统的web页面同时存在于同一个URL空间下。
从安全性来讲:
正向代理许可客户端通过它访问任意网站并且隐蔽客户端自身,因此你必须采纳安全方法以确保仅为经由授权的客户端供应做事。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
反向代理实例:
第一步,安装nginx,
# useradd nginx--我这里建立一个用户来跑nginx,不做也可以,它默认是用daemon用户来跑
# id nginx--nginx的uid,gid不主要
uid=517(nginx) gid=518(nginx) groups=518(nginx)
# tar xf /opt/nginx-1.6.2.tar.gz -C /usr/src/ --解压
# cd /usr/src/nginx-1.6.2/
--编译并安装
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module --with-http_stub_status_module
# make && make install
-----------------------------------------------------------
如果在configure时报下面的错,表示默认利用了rewrite模块,须要用到pcre的库
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
办理方法:
第一种:
yum install pcre--安装系统自带的pcre库文件就可以了
第二种:
自己下载pcre的源码先编,再编译nginx用--with-pcre来指定pcre的安装路径就可以了
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module --with-http_stub_status_module --with-pcre=/usr/local
-----------------------------------------------------------------
--把稳:下面的例子,因此静态页面来做测试。
例一:利用前端nginx代理后面一台web
client
nginx 192.168.169.201
web1
192.168.169.200:8000
[root@li nginx]# cat conf/nginx.conf
user nginx nginx;
worker_processes 5;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 65535;
}
http {
server {
listen 80;
server_name 192.168.169.201;
root /nginxroot/;
location /web1/ {
proxy_pass http://192.168.169.200:8000/;
}
}
}
# mkdir /nginxroot/
# echo \公众nginx main page\公众 > /nginxroot/index.html
--启动
# ulimit -SHn 65535
# /usr/local/nginx/sbin/nginx
--验证
找另一台客户端机器验证
# elinks 192.168.169.201--得到192.168.169.201上nginx的主页
# elinks 192.168.169.201/web1/--得到192.168.169.200上8000端口的web1主页
例二:利用前端nginx代理后端两台web,一个代理后台10的8000端口的web1,一个代理后台12的80端口的web2
nginx192.168.169.201:80
web1web2
192.168.169.200:8000192.168.169.202:80
# cat /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 5;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 65535;
use epoll;
}
http {
server {
listen 80;
server_name 192.168.169.201;
root /nginxroot/;
location /web1/ {
proxy_pass http://192.168.169.200:8000/;
}
location /web2/ {
proxy_pass http://192.168.169.202/;
}
}
}
重启
[root@li nginx]# /usr/local/nginx/sbin/nginx -s stop
[root@li nginx]# /usr/local/nginx/sbin/nginx
验证
# elinks 192.168.169.201
# elinks 192.168.169.201/web1/
# elinks 192.168.169.201/web2/
例四:代理后端时利用负载均衡
# cat /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 5;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 65535;
use epoll;
}
http {
upstream nginxweb {
#ip_hash; 调度算法
server 192.168.169.200:8000 weight=1 max_fails=2 fail_timeout=1s;
server 192.168.169.202:80 weight=1 max_fails=2 fail_timeout=1s;
}
server {
#listen 80;
#server_name 192.168.169.201;
#root /nginxroot/;
location / {
proxy_pass http://nginxweb;
}
}
}
--upstream指令不要加到http {} 表面,也不要加到server{}里面
重启 (省略)
验证 (省略)
--验证时,会创造客户端针对同一个URL的访问也会一次web1一次web2
1、upstream 是Nginx的HTTP Upstream模块,这个模块通过一个大略的调度算法来实现客户端IP到后端做事器的负载均衡。在上面的设定中,通过upstream指令指定了一个负 载均衡器的名称test.net。这个名称可以任意指定,在后面须要用到的地方直接调用即可。
2.upstream 支持的负载均衡算法
Nginx的负载均衡模块目前支持4种调度算法,下面进行分别先容,个中后两项属于第三方调度算法。
轮询(默认)。每个要求按韶光顺序逐一分配到不同的后端做事器,如果后端某台做事器宕机,故障系统被自动剔除,利用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,紧张用于后端每个做事器性能不均的情形下。
ip_hash。每个要求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端做事器,有效办理了动态网页存在的session共享问题。
fair。 这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载韶光是非智能地进行负载均衡,也便是根据后端做事器的相应韶光来分配要求,相应时 间短的优先分配。Nginx本身是不支持fair的,如果须要利用这种调度算法,必须下载Nginx的upstream_fair模块。
url_hash。此方法按访问url的hash结果来分配要求,使每个url定向到同一个后端做事器,可以进一步提高后端缓存做事器的效率。Nginx本身是不支持url_hash的,如果须要利用这种调度算法,必须安装Nginx 的hash软件包。
下午课:
利用squid缓存
=================================================================
client
|
| 192.168.169.201
nginx 反向代理
|
|
-----------
| | 命中 hit 直接返回
动态程序文件.php | |
| squid或varnish(web加速,缓存静态文件或图片)
直接找web | |
---- | 没命中 miss 找后端web去取
| | 192.168.169.202
lamp <---- |
或lnmp
192.168.169.200:8000
li.cluster.com
实验前准备:
1,相互都在/etc/hosts里加主机名和IP的对应
192.168.169.200 li.cluster.com
192.168.169.202 squid.cluster.com
192.168.169.201 nginx.cluster.com
2,韶光同步
rdate -s 192.168.169.200
3,关闭iptables和selinux
iptable -F
iptables -t nat -F
chkconfig iptables off
4, 配置好yum
第一大步:安装并配置后面的网站
在192.168.169.200上配置一个可用的lamp或lnmp,安装一个论坛(phpwind或discusz);
利用先前做的lamp或lnmp都可以
如果没有的话,须要再快速做一个的话,可以利用rpm版lamp
yum install mysql http php -y
我这里利用的是昨天课程安装的lnmp,用的是8000端口
第二大步:安装并配置squid
在192.168.169.202上安装squid,编译的版本或者rpm版都可以
这里为了省韶光,利用rpm版的squid
# yum install squid -y
配置squid主配置文件
# vim /etc/squid/squid.conf
http_access allow all--修正成许可所有
http_port 80 accel vhost vport--修正成监听80端口和支持反向代理模式
cache_dir ufs /var/spool/squid 256 16 256--打开缓存目录的定义这一句
cache_peer 192.168.169.200 parent 8000 0 no-query originserver round-robin name=web
cache_peer_domain web.cluster.com
cache_peer_domain web 192.168.169.201--加上这三句,表示代理后台的35的8000端口;web.cluster.com为网站的域名,192.168.169.201为我这个架构最前真个nginx的IP
创建缓存目录
# squid -zX /var/spool/squid
启动squid
# /etc/init.d/squid restart
第三大步;安装并配置nginx
在192.168.169.201上安装配置
安装过程参考本日课程上午的条记
配置nginx
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 8;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 65535;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] \公众$request\"大众 '
'$status $body_bytes_sent \"大众$http_referer\公众 '
'\公众$http_user_agent\"大众 \"大众$http_x_forwarded_for\"大众';
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
upstream squid {
server 192.168.169.202 weight=1 max_fails=2 fail_timeout=30s;
}
upstream web {
server 192.168.169.200:8000 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name 192.168.169.201;
access_log logs/host.access.log main;
location ~ .\.php$ {
proxy_pass http://web;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location ~ .\.(html|htm|gif|jpeg|jpg|css|js|png|swf)$ {
proxy_pass http://squid;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location / {
proxy_pass http://web;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
[root@nginx ~]# ulimit -SHn 65535
# /usr/local/nginx/sbin/nginx -s stop
# /usr/local/nginx/sbin/nginx
---------------------------------------------
第四大步:验证
再找一台机器做为客户端来验证
我这里为192.168.169.72
在192.168.169.72上首先绑定静态DNS(可以实现客户端用域名来访问,不绑定只要前面squid里配置OK,用IP访问也可以)
cat /etc/hosts
192.168.169.201 web.cluster.com --IP要为前端nginx的IP,名字为这个网站的域名要和squid里的cache_peer_domain web web.cluster.com要对应
1,用firefox访问http://192.168.169.201/是可以正常看到我在10的8000端口安装的phpwindV9版本的
2,利用下面的命令验证phpwind论坛的一个logo,可以看到在squid上命中的信息
# curl -I http://192.168.169.201/themes/site/default/images/logo.png
X-Cache: hit from squid.cluster.com
X-Cache-Lookup: HIT from squid.cluster.com:80
Via: 1.0 squid.cluster.com (squid/3.1.10)
3,关闭squid,在客户端用firefox访问,会创造全体网站都没有图片(静态的元素)
用curl -I http://192.168.169.201/themes/site/default/images/logo.png来验证也会报错
由于我的架构里只有一台squid,再次启动squid后,统统又规复正常
备:清理缓存
# /etc/init.d/squid stop
# rm /var/spool/squid/ -rf--手动这样删除缓存
# /etc/init.d/squid start