什么是代理


正向代理:网络代理(将代理程序安装在客户端上,代理客户端上网)

原理:正向代理是指位于客户端(​​client​​) 和服务端(​​Server​​ )中间的一个服务器,为了获得目标服务器上的内容,客户端向​​代理服务器​​发送一个请求并指定目标(目标服务器),然后代理向目标服务器转交请求并将获得的内容返回给客户端。客户端一般必须要进行一些特别的设置才能使用正向代理。

作用

1):实现代理上网,访问无法访问的资源,隐藏用户信息;

2):用作缓存服务器,提高用户的访问速度;

3):对客户端的访问进行授权、限制以及审计等作用。

举例:现在我们不能使用一些海外的服务,这个时候我们使用的一些工具扮演的其实就是正向代理的角色。我们虽然不能直接访问海外的服务器,但是位于海外的代理服务器可以访问,于是我们向代理服务其提出要求,代理服务器便会访问这些资源,并且把获得的结果返回给我们,这就是正向代理的一个实际应用场景。

Nginx反向代理_nginx

反向代理:用于公司集群架构,代理服务端(将代理程序安装在服务端上,代理用户访问服务端)

原理:反向代理服务器位于用户和目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无需在用户端做任何设定。

作用:反向代理可以做的事情有很多,主要是用来做负载均衡,这时候的反向代理服务器也就叫做负载均衡器。

举例:举一个例子,非常典型的就是 DNS 服务器,我们知道DNS服务器的查询中的递归查询,查询的顺序一般是:本地域名服务器->根域名服务器->顶级域名服务器,这其实就是负载均衡的实际应用,我们查询的只是本地 DNS 服务器,但是其实本地服务器的后端做了大量的工作,只不过对于用户来说是透明的。

Nginx反向代理_服务器_02

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

1.区别在于形式上服务的”对象”不一样

2.正向代理代理的对象是客户端,为客户端服务

3.反向代理代理的对象是服务端,为服务端服务

总结

正向代理是对客户端的代理,由客户端设立,客户端了解代理服务器和目标服务器,但目标服务器不了解真正的客户端是谁;使用正向代理可达到 突破访问限制、提高访问速度、对服务器隐藏客户端IP等目的;

反向代理是对服务器的代理,由服务器设立,客户端不了解真正的服务器是谁,使用反向代理可达到负载均衡、保障服务端安全、对客户端隐藏服务器IP等目的。

为什么学代理


Nginx反向代理_服务器_03

nginx代理PHP服务(fastcgi_pass:127.0.0.1:9000)

1.代理后端语言的服务(PHP、JAVA、Python...)

2.国外服务器代理国内服务器,方便国外用户上网

Nginx代理服务支持协议


nginx 反向代理php:fastcgi

nginx反向代理Python:uwsgi

nginx反向代理Golang:GRPC

nginx反向代理nginx:http:// http_proxy

nginx反向代理Java:http:// http_proxy

Nginx作为代理服务,可支持的代理协议非常的多,具体如下图

Nginx反向代理_服务器_04

反向代理使用的模块


如果将Nginx作为反向代理服务,常常会用到如下几种代理协议,如下图所示

Nginx反向代理_php_05

反向代理模块总结


反向代理模式与Nginx代理模块总结如表格所示

反向代理模式

Nginx*配置模块

http、websocket、https

ngx_http_proxy_module

fastcgi

ngx_http_fastcgi_module

uwsg

ngx_http_uwsgi_module

grpc

ngx_http_v2_module

Nginx反向代理配置


环境准备

主机名

WanIP

lanIP

角色

应用

web01

10.0.0.7

172.16.1.7

web网站

nginx、php、wordpress

lb01

10.0.0.5

172.16.1.5

反向代理服务器

nginx

db01

10.0.0.51

172.16.1.51

数据库

mariadb

安装LNMP环境


# 1.查找yum下载下来的所有rpm结尾的包
[root@web01 ~]# find /var/cache/yum/ -type f -name '*.rpm'

# 2.开启yum缓存
[root@web01 ~]# vim /etc/yum.conf
[main]
keepcache=1

# 3.添加nginx源
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

# 4.添加PHP源
[root@web01 ~]# vim /etc/yum.repos.d/php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0

# 5.安装nginx和php
[root@web01 ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb nginx

# 6.将所有rpm包拷贝到opt目录下
[root@web01 ~]# find /var/cache/yum/ -type f -name '*.rpm'|xargs cp -t /opt/

# 7.进入opt目录打包
[root@web01 ~]# cd /opt/
[root@web01 opt]# tar zcf nginx_php.tgz *.rpm


#### 安装
[root@web02 nginx_php]# rpm -Uvh *.rpm
[root@web02 nginx_php]# yum localinstall -y *.rpm

# 8.安装数据库
[root@db01 ~]# yum install -y mariadb-server

Nginx做代理服务器(lb01)

# 1.添加nginx源
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

# 2.安装nginx
[root@lb01 ~]# yum install -y nginx

# 3.添加nginx代理配置文件
[root@lb01 ~]# vim /etc/nginx/conf.d/blog.jin.com_proxy.conf

server{
listen 80;
server_name blog.jin.com;

location /{
proxy_pass http://10.0.0.7:80;
}
}

# 4开启nginx并加入开机自启
[root@lb01 ~]# systemctl start nginx
[root@lb01 ~]# systemctl enable nginx

# 5.域名解析
10.0.0.5 blog.jin.com

Nginx反向代理_php_06

以上配置存在的问题
lb01 通过 10.0.0.7 80端口访问后端的web01
因为是通过IP访问,所以,配置文件谁在上边,则访问哪个页面

## 解决方案:将域名加入到,lb01请求web01的请求头中
[root@lb01 ~]# vim /etc/nginx/conf.d/blog.jin.com_proxy.conf

server{
listen 80;
server_name blog.jin.com;

location /{
proxy_pass http://10.0.0.7:80;
proxy_set_header Host $host;
}
}



## 访问日志
[root@lb01 ~]# tail -f /var/log/nginx/access.log
10.0.0.1 - - [14/Jun/2022:16:19:25 +0800] "GET / HTTP/1.1" 200 62070 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/32" "-"

[root@web01 blog]# tail -f /var/log/nginx/access.log
10.0.0.5 - - [14/Jun/2022:16:19:25 +0800] "GET / HTTP/1.0" 200 62017 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/32" "-"

## 上面的配置依然存在问题
web01上的nginx日志,只显示lb01的服务器IP地址,无法显示用户的真实IP地址

解决方案:在lb01的请求头中,加上用户真实IP去访问web01

[root@lb01 ~]# vim /etc/nginx/conf.d/blog.jin.com_proxy.conf

server{
listen 80;
server_name blog.jin.com;

location /{
proxy_pass http://10.0.0.7:80;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

# 访问日志
[root@web01 blog]# tail -f /var/log/nginx/access.log
10.0.0.5 - - [14/Jun/2022:16:24:56 +0800] "GET / HTTP/1.0" 200 62017 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/32" "10.0.0.1"

## 优化代理配置文件
[root@lb01 ~]# vim /etc/nginx/conf.d/blog.jin.com_proxy.conf

server{
listen 80;
server_name blog.jin.com;

location /{
proxy_pass http://10.0.0.7:80;
## 在代理服务器的请求头中,加上域名,携带域名去访问后端的web01服务器
proxy_set_header Host $host;

## 在代理服务器的请求头中,透传用户的真实IP地址给web01
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

## lb01连接web01的超时时间(代理服务器,连接后端服务的超时时间)
proxy_connect_timeout 60s;

## lb01代理服务器读取web01返回的数据超时时间(代理后端的服务器响应代理服务器的超时时间)
proxy_read_timeout 60s;

## 后端服务器回传给代理服务器数据的超时时间
proxy_send_timeout 60s;

## 开启代理服务器的缓冲区,代理服务器接收到web01返回的数据,接收一条,返回给用户一条
proxy_buffering on;

## 开启存放头部信息的缓冲区大小为 32k
proxy_buffer_size 32k;

## 开启存放头部信息的缓冲区大小为 32k
proxy_buffers 4 128k;
}
}


## 最终优化(避免配置文件重复使用)
# 1.创建proxy_params
[root@lb01 ~]# vim /etc/nginx/proxy_params
## 在代理服务器的请求头中,加上域名,携带域名去访问后端的web01服务器
proxy_set_header Host $host;

## 在代理服务器的请求头中,透传用户的真实IP地址给web01
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

## lb01连接web01的超时时间(代理服务器,连接后端服务的超时时间)
proxy_connect_timeout 60s;

## lb01代理服务器读取web01返回的数据超时时间(代理后端的服务器响应代理服务器的超时时间)
proxy_read_timeout 60s;

## 后端服务器回传给代理服务器数据的超时时间
proxy_send_timeout 60s;

## 开启代理服务器的缓冲区,代理服务器接收到web01返回的数据,接收一条,返回给用户一条
proxy_buffering on;

## 开启存放头部信息的缓冲区大小为 32k
proxy_buffer_size 32k;

## 开启存放头部信息的缓冲区大小为 32k
proxy_buffers 4 128k;


# 2.修改nginx代理配置文件
[root@lb01 nginx]# vim /etc/nginx/conf.d/blog.jin.com_proxy.conf

server{
listen 80;
server_name blog.jin.com;

location /{
proxy_pass http://172.16.1.7:80;
include /etc/nginx/proxy_params;
}
}

为什么服务器之间使用内网通信


1:内网安全

2:内网传输数据快

3.在企业中,除了对外提供服务的服务器需要开启公网IP以外,其他机器只有内网IP