【运维工程师学习八】代理
代理的模式有三种:正向代理、反向代理、透明代理。在介绍反向代理部署之前先看一下各种模式代理的应用场景。
正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲(缓存)特性减少网络使用率。
从图中我们可以看出,所谓的正向代理就是代理服务器替代访问方【用户】去访问目标服务器【内容服务器】
一、使用正向代理的主要作用有:
1、访问本无法访问的服务器,你懂的
2、加速访问服务器,客户端到代理服务器快,但到内容服务器慢,而代理服务器到内容服务器快,则实现了加速
3、Cache作用,缓存的意思,代理服务器可以开启缓存,这样客户端下次再次访问可以加速
4、客户端访问授权,可以实施对客户端允许或禁止访问指定服务器的控制
5、隐藏访问者的行踪,内容服务器并不知道访问自己的实际用户,因为代理服务器代替用户去直接与内容服务器进行交互
二、反向代理
反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
CDN就是利用反向代理模式,但CDN是一个十分庞大的系统,除了反向代理还需要搭配智能DNS等,本例无意讨论CDN架构,请自行了解。
正反向代理的程序很多,开源软件中最流行的就是squid。反向代理中最主要的实践就是WEB服务,近些年来最火的就是Nginx了。
除了squid,nginx还有很多能实现反向代理的程序。
三、使用反向代理的主要作用有:
1、保护和隐藏原始内容服务器,像上页图中,防火墙只允许代理服务器访问真正的内容服务器
2、负载均衡,当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问内容服务器的时候,让不同的代理服务器去应答不同的用户,然后发送不同用户需要的内容
四、透明代理
透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的request fields(请求报文),并会传送真实IP,多用于路由器的NAT转发中。透明代理实践的例子就是时下很多公司使用的行为管理软件。
用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。
五、各种代理的主要区别
通过前面的介绍、对比,我们得知正向代理、透明代理多数用于企业内部网络,而只有反向代理多用于WEB服务,因此本节将介绍利用nginx程序部署反向代理。
六、Nginx的安装
本例演示中不使用编译安装,将使用epel仓库的编译包进行安装。
演示系统约定:
OS:CentOS7 minimal
Selinux: disable
Firewall: disable
IP:192.168.1.5
1、安装epel源及ntp以保证时间准确
yum install –y epel-release ntp
yum makecache
ntpdate pool.ntp.org
在 centos 8 中, ntp 已经被 chrony 代替。
之前的版本:
yum install -y ntp
centos8:
yum install chrony
修改时区:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2、安装nginx
yum install –y nginx
3、启动nginx
systemctl start nginx
在浏览器访问192.168.1.5如右图,表示安装成功。
七、了解nginx的文件位置
Nginx配置文件全部位于/etc/nginx下
/etc/nginx/ # 配置文件目录
nginx.conf # 主配置文件
conf.d # 扩展配置目录,默认为空
default.d # 默认网站的扩展配置目录,默认为空
fastcgi.conf # FastCGI配置文件
mime.types # mime类型定义文件
/var/log/nginx/error.log # 错误日志文件
/var/log/nginx/access.log # web访问日志文件
/usr/share/nginx/html/ # 默认网站的文件目录
八、了解nginx程序的命令行参数
nginx –h
显示相关帮助说明
上面已经详细说明了各个参数的具体用途。常用的有-V,显示nginx开启的功能;-t当nginx配置后,加该参数检查配置文件是否有语法错误;-s重新配置nginx后,使用-s reload可使配置平滑生效。
输入nginx直接回车可启动nginx,另外还可以使用systemctl来控制。
九、开启nginx反向代理
本测试中指定真正的源服务器为www.wy.cn,即实现当访问192.168.1.5,实际是访问www.wy.cn。配置如下:
在/etc/nginx/default.d/
中新建一个配置文件,文件名为test.conf
vi / etc/nginx/default.d/test.conf
添加如下内容:
location ~ /* #/* 表示根目录,亦即是整站跳转到www.wy.cn
{
proxy_pass http://www.163.com; #声明目标站地址
} #{}是nginx配置文件分隔符,;是配置内容行结束符
可尝试修改配置文件,将www.163.com替换为www.wy.cn、www.sina.com.cn等感受下。
保存后,reload使用配置生效
nginx –s reload
重新访问http://192.168.1.5,则显示的内容实际为www.wy.cn的内容
十、解读nginx主配置文件
为什么在/etc/nginx/default.d添加test.conf就可以了实现了反向代理效果了?
首先整站反向代理就只要test.conf中的那么几行就可以了,至于为什么在/etc/nginx/default.d目录中添加了就可以了呢?我们来看看nginx主配置文件(/etc/nginx/nginx.conf)
由于配置较多,显示过长,我对配置内容做了一些省略,详见下页……
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
#这部分是全部配置部分,并且加了include,表示还引用了外部配置文件
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#……省略了部分内容
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
#这部分是http配置部分,包括最后的那个大括号},并且加了include,引用外部其它配置文件/etc/nginx/conf.d
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
#……
}
}
#这部分是server配置部分,即网站信息(开放的端口、主机名、网站根目录等等,以及代理),同时加了include引用default.d目录下的其它配置文件。看到这里应该明白了,为什么在default.d目录下加了test.conf就开启了反向代理吧。
不难看出,通过include能很科学的组织配置文件,比如在http部分再加一个include /etc/nginx/server.d
,将所有server的配置文件放在server.d
下,实现将所有server的配置文件放在同一个目录下,方便管理。
十一、总结
- 本文介绍了三种代理模式:正向代理、反向代理以及透明代理;
- 本文介绍了利用nginx实现反向代理;
- Nginx还有很多功能,以内页压缩、负载均衡等等这里均没有涉及,请自行了解;
- Nginx自带连接数统计功能,本例使用的安装包已开启该功能(如果是编译安装,记得开启),通过配置
- http_stub_status_module,可在web中十分方便地查看当前web的连接数。