(晓桂科技)Nginx 反向代理、负载均衡、squid页面缓存
liebian365 2024-10-26 13:05 21 浏览 0 评论
概念
(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
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)