Nginx使用笔记

1.请求转发

比如说我要将127.0.0.1/topics上的所有请求转发到xxx:xxx/上

修改 sudo vim /etc/nginx/nginx.conf

        server {
               listen       80;
                server_name  127.0.0.1;
                location /topics {
                    #root   html;
                    #index  index.html index.htm;
                proxy_pass http://xxx:xxx;
                }
            }

2.代理前端和后端服务

3.Nginx使用本地缓存

4.代理

1.正向代理和反向代理

正向代理:代理服务器位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。客户端需要配置代理服务器。

用途: 访问控制、内容过滤、匿名浏览、缓存。我们用来kexue上网的工具就属于正向代理。

反向代理:代理服务器位于客户端和目标服务器之间,代表服务器处理客户端请求。客户端不知道反向代理的存在。

用途: 负载均衡、安全防护、缓存、SSL加速。比如使用Nginx,HAProxy,Apache HTTP Server等作为反向代理。

2.透明代理和非透明代理

透明代理和非透明代理都是正向代理,位于客户端和目标服务器之间,代理客户端向目标服务器发送请求。

透明代理:网络管理员在网络边界部署透明代理来过滤不良内容。用户浏览网站时,代理自动拦截和检查内容,而用户并不知道代理的存在。

非透明代理:用户配置浏览器使用非透明代理,以便匿名访问互联网。用户在浏览器中手动设置代理服务器地址和端口。

5.X-Forwarded-For,X-Real-IP和Remote Address

X-Forwarded-For通常用于标识通过 HTTP 代理或负载均衡器的原始客户端 IP 地址。X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。示例值: X-Forwarded-For: client1, proxy1, proxy2

X-Real-IP 有些反向代理服务器(如 Nginx)会将原始客户端 IP 地址放在这个头字段中。X-Real-IP,这是一个自定义头部字段。X-Real-IP 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。需要注意的是,X-Real-IP 目前并不属于任何标准。示例值:X-Real-IP: 203.0.113.195

Remote Address 是指服务器端看到的客户端的IP地址,即发起请求的源 IP 地址。在网络通信中,remote address 通常用于识别和追踪请求的来源。在不同的代理和负载均衡场景中,remote address 的值可能会发生变化。

参考:聊聊HTTP的X-Forwarded-For 和 X-Real-IP

1.直接访问

如果客户端直接访问服务器而没有经过任何代理或负载均衡器,remote address 将是客户端的 IP 地址。例如,如果客户端的 IP 地址是 203.0.113.195,服务器将看到:

Remote Address: 203.0.113.195

2.经过正向代理

当请求经过正向代理(包括透明代理和非透明代理)时,remote address 可能会有所不同:

  • 透明代理: 客户端不知道代理的存在,remote address 仍然显示为客户端的 IP 地址。
  • 非透明代理: 客户端知道代理的存在并进行配置,remote address 显示为代理服务器的 IP 地址,而原始客户端的 IP 地址通常会添加到 X-Forwarded-For 头字段中(如果代理服务器配置了添加 X-Forwarded-For 头字段的话)。

经过非透明代理的请求:

Remote Address: 198.51.100.1 (代理服务器 IP)
X-Forwarded-For: 203.0.113.195 (原始客户端 IP)

3.经过反向代理(如 Nginx)

当使用反向代理服务器(如 Nginx)时,默认情况下,后端服务器看到的 remote address 是反向代理服务器的 IP 地址,而不是原始客户端的 IP 地址。

Remote Address: 198.51.100.2 (Nginx 反向代理服务器 IP)

为了使后端服务器能够获取原始客户端的 IP 地址,Nginx 通常会在请求头中添加 X-Forwarded-For 和 X-Real-IP 字段。

配置 Nginx 传递原始客户端 IP

proxy_set_header X-Real-IP $remote_addr: 将原始客户端 IP 地址设置为 X-Real-IP 头字段。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for: 将 X-Forwarded-For 头字段设置为包含原始客户端 IP 地址所有经过的代理服务器的 IP 地址

$proxy_add_x_forwarded_for 是一个 Nginx 内置变量:

1.如果客户端请求包含 X-Forwarded-For header字段,$proxy_add_x_forwarded_for 变量等于X-Forwarded-For header后面附加$remote_addr变量(反向代理服务器的IP),用逗号分隔。

2.如果客户端请求不存在 X-Forwarded-For header字段,$proxy_add_x_forwarded_for 变量就等于$remote_addr变量。

参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html

http {
    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_server;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }
    }
}

参考:HTTP 请求头中的 X-Forwarded-For

X-Real-IP 只有一层反向代理的话就是原始客户端IP,两层反向代码的话就是第一层反向代理的IP
X-Forwarded-For第一个client IP是原始客户端IP
remote address(只有一层反向代理就是反向代理的IP,多层反向代理就是最后一层反向代理的IP,比如Nginx反向代理之前还有一层ALB),ALB传递X-Forwarded-For header可以参考:https://www.alibabacloud.com/help/zh/slb/application-load-balancer/user-guide/http-headers
 
posted @ 2019-10-16 15:43  tonglin0325  阅读(539)  评论(0编辑  收藏  举报