Nginx反向代理

什么是代理

正向代理:网络代理(代理客户端访问外网)

image-20230918192455681

反向代理:用于公司集群架构,代理服务端

image-20230918192504987

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

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

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

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

为什么学代理

当外国的用户想访问你的网站时 网络传输会很慢 效率很低 当外国服务器代理国内服务器以后

外国的用户访问你的网站 实际访问的就是在外国的服务器 效率更高 也可以花钱直接打通两台服务器的内网

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

image-20230918192514353

反向代理使用的模块

image-20230918192527478

反向代理模块总结

反向代理模式与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
web02 10.0.0.8 172.16.1.8 反向代理服务器 nginx

web01配置文件

## 修改配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/fxdl.conf 
server{
        listen 80;
        server_name www.gouwo.com;
        root /blog;

        location /{
                index index.php index.html;
        }
}

## 创建站点目录
[root@web01 ~]# mkdir /blog

## 写入页面显示内容
[root@web01 ~]# echo 'this is web01' > /blog/index.html

## 重启nginx
[root@web01 ~]# systemctl restart nginx

## 访问10.0.0.7

image-20230918195007909

web02配置

## 安装nginx
[root@web02 ~]# yum install -y nginx

## 修改nginx配置文件
[root@web02 ~]# vim /etc/nginx/conf.d/proxy.conf 
server{
        listen 80;
        server_name blog.gouwo.com;

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

## 重启
[root@web02 ~]# systemctl start nginx

## 域名解析
10.0.0.8 blog.gouwo.com

## 访问blog.gouwo.com

image-20230918195454643

代理优化

如通过ip访问,谁的配置文件再上面就访问谁
##解决方法:将域名加入到web02请求web01的请求头中
[root@web02 ~]# vim /etc/nginx/conf.d/proxy.conf 
server{
        listen 80;
        server_name blog.gouwo.com;

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

## 上面的配置依然存在问题
web01上的nginx日志,只显示lb01的服务器IP地址,无法显示用户的真实IP地址
## 解决方案:在web02的请求头中,加上用户真实IP去访问web01
[root@web02 ~]# vim /etc/nginx/conf.d/proxy.conf 
server{
        listen 80;
        server_name blog.gouwo.com;

        location /{
                proxy_pass http://172.16.1.7:80;
                proxy_set_header Host $host;  ## 在代理服务器中的请求头中,加上域名,携带域名去访问后端的web01服务器
                proxy_set_header Host $host;
        ## 在代理服务器的请求头中,透传用户的真实IP地址给web01
        }
}

##完整版优化

[root@web02 ~]# vim /etc/nginx/conf.d/proxy.conf 
server{
        listen 80;
        server_name blog.gouwo.com;

        location /{
                proxy_pass http://172.16.1.7:80;
                proxy_set_header Host $host;
                ## 在代理服务器中的请求头中,加上域名,携带域名去访问后端的web01服务器
                proxy_set_header Host $host;
        ## 在代理服务器的请求头中,透传用户的真实IP地址给web01
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ## web02连接web01的超时时间(代理服务器,连接后端服务的超时时间)
        proxy_connect_timeout 60s;
        ## web02代理服务器读取web01返回的数据超时时间(代理后端的服务器响应代理服务器的超时时间)
        proxy_read_timeout 60s;
        ## 后端服务器回传给代理服务器数据的超时时间
        proxy_send_timeout 60s;
        ## 开启代理服务器的缓冲区,代理服务器接收到web01返回的数据,接收一条,返回给用户一条
        proxy_buffering on;
        ## 开启存放头部信息的缓冲区大小为 32k
        proxy_buffer_size 32k;
        ## 开启4个128k的存放数据主体的缓冲区
        proxy_buffers 4 128k;
        }
}

#### 避免配置文件重复使用
[root@web02 ~]# vim /etc/nginx/conf.d/proxy.conf 
server{
        listen 80;
        server_name blog.gouwo.com;

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

[root@web02 ~]# vim /etc/nginx/proxy_params 
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

##重启nginx
[root@web02 ~]# systemctl restart nginx

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

1.内网安全
2.内网传输数据速度快
3.在企业中,除了对外提供服务的服务器需要开启公网IP以外,其它机器只有内网IP