Nginx反向代理与缓存功能(小白的“升级打怪”成长之路)

nginx--正向代理、反向代理及负载均衡(图解+配置) 先来看张图~【再举个栗子】某同学喜欢面向搜索引擎编程,想通过百度搜索引擎查找一些学习资料,但是有些网站直接访问可能不太安全,会暴露自己的IP,同学比较苦恼,想着怎样才能使用百度搜索自己想要的学习资料,又不会暴露自己的IP在网站上呢?这时我告诉该同学,我呢手上刚好有一台代理服务器,这台代理服务器通过nginx配置了正向代理转发http和https请求,你呢,只需要在自己的Windows本地电脑的网关配置一下这台代理服务器的IP和端口号,就能正常通过代理服务器访问到百度并搜索相关的学习资料了,~代理。... 阅读详情

目录

一、正向代理和反向代理

1.1 正向代理概述

1.1.1 什么是正向代理

1.1.2 正向代理的作用

1.1.3 正向代理的基本格式

1.2 反向代理概述

1.2.1 什么是反向代理

1.2.2 反向代理可实现的功能

1.2.3 反向代理的可用模块

二、配置反向代理

2.1 反向代理配置参数

2.1.1 proxy_pass

2.1.2 其他参数

三、配置实战

3.1 反向代理单台web服务器

3.2 指定主机实现反向代理动静分离

3.3 缓存功能

3.4 实现反向代理客户端IP透传

3.4.1 基本原理

3.4.2 一级代理

3.4.3 多级代理

3.5 实现反向代理负载均衡

3.5.1 基本原理

3.5.2 常见配置参数

3.5.2 调度算法

3.5.2.1 轮询(Round Robin)

3.5.2.2 轮询权值(Weighted Round Robin)

3.5.2.3 ip_hash (source hash)

3.5.2.4 fair(第三方)

3.5.2.5 url_hash(第三方)

3.5.2.6 least_conn(最小连接数)

3.5.2.7 最少响应时间(Least Time)

3.6 实战

3.6.1 使用轮询算法实现负载均衡

3.6.2 使用加权轮询算法实现负载均衡

四、 Nginx配置跨域 CORS

4.1 跨域的定义

4.2 同源的定义

4.3 不同源的限制

4.4 Nginx 解决跨域的原理

4.5 案例

五、Nginx防盗链设置

5.1 什么是盗链

5.2 Referer解析

5.3 配置防盗链案例

5.4 测试

看到感觉有帮助的朋友,劳烦动动发财的小手给博主点个赞


一、正向代理和反向代理

1.1 正向代理概述

1.1.1 什么是正向代理

正向代理代理的是客户端

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端

1.1.2 正向代理的作用
  • 为在防火墙内的局域网客户端提供访问Internet的途径

  • 可以使用缓冲特性减少网络使用率

  • 访问受地理位置限制的网络

  • 使用代理后会隐藏真实的IP地址

1.1.3 正向代理的基本格式
server {
    listen 192.164.65.100:80;
    server_name ....;#客户端访问的域名
​
    location / {
      proxy_pass http://目标服务器地址;
    }
  }

案例:

##192。168.140##
[root@localhost conf]# vim nginx.conf
server {
        listen       80;
        server_name  _;
​
        #charset koi8-r;
​
        #access_log  logs/host.access.log  main;
​
        location / {
                proxy_pass http://192.168.58.130;   #设置为服务器ip#
        }
        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}
​
        error_page  404              /404.html;
        
[root@localhost conf]# nginx -s reload
网站访问192.168.58.140显示显示192.168.58.130的网页内容:2505

1.2 反向代理概述

1.2.1 什么是反向代理

反向代理代理的是服务端

反向代理:(reverse proxy),指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式 客户端不直接与后端服务器进行通信,而是与反向代理服务器进行通信,隐藏了后端服务器的 IP 地址

1.2.2 反向代理可实现的功能

反向代理的主要作用是提供负载均衡和高可用性。

负载均衡:Nginx可以将传入的请求分发给多个后端服务器,以平衡服务器的负载,提高系统性能和可靠性。

缓存功能:Nginx可以缓存静态文件或动态页面,减轻服务器的负载,提高响应速度。

动静分离:将动态生成的内容(如 PHP、Python、Node.js 等)和静态资源(如 HTML、CSS、JavaScript、图片、视频等)分别存放在不同的服务器或路径上。

多站点代理:Nginx可以代理多个域名或虚拟主机,将不同的请求转发到不同的后端服务器上,实现多个站点的共享端口。

1.2.3 反向代理的可用模块
ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
​
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组
​
ngx_stream_proxy_module:#将客户端的请求以tcp协议转发至指定服务器处理
​
ngx_http_fastcgi_module:#将客户端对php的请求以fastcgi协议转发至指定服务器助理
​
ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

二、配置反向代理

#官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 

2.1 反向代理配置参数

2.1.1 proxy_pass
proxy_pass 地址:端口的方式 ;  
#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP
#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
proxy_pass http://10.0.0.18:8080; 
#8080后面无uri,即无 / 符号,需要将location后面url 附加到proxy_pass指定的url后面,此行为类似于root
#proxy_pass指定的uri不带斜线将访问的/web,等于访问后端服务器
​
proxy_pass http://10.0.0.18:8080/;   
#8080后面有uri,即有 / 符号,相当于置换,即访问/web时实际返回proxy_pass后面uri内容.此行为类似于alias 
#proxy_pass指定的uri带斜线,等于访问后端服务器的http://10.0.0.18:8080/index.html 内容返回给客户端
#如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能使用uri; 即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后
2.1.2 其他参数
proxy_hide_header field;
#用于nginx作为反向代理的时候,在返回给客户端http响应时,隐藏后端服务器相应头部的信息,可以设置proxy_hide_header field;
​
proxy_pass_header field;
#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数,如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端
​
#field 首部字段大小不敏感
#示例:透传后端服务器的Server和Date首部给客户端,同时不再响应报中显示前端服务器的Server字段
proxy_pass_header Server;
proxy_pass_header Date;
​
​
proxy_pass_request_body on | off; 
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启
​
​
proxy_pass_request_headers on | off; 
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启

三、配置实战

3.1 反向代理单台web服务器

所需配置

#代理服务器
vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
server{
        listen 192.164.65.100:80;
        server_name  www.pc.com;
        root    /apps/nginx/html/pc;
     location  / {
        proxy_pass http://192.164.65.101;
}
​
}
nginx -t
nginx -s reload
#重新加载
#客户机
​
vim  /etc/hosts
192.164.65.100  www.pc.com

测试

客户机访问代理服务器

 curl 192.164.65.100

3.2 指定主机实现反向代理动静分离

因为nginx无法处理动态资源,所以要动静分离。

所需配置

#代理服务器
​
vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
​
  location  /api {
        proxy_pass http://192.164.65.101;
}
​
     location  /static {
        proxy_pass http://192.164.65.103;
}
nginx -t
nginx -s reload
#重新加载

#动态资源服务器
​
#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
​
#安装nginx服务
yum install -y epel-release
yum install nginx -y
​

systemctl start nginx 
​
#创建动态资源目录
cd /usr/share/nginx/html
​
mkdir api
echo this is api > ./api/index.html

#静态资源服务器
​
#关闭防火墙和selinux
systemctl stop firewalld 
setenforce 0
​
#安装服务
yum install -y epel-release 
yum install nginx -y 
systemctl start nginx 
​
#创建静态资源目录
cd /usr/share/nginx/html
mkdir static
echo this is static > ./static/index.html

测试

#客户机
#关闭防火墙和selinux
systemctl stop firewalld 
setenforce 0
​
#动态资源
curl 192.164.65.100/api -L
​
#静态资源
curl 192.164.65.100/static -L

实战案例

yum安装nginx服务

##配置受代理的服务器(192.168.58.131)的配置文件
##动态网页
[root@bogon ~]# cd /etc/nginx/
[root@bogon nginx]# mv nginx.conf nginx.conf.bak
[root@bogon nginx]# cp nginx.conf.default nginx.conf
[root@bogon nginx]# vim nginx.conf
location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }
​
#更改为
location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }
​
##配置192.168.58.131为动态网页
[root@bogon ~]# cd /etc/nginx
[root@bogon nginx]# yum install -y php php-mysql
[root@bogon nginx]# yum install -y php-fpm
[root@bogon nginx]# systemctl start php-fpm
[root@bogon nginx]# vim nginx.conf
    #gzip  on;
​
    server {
        listen       80;
        server_name  localhost;
​
        #charset koi8-r;
​
        #access_log  logs/host.access.log  main;
​
        location / {
            root   html;
            index  index.html index.htm index.php;
        }
[root@bogon nginx]# systemctl restart nginx
[root@bogon nginx]# cd /usr/share/nginx/html/
[root@bogon html]# rm -rf index.html
[root@bogon html]# mkdir d
[root@bogon html]# cd d/
[root@bogon d]# vim index.php
<?php
        echo "<h1>c2505</h1>";
        phpinfo();
?>
##配置192.168.58.130为静态网页
[root@bogon ~]# cd /etc/nginx
[root@bogon nginx]# vim nginx.conf
    #gzip  on;
​
    server {
        listen       80;
        server_name  localhost;
​
        #charset koi8-r;
​
        #access_log  logs/host.access.log  main;
​
        location / {
            root   html;
            index  index.html index.htm index.php;
        }
[root@bogon nginx]# systemctl restart nginx
[root@bogon nginx]# cd /usr/share/nginx/html/
[root@bogon html]# rm -rf index.html
[root@bogon html]# mkdir s
[root@bogon html]# cd s/
[root@bogon s]# echo 2505 > index.html
##更改代理服务器(192.168.58.140)的配置文件
[root@localhost ~]# cd/etc/nginx
[root@localhost nginx]# vim nginx.conf
    #gzip  on;
    server {
        listen       80;
        server_name  www.c2505.com.cn;
​
        #charset koi8-r;
​
        #access_log  logs/host.access.log  main;
​
        location /s {
                proxy_pass http://192.168.58.130;
        }
        location /d {
                proxy_pass http://192.168.58.131;
        }
[root@localhost nginx]# systemctl restart nginx

3.3 缓存功能

反向代理可以缓存静态资源。

当客户端再次请求访问相同资源时,反向代理可以直接返回缓存中的响应,无需二次请求,减少对后端服务器的请求压力,并加快响应速度。

proxy_cache zone_name on | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;
proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中
 示例:
 proxy_cache_valid 200 302 10m;
 proxy_cache_valid 404 1m;
 
 
proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http   必须放在http语句中
proxy_cache_path path [levels=levels] [use_temp_path=on|off] 
keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number] 
[manager_sleep=time] [manager_threshold=time] [loader_files=number] 
[loader_sleep=time] [loader_threshold=time] [purger=on|off] 
[purger_files=number] [purger_sleep=time] [purger_threshold=time];
​
​
#示例:在http配置定义缓存信息
   proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
   levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
   keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的key
   inactive=120s  #缓存有效时间  
   max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
   
   
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存
​
​
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端
​
#示例
proxy_cache_use_stale error http_502 http_503;
​
​
proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
proxy_cache_path /data/nginx/proyxcache   levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
​
​
#http  语句
#1:1:1  16个二进制     2^16/2^16/2^16       2^48
​
​
server {
   listen 80;
   proxy_cache proxycache;
   proxy_cache_key $request_uri;
   #proxy_cache_key $host$uri$is_args$args;
   proxy_cache_valid 200 302 301 10m;
   proxy_cache_valid any 5m;
   server_name www.kgc.com;
   root /data/nginx/pc;
  location / {
  root /data/nginx/pc;
  }
  location /api {
  proxy_pass http://192.164.91.101:9527;
  }
  location ~* \.(jpg|png|gif|html)$ {
  proxy_pass http://192.164.91.102;
  }
}

清理缓存

方法1: rm -rf 缓存目录
方法2: 第三方扩展模块ngx_cache_purge

3.4 实现反向代理客户端IP透传

3.4.1 基本原理

反向代理客户端IP透传是指在使用反向代理服务器时,将客户端的真实IP地址传递给后端服务器。

这可以通过一些特定的 如X-Forwarded-For 等HTTP 头字段来实现 头字段。

当请求经过反向代理服务器时,代理服务器会将客户端的真实IP地址添加到 XFF 头字段中,然后转发给后端服务器。

后台服务端开启main日志格式调用!!!

3.4.2 一级代理

所需配置

#代理服务器
​
vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
server{
        listen 192.164.65.100:80;
        server_name  www.pc.com;
        root    /apps/nginx/html/pc;
     location  / {
        proxy_pass http://192.164.65.101;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
​
}
​
######
`$proxy_add_x_forwarded_for` 是一个 nginx 变量,用于获取客户端的真实 IP 地址并将其添加到请求中的 `X-Forwarded-For` 头字段中,后端服务器可以通过检查该头字段来获取请求的真实客户端 IP 地址。

#后端服务器
​
#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
​
#安装服务
yum install -y epel-release #依赖
yum install nginx -y 
systemctl start nginx 

测试

#客户端
curl 192.164.65.100
#后端服务器
cat /var/log/nginx/access.log |tail -f -n2

3.4.3 多级代理

所需配置

#一级代理服务器
​
#编辑子配置文件
vim /apps/nginx/conf.d/pc.conf
#反向代理指向二级代理服务器的IP
​
nginx -t
nginx -s reload
#重新加载

#后端服务器
​
#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
​
#安装nginx服务
yum install -y epel-release 
yum install nginx -y 
systemctl start nginx 

测试

#客户端,访问代理服务器
curl 192.164.2.100
#后端服务器,查看日志
cat /var/log/nginx/access.log | tail -n -1

3.5 实现反向代理负载均衡

Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

#官方文档:
https://nginx.org/en/docs/http/ngx_http_up
3.5.1 基本原理

NGINX的负载均衡原理是基于反向代理和事件驱动的机制。

当客户端发送请求时,NGINX作为反向代理服务器接收请求,并根据配置的负载均衡算法将请求转发到后端的多个服务器上,实现负载均衡。

3.5.2 常见配置参数
server address [parameters];
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
#server支持的parameters如下:
​
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
​
max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
​
max_fails=number  #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
​
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
​
sorry server   #自己不能转自己
down    #标记为down状态
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
backup  #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
​
upstream backend {
    server backend1.example.com;
    server backend2.example.com backup;
    server backend3.example.com;
}
3.5.2 调度算法
3.5.2.1 轮询(Round Robin)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

#示例
upstream bakend {  
    server 192.164.65.1;    
    server 192.164.65.2;  
}
3.5.2.2 轮询权值(Weighted Round Robin)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

#示例
upstream bakend {  
    server 192.164.65.1 weight=10;  
    server 192.164.65.2 weight=20;  
}
​
3.5.2.3 ip_hash (source hash)

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

#示例
upstream bakend {  
    ip_hash;  
    server 192.164.65.1:88;  
    server 192.164.65.2:80;  
} 
​
3.5.2.4 fair(第三方)

比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。

Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend {  
    server 192.164.0.67:88;  
    server 192.164.0.67:80;  
    fair;  
}
3.5.2.5 url_hash(第三方)

按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。

Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream backend {  
    server 192.164.65.1:88;  
    server 192.164.65.2:80;  
    hash $request_uri;  
    hash_method crc32;  
}
​
#注:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
3.5.2.6 least_conn(最小连接数)

根据后端服务器的连接状况进行分配客户请求,连接最少的服务器将被有限分配客户端请求。

#示例
 upstream backend {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
    }
3.5.2.7 最少响应时间(Least Time)

根据服务器的响应时间进行选择,将请求分配给响应时间最短的服务器。

3.6 实战

要启用负载均衡,需要在Nginx主配置文件中添加一个upstream块来定义后端服务器的列表。

然后,在相应的location块中使用proxy_pass指令指定负载均衡的上游服务器。

3.6.1 使用轮询算法实现负载均衡

所需配置

#代理服务器
​
vim /apps/nginx/conf/nginx.conf
#编辑主配置文件
​
upstream group1{
    server 192.164.65.102;
    server 192.164.65.103;
    }

vim /apps/nginx/conf.d/pc.com
#修改子配置文件
#修改location部分,加入
    pass_proxy http://group1;
​
nginx -t
nginx -s reload
#重新加载

测试

#修改102、103主页文件
vi /usr/share/nginx/html/index.html

#转到客户端
curl 192.164.65.100   #x2

3.6.2 使用加权轮询算法实现负载均衡

所需配置

#代理服务器
​
#修改主配置文件
vim /apps/nginx/conf/nginx.conf
​
upstream group1{
    server 192.164.65.102 weight=2;
    server 192.164.65.103 weight=3;
}

nginx -t
nginx -s reload
#重新加载

测试

#转到客户端
curl 192.164.65.100   #x2

四、 Nginx配置跨域 CORS

4.1 跨域的定义

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。

4.2 同源的定义

如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。

与 URL http://store.company.com/dir/page.html 的源进行对比的示例:

4.3 不同源的限制

  • Web 数据层面,同源策略限制了不同源的站点读取当前站点的 Cookie 、 IndexDB 、 LocalStorage 等数据;

  • DOM 层面,同源策略限制了来自不同源的 JavaScript 脚本对当前 DOM 对象读和写的操作;

  • 网络层面,同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。

4.4 Nginx 解决跨域的原理

浏览器的同源策略限制了跨域请求,但当使用 Nginx 作为代理服务器时,浏览器发送的请求实际上是发送到与前端页面同源的 Nginx 服务器。然后 Nginx 将请求转发到真正的目标服务器,目标服务器返回的响应再通过 Nginx 返回给浏览器。从浏览器的角度看,它只与同源的 Nginx 服务器进行交互,从而绕过了 CORS 限制

4.5 案例

前端 server 的域名为:fe.server.com

后端服务的域名为:dev.server.com

现在在 fe.server.com 对 dev.server.com 发起请求一定会出现跨域。

现在我们只需要启动一个 Nginx 服务器,将 server_name 设置为 fe.server.com 然后设置相应的 location 以拦截前端需要跨域的请求,最后将请求代理回 dev.server.com 。

如下面的配置:

server {
  listen        80;
  server_name  fe.server.com;
  location / {
        proxy_pass dev.server.com;
        proxy_set_cookie_domain target-domain.com your-domain.com;
        proxy_set_header Host target-domain.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 可选的配置,用于处理响应头
        proxy_set_header Access-Control - Allow - Origin http://fe.server.com;
        proxy_set_header Access-Control - Allow - Methods GET,POST,PUT,DELETE;
        proxy_set_header Access-Control - Allow - Headers Content - Type,Authorization;
  }
}
​

配置解析:

  • proxy_set_header

    • Host backend - domain.com:设置转发请求的Host头信息。这是因为后端服务器可能会根据Host头来区分不同的虚拟主机或服务,所以需要将正确的Host信息传递给后端服务器,使其能够正确处理请求。

    • X-Real-IP $remote_addr和X-Forwarded-For $proxy_add_x_forwarded_for:这两个指令用于传递客户端的真实 IP 地址。$remote_addr是 Nginx 记录的客户端 IP 地址,$proxy_add_x_forwarded_for是一个包含了客户端 IP 以及中间代理服务器 IP(如果有的话)的变量。这样后端服务器可以获取到正确的客户端 IP 信息,用于日志记录、访问控制等目的。

    • Origin http://frontend - domain.com:这是关键的一个设置,用于在转发请求时,将Origin头信息设置为前端页面的域名。后端服务器在收到这个请求时,会认为请求来自于同源的http://frontend - domain.com,从而避免了 CORS 限制。这样后端服务器就可以正常处理请求并返回响应,响应会通过 Nginx 再返回给浏览器。

    • proxy_set_header Access-Control - Allow - Origin

      这个指令用于在 Nginx 作为代理服务器返回响应时,设置Access - Control - Allow - Origin响应头。通过将其设置为前端页面的域名(http://frontend - domain.com),浏览器会认为这个响应是来自同源的服务器,从而允许前端 JavaScript 代码访问这个响应,有效地绕过了 CORS 限制。

    • proxy_set_header Access-Control - Allow - Methods

      用于设置Access - Control - Allow - Methods响应头,指定允许的 HTTP 请求方法。在这里列举了GET、POST、PUT和DELETE,表示后端服务器允许前端通过这些方法进行跨域请求。可以根据实际的后端 API 支持的方法进行调整。

    • proxy_set_header Access-Control - Allow - Headers

      设置Access - Control - Allow - Headers响应头,指定允许的请求头。Content - Type头通常用于指定请求或响应的内容类型,如application/json或text/plain等;Authorization头用于传递认证信息,如令牌或用户名 / 密码等。这确保了前端在跨域请求中可以发送这些必要的请求头,并且后端会认可这些请求头。

这样可以完美绕过浏览器的同源策略:fe.server.com 访问 Nginx 的 fe.server.com 属于同源访问,而 Nginx 对服务端转发的请求不会触发浏览器的同源策略。

五、Nginx防盗链设置

5.1 什么是盗链

  • 在实际生产过程中,我们线上的图片等静态资源,经常会被其他网站盗用,他们发大财的同时,成本确实我们在买单,下面来说下,如何杜绝这种行为。

  • 应该说只要是静态资源都是可以防盗链的,只需要在Server字段加上几行代码即可。众所周知网站出名了后,会有各种刁民来找茬的,最常见的就是爬你网站的东西。

  • 关于防盗链这里不得不提一下网页的加载顺序是先加载HTML相关的内容,然后解析HTML的内容,那些需要加载图片,那些需要加载文件,是逐步加载的,所以可以在加载静态资源的时候做防盗链的操作,例如:在加载图片的时候直接跳转去其他链接,或者直接返回404,403等错误代码,拒绝它的请求。

如何区分哪些是不正常的用户?

  • HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况.

  • 比如在www.google.com 里有一个 www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=http://www.google.com

5.2 Referer解析

  • HTTP 协议中有一个用来表示“页面或资源”来源的“请求头”,这个请求头叫做 Referer --> Referer是表示请求是从哪个网址发出的防盗链功能基于HTTP协议支持的 Referer 机制,通过Referer跟踪来源,对来源进行识别和判断

5.3 配置防盗链案例

为了模拟盗链,让192.168.166.9为网站服务站点,192.168.166.10访问192.168.166.9进行盗链。

修改Nginx的字符集以支持中文:

charset utf-8;

修改 192.168.166.10 Nginx 默认访问文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>产生盗链</title>
</head>
<body>
 <a href='http://192.168.166.9/photos/1.png'>站点</a>
</body>
</html>
​

此时在浏览器输入192.168.166.10,可以正常访问192.168.166.9站点的图片资源。

如果不想被盗链,则对192.168.166.9站点服务修改Nginx配置文件,防盗链的配置可以在任意的 location 模块下设置,不能在 server 下,不想让别人盗链哪个资源就在那个资源的 location 模块下设置防盗链。

防盗链设置格式:

valid_referers none | blocked | server_names | strings ....;
  • --none:允许没有http_refer的请求访问资源,检测 Referer 头域不存在的情况,则可以访问。

  • --blocked:检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。允许不是http://开头的,不带协议的请求访问资源。

  • --server_names :只允许指定ip/域名来的请求访问资源(白名单)。可设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。在生产环境中尽量使用域名,不使用ip。

举例

valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}

192.168.166.9设置防盗链

​
server {
    listen 80;
    server_name localhost;
    location / {
            root   /usr/local/nginx1273/html;
            index  index.html index.htm;
        }
 
    location ~* \.(js|img|css|png)${
        valid_referers 192.168.166.9; #只允许192.168.166.9访问静态资源,其他人访问则会返回403
        if ($invalid_referer){
            return 403;
        }
        root html;
        index index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location =/50x.html {
    root html;
    }
}

5.4 测试

浏览器测试

用192.168.166.10去访问,css等静态资源返回403,获取不到数据。

点击”站点“,跳转到192.168.166.9站点资源是显示:


看到感觉有帮助的朋友,劳烦动动发财的小手给博主点个赞

Nginx代理(正向代理详解) 出现以上异常的具体原因是 NGINX 本身的设计就是作为一个反向代理服务器,而非正向代理服务器,并且在短期也没有打算支持正向代理,所以现在 NGINX 并不支持 CONNECT 请求方式,因此收到“CONNECT ***:443 HTTP/1.1”请求时会报“client sent invalid request while reading client request line”异常。所以,当浏览器通过代理发送一个 HTTPS 请求时,请求的地址和端口也是被加密的,代理服务器也无法知道这些信息。 阅读详情

相关推荐

【网站架构】Nginx 4层、7层代理配置,正向代理、反向代理详解

本期详细讨论网站系统的代理配置,以Nginx为例 1、反向代理,外网请求进来 2、正向代理,请求外网服务,包含4层,7层代理讲解

池鱼 - YiiGaa 2833

Nginx | 正向代理与Proxy插件整合

在企业开发环境中,局域网内的设备通常需要通过正向代理服务器访问互联网。正向代理服务器充当中介,帮助客户端请求外部资源并返回结果。局域网内也就是我们俗称的`内网`,局域网外的互联网就是`外网`,在一些特殊场景内,例如:医院。而局域网中的客户端要访问这些资源时,就需要通过代理服务器。这种通过代理服务器访问外部网络资源的方式,就是正向代理。

微枫Micromaple的博客 2万+

最全SpringBoot学习教程:java嵌入式开发平台叫什么

一、前言 聊的是八股的文,干的是搬砖的活! 面我的题开发都用不到,你为什么要问?可能这是大部分程序员求职时的经历,甚至也是大家讨厌和烦躁的点。明明给的是拧螺丝的钱、明明做的是写CRUD的事、明明担的是成工具的人! 明明… 有很多,可明明公司不会招5年开发做3年经验的事、明明公司也更喜欢具有附加价值的研发。有些小公司不好说,但在一些互联网大厂中,我们都希望招聘到具有培养价值的,也更喜欢能快速打怪升级的,也更愿意让这样的人承担更大的职责。 但,你酸了! 别人看源码你打游戏、别人学算法你刷某音、别人写博

m0_57286622的博客 548

四、nginx正向代理

指的是通过,再由来流量结构图如下:好处:这样做的好处是,当通过访问时,获得的是的IP,这样可以达到的效果。

黑日里不灭的light 1万+

程序员编程之——工具集“器”

程序员编程之——工具集“器”

java_zhong1990的专栏 351

Ubuntu零基础入门到精通【3.7讲】:云服务器中初始化 Ubuntu:从拿到 IP 到跑通生产环境的完整实战指南

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1539

Nginx Web服务(小白的“升级打怪”成长之路)

网站常识1)URL与URIURI是统一资源标识符URL 正是使用 Web 浏览器等访问Web 页面时需要输入的网页地址(客户端)2)http采用HTTP协议时,协议方案就是http。除此之外, 还有 ftp、mailto、telnet、file 等。HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。为了实现期望的保持状态功能,于是引入了 Cookie 技术。

deeper_wind的博客 1459

Ubuntu零基础入门到精通【1.7讲】:Ubuntu 适合哪些人群:学生、开发者、运维、云计算工程师?

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1736

Nginx 的升级打怪

Nginx的核心概念和配置要点,适合作为学习和参考的资料。如果需要更深入的了解,建议直接阅读原文或访问Nginx的官方文档。

modelsetget的博客 424

UG/NX二次开发实战:用Python脚本批量更新100个零件参数,解放你的双手

本文详细介绍了如何利用NXOpen Python API进行UG/NX二次开发,实现批量更新100个零件参数的自动化流程。通过环境配置、框架设计、核心代码实现及性能优化,帮助工程师高效完成参数化设计任务,显著提升工作效率。

weixin_28694169的博客 276

ADS与MATLAB数据互通全指南:从Snp文件导入到TXT导出完整流程

本文详细介绍了在射频与微波工程中,实现ADS与MATLAB高效数据互通的完整流程。核心内容包括利用SPOutput控件、数据显示窗口及测量方程等多种方法,将ADS仿真数据(如S参数)导出为Touchstone或TXT格式,并导入MATLAB进行深度分析与可视化;同时指导如何将MATLAB处理后的数据回灌至ADS,用于模型验证与协同仿真,旨在构建自动化、无损的数据交换工作流,提升工程师的工作效率。

pluto的博客 394

运维工程师打怪升级进阶之路 V2.0

点击上方“民工哥技术之路”选择“置顶或星标”每天10点为你分享不一样的干货在此之前,发布过两个版本:运维工程师打怪升级之路 V1.0 版本发布运维工程师打怪升级必经之路 ...

民工哥的博客 1886

博途WinCC上位机避坑指南:从工控机选型到趋势图优化的完整流程

本文详细解析了博途WinCC上位机开发全流程,从工控机选型到趋势图优化的关键技巧。针对工业自动化场景,提供硬件配置指南、网络优化方案和性能提升策略,帮助工程师避开常见陷阱,实现稳定高效的HMI系统部署。特别强调PC Station与传统触摸屏的选型对比及SIMATIC NET配置优化。

pp12345的博客 279

升级打怪拿offer,Java面试题(附答案)

升级打怪拿offer,献上熬夜肝出最新的Java面试题(附答案) 内容有:基础、JVM、多线程与高并发、Spring、MyBatis、SpringBoot、MYSQL、SpringCloud、Dubbo、Nginx、MQ、数据结构与算法、Linux、Zookeeper、Redis、分布式、网络、设计模式、maven、ElasticSearch、git、软实力等! 基础篇 基础面试题 基础题答案(部分) JVM篇 JVM面试 JVM答案(部分) 多线程&并发篇

ZzzzjQqqq的博客 292

基于灰度信息的图像配准方法

图像配准方法分为三种:基于灰度信息方法、基于变换域方法和基于特征方法。基于灰度信息方法是直接根据图像或图像块灰度信息进行像素上的对齐,该方法主要思想是直接最小化图像信息差异。然而,图像信息差异的判断准则衍生出不同的配准方法。常见的基于灰度信息的图像配准方法包括互相关法、互信息法和误差平方和法。本节将分别对互相关法、互信息法和误差平方和算法展开介绍,并通过MATLAB进行演示。基于灰度的图像方法容易实现,但同样存在不足。该方法对成像条件(光照,遮挡)、图像形变旋转以及噪声极其敏感,同时具有较高的计算复杂度。

weixin_42068054的博客 3777

Vibe Writing 手把手教程:Obsidian + Claudian + Skill

本文介绍了Vibe Writing的实操教程,主要使用Obsidian+Claudian+Skill组合。教程包含工具安装配置(Obsidian、Claudian插件)、核心工作流(选题-调研-写作-发布)和效果对比。重点展示了Claude Code生成的文本更具"人味"和场景感,优于其他AI工具。作者强调工具只是辅助,内容灵魂仍需个人思考积累。附有公众号排版和全网发布工具推荐,以及自动配图生成方案。

301

面试升级打怪-中到高的过程

1.php内存分配原理、引用 或赋值的 处理过程、垃圾回收机制、数组的运行原理。数组函数、字符串函数、排序函数。PHP5中,var_dump机制原理,模拟一下。2.数据结构 Btree 索引实现方式 二叉树 (关系设计的程序是否合理,知道的多 设计思路越多)3.redis 5种数据结构 分别的使用场景主从复制复制的过程 缓存与数据库一致性问题解决方案实现分布式锁AOF 和...

weixin_30906425的博客 175

手把手带你死磕ORBSLAM3源代码(一)目录详解

ORB-SLAM3是一种基于特征点的稀疏实时单目SLAM(Simultaneous Localization and Mapping)系统。它是ORB-SLAM系列模型的第三代版本,用于在无人机、机器人和增强现实等领域中进行实时定位和建图。ORB-SLAM3使用了一种特征点提取和描述算法,称为ORB(Oriented FAST and Rotated BRIEF)。该算法能够提取图像中的稳定特征,并将其用于地图建立和相机定位。

anananajiushiwo的博客 2301

深入理解 Nginx 工作原理及优化技巧:从新手小白到专家的实用学习指南!

戳下方名片,关注并星标!回复“1024”获取2TB学习资源!????体系化学习:运维工程师打怪升级进阶之路 4.0— 特色专栏—MySQL/PostgreSQL/MongoDBElasticSearch/Hadoop/RedisKubernetes/Docker/DevOpsKafka/RabbitMQ/Zookeeper监控平台/应用与服务/集群管理N...

民工哥的博客 258

LeetCode 面试经典 150 题回顾

最经典 150 题,掌握面试所有知识点 面试经典 150 题 : 题目分析、解题思路、复杂度分析、代码展示

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

1902

只知道 Nginx 牛逼!却不知道它怎么支持百万并发?

戳下方名片,关注并星标!回复“1024”获取2TB学习资源!????体系化学习:运维工程师打怪升级进阶之路 4.0— 特色专栏—MySQL/PostgreSQL/MongoDBElasticSearch/Hadoop/RedisKubernetes/Docker/DevOpsKafka/RabbitMQ/Zookeeper监控平台/应用与服务/集群管理N...

民工哥的博客 1005

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

简明入门讲义——NGINX 为何这么快

概览NGINX 进程角色Worker 如何做到单线程以一敌百热修改配置是如何实现的参考文档 NGINX 是战斗民族主导的一个服务端软件,主要充当负载均衡器和反向代理。 NGINX 进程角色 一个 NGINX 主要由 Master 进程和一系列子进程组成,主进程负责配置读取和重新加载、绑定端口以及子进程的管理 子进程有三种角色 **缓存加载器(Cache loader)**负责将磁盘缓存加载到共享内存。此进程按计划执行,用完即销毁,占用资源较少 **缓存管理器(Cache Manager)**负责清除磁盘

FesonX的博客 351

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

服务器框架

客户端Client登录连Nginx反向代理,负载均衡web服务器(作用外部负载,比如有100W玩家登录,一个web处理不过来,做Web集群),web集群访问一个共享缓存SHMRedis(ShareMemory),共享缓存使用的是Redis,数据库采用的是MongoDB。 共享缓存设计原理,当我们写数据的时候,先写到redis里面,由程序定时的写入mongoDB中,读数据的时候,先从redis,根据key拿数据,如果没有的话,去mongoDB中查询,查完之后写入redis里面, 账号...

qq_35647121的博客 417

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

这 24 款强大的 Linux 工具,节省 80% 加班时间(运维老炮私藏)!

作为微服务的统一入口,实现路由转发、协议转换(如 HTTP 转 gRPC)、鉴权、日志记录等功能。:提供访问控制(基于 IP、用户代理等)、限流(速率限制)、防 DDoS 攻击等功能。:分配客户端请求到多台后端服务器,支持轮询、加权轮询、IP 哈希、最少连接等算法。:支持静态文件(HTML、CSS、JS、图片等)的高效传输,通过异步事件驱动模型(如 epoll、kqueue)实现高并发连接处理。:版本控制、分支管理与分布工协作,可与 GitHub、GitLab 等平台集成,支持代码托管、协作与持续集成。

民工哥的博客 1685

俄罗斯人开发的 8 个世界级软件!你知道几个?

戳下方名片,关注并星标!回复“1024”获取2TB学习资源!????体系化学习:运维工程师打怪升级进阶之路 4.0— 特色专栏—MySQL/PostgreSQL/MongoDBElasticSearch/Hadoop/RedisKubernetes/Docker/DevOpsKafka/RabbitMQ/Zookeeper监控平台/应用与服务/集群管理N...

民工哥的博客 5255
上一篇: Nginx Web服务(小白的“升级打怪”成长之路)
下一篇: MySQL数据库基础(小白的“升级打怪”成长之路)
deeper_wind
博客等级 码龄2年 262粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值