反向代理是一种网络架构,它通过将客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端,实现了客户端和服务器之间的间接通信。与正向代理不同,正向代理是代理客户端,而反向代理是代理服务器。
以下是反向代理的基本原理:
反向代理的优点包括:
正向代理是一种代理服务器架构,它充当客户端与目标服务器之间的中介,代表客户端向目标服务器发起请求。以下是正向代理的基本原理:
正向代理的主要用途包括:
从反向代理的角度来看,正向代理和反向代理有着不同的工作方式和应用场景。
HTTP Server(Web Server)和 Application Server(应用服务器)是构建现代 web 应用程序时常见的两个组件,它们分别负责处理不同的任务,但在实际应用中通常需要协同工作。
静态资源和动态资源是在 web 开发中经常遇到的两种不同类型的内容,它们在处理和生成方式上有很大的区别。
Nginx代理模块ngx_http_proxy_module
环境:两台nginx服务器,安装方式可以一样也可以不一样,自己实验时建议一样
//nginx-1 ip:192.168.17.129
//自定义nginx访问的欢迎页面(yum安装的nginx)
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# cp index.html{,.bak}
[root@localhost html]# echo > index.html
[root@localhost html]# vim index.html
<!DOCTYPE html>
<html>
<head>
<title>欢迎来到我的网站</title>
<style>
/* 在这里添加您的CSS样式 */
</style>
</head>
<body>
<header>
<h1>欢迎来到我的网站</h1>
<nav>
<ul>
<li><a href="#">主页</a></li>
<li><a href="#">关于</a></li>
<li><a href="#">联系方式</a></li>
</ul>
</nav>
</header>
<main>
<p>在这里添加您的主要内容...</p>
</main>
<footer>
<p>版权所有 ? 2023 My Website</p>
</footer>
</body>
</html>
?
//修改nginx默认的nginx子配置文件,添加一行字符集配置(主要是为了访问时不会发生乱码的问题,如果不加,页面中有中文字体,会出现乱码的现象)
[root@localhost html]# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
charset utf-8; #这一行是新增的,设置字符集为utf-8万国码
?
#access_log /var/log/nginx/host.access.log main;
?
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
[root@localhost html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost html]# systemctl restart nginx
访问nginx,保证源站(后端服务器)自己访问没问题
//nginx-2 ip:192.168.17.128
//配置nginx的yum源直接yum安装
//启动
//编辑nginx的配置文件:
[root@localhost ~]# cd /etc/nginx/conf.d/
[root@localhost conf.d]# ls
default.conf
[root@localhost conf.d]# cp default.conf proxy.conf
//将文件中所有注释的行删除
[root@localhost conf.d]# sed -ri '/^.*#/d' proxy.conf
[root@localhost conf.d]# vim proxy.conf
server {
listen 80;
server_name www.testabc.com;
access_log /var/log/nginx/proxy_access.log main;
location / {
proxy_pass http://192.168.17.129:80;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
?
}
?//重启nginx
[root@localhost conf.d]# systemctl restart nginx
?
//修改本地解析hosts解析
win + r
输入地址:C:\Windows\System32\drivers\etc\hosts
在最底下添加一行:
192.168.17.128 www.testabc.com
?使用浏览器访问域名
注意:如果开了VPN的一定要将它关掉,不然浏览器访问不到的!
访问正常!反向代理成功!
proxy_pass;
:转发到真实后端服务器的地址,可以是ip,也可以是域名和url地址
proxy_redirect;
:如果真实服务器使用的是的真实IP:非默认端口。则改成IP:默认端口
proxy_set_header;
:重新定义或者添加发往后端服务器的请求头
proxy_set_header Host $http_host;
:重新定义发往后端服务器的请求
proxy_set_header X-Real-IP $remote_addr;
:只记录连接服务器的上一个ip地址信息。(在后端服务器中记录客户端访问时真实的ip地址)
proxy_set_header X-Real-IP $remote_addr;
这个配置指令的作用是在将请求转发到上游服务器时,重新定义或添加一个名为 X-Real-IP 的请求头,并将其值设置为客户端的真实IP地址。
在一些情况下,Nginx 作为反向代理服务器,会将客户端的请求转发给上游服务器。但是,上游服务器可能只能获取到 Nginx 服务器的 IP 地址,而无法获取到客户端的真实 IP 地址。通过使用 proxy_set_header 指令,可以将客户端的真实 IP 地址传递给上游服务器,以便服务器能够获取到客户端的真实 IP 信息。
具体来说,$remote_addr 是 Nginx 内置变量,它表示客户端的 IP 地址。通过将 $remote_addr 的值赋给 X-Real-IP 请求头,上游服务器就能够读取到这个请求头,并获取到客户端的真实 IP 地址。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
:通过这个选项可以记录真正客户端机器的ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这个配置指令的作用是在将请求转发到上游服务器时,重新定义或添加一个名为 X-Forwarded-For 的请求头,并将其值设置为客户端的真实 IP 地址。
在一些代理场景下,Nginx 作为反向代理服务器,会将客户端的请求转发给上游服务器。然而,上游服务器可能需要知道请求经过的【所有代理服务器】的 IP 地址,而不仅仅是 Nginx 服务器的 IP 地址。
X-Forwarded-For 请求头是一种常用的标准请求头,用于记录请求经过的代理服务器的 IP 地址。通过使用 proxy_set_header 指令,可以将客户端的真实 IP 地址添加到 X-Forwarded-For 请求头中,并将其传递给上游服务器。
$proxy_add_x_forwarded_for 是 Nginx 内置变量,它用于获取请求头中已经存在的 X-Forwarded-For 的值,并将客户端的真实 IP 地址追加到该值的末尾,以形成一个包含所有代理服务器 IP 地址的列表。
#这样做的好处是,上游服务器可以通过读取 X-Forwarded-For 请求头,获取到请求经过的所有代理服务器的 IP 地址列表,从而了解请求的真实来源路径。这对于一些安全性、日志记录和统计分析等方面都非常有用。
proxy_connect_timeout;
:后端服务器连接的超时时间发起三次握手等候响应超时时间
proxy_send_timeout;
:设置代理服务器向后端服务器发送数据的超时时间,单位为秒。
proxy_read_timeout
:设置代理服务器从后端服务器读取数据的超时时间,单位为秒。
//观察nginx-1服务器的日志
[root@localhost conf.d]# tailf /var/log/nginx/proxy_access.log
192.168.17.1 - - [26/Jul/2023:11:06:49 +0800] "GET / HTTP/1.1" 200 451 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
192.168.17.1 - - [26/Jul/2023:11:06:49 +0800] "GET / HTTP/1.1" 200 451 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
192.168.17.1 - - [26/Jul/2023:11:06:49 +0800] "GET /favicon.ico HTTP/1.1" 404 153 "http://www.testabc.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"