百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

(晓桂科技)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字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: