nginx的反向代理实验

nginx反向代理

概念:

反向代理是nginx的一个重要功能,在编译安装的时候默认会编译的一个模块

主要的是proxy_pass这个参数来指定;

客户需要查找一些资源–>代理服务器接收—>然后再把请求给到后端真实的服务器进行处理;

再把得到的结果反馈给客户端;

作用:

正向代理:服务器代理客户的请求;
反向代理:主要是提供服务器返回的数据

  • 可以防止内部服务器被恶意攻击(客户根本就不知道这些信息是哪一台服务器提供的)
  • 为负载均衡和动静分离提供技术支持;

语法:

Syntax: proxy_pass URL;							#proxy_pass +需要代理的后端服务器
Default: —
Context: location, if in location, limit_except   

代理服务器:可以支持http或者https

url地址:可以指的是域名或者是IP地址,也可以选择端口

语法例子:

proxy_pass  http://192.168.75.130;  #仅仅代理的是ip地址
proxy_pass  http://192.168.75.130:8080;代理端口号
proxy_pass  http://www.liangjiawei.net/url;#代理具体的目录请求

反向代理实验讲解

实验一:

规划:

location和proxy_pass都不带uri路径

客户服务器:192.168.75.130

代理服务器:192.168.75.131

后端服务器:192.168.75.132

代理端配置:

修改配置文件–>不要带上url的;

#使用的是虚拟主机的配置,也是131的nginx服务
[root@node1 nginx]# vim /data/nginx/conf/www.liangjiwei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
#       location  / {
#               root /data/html/www;
#               index index.html index.htm;
#               }
        location / {
                proxy_pass http://192.168.75.132;
                }
}

	#这里配置文件指定了,131的服务器的www.liangjiawei.net这个网址,
	#如果访问www.liangjiawei.net就直接访问132的服务器
	#意思就是131反代132的服务器-->真实处理的是132服务器
	
#验证
[root@node2-132 nginx]# curl www.liangjiawei.net
这是132的服务器
[root@node2-132 nginx]# curl www.liangjiawei.net/index.html
这是132的服务器

实验二:

这个是变形:

  • 131代理服务器的proxy_pass这里没有uri路径;
  • 但是131代理服务器的location有uri路径
  • 注意资源路径的位置
#代理服务器,先修改配置文件-->还是引用原来的虚拟主机来配置
[root@node1 ~]# vim /data/nginx/conf/www.liangjiwei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
        location /haha/  {						#这里我们加了一个路径
                proxy_pass http://192.168.75.132;
                }
}

#重载配置文件
[root@node1 ~]# nginx -s reload

#后端服务器配置
[root@node2-132 ~]# mkdir /usr/local/nginx/html/haha/
[root@node2-132 ~]# echo “这是132的haha的页面” > /usr/local/nginx/html/haha/index.html
	#修改后端服务器的配置文件

[root@node2-132 ~]# vim /usr/local/nginx/conf/nginx.conf
	#在server下空白处加入
        location /haha {
                index index.html index.htm;
                }
..............
	#重载配置文件
[root@node2-132 ~]# nginx -s reload


#验证测试看看
	#如果直接访问域名-->得到本机的默认页面
[root@node1 ~]# curl www.liangjiawei.net
这是131 默认的nginx的主页面

#如果访问/haha/?
[root@node1 ~]# curl www.liangjiawei.net/haha/
“这是132的haha的页面”

解释说明

  • 代理服务器端配置了uri的路径值得是远端的服务器的路径
  • 如果要访问成功,那么后端的资源要有

实验三:

这个也是变形:

  • 131代理服务器的proxy_pass这里设置了uri路径;
  • 131代理服务器中的location也设置了路径;
  • 那么服务器该如何处理这些资源?
  • 后端服务器同样有haha和hehe的资源,但是如果访问到的/haha,在proxy_pass中设置了uri直接访问到了hehe的资源
#代理服务器端的配置
[root@node1 ~]# vim /data/nginx/conf/www.liangjiwei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
        location /haha/  {
                proxy_pass http://192.168.75.132//hehe/;		#在实验二的基础上再加个路径;
                }

	#重载配置文件
[root@node1 ~]# nginx -s reload

	#后端服务器还没设置资源,然后直接验证-->直接报404;资源没找到
[root@node1 ~]# nginx -s reload
[root@node1 ~]# curl www.liangjiawei.net/haha/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.17.10</center>
</body>
</html>


#然后我们在后端服务器创建一下资源
[root@node2-132 ~]# mkdir /usr/local/nginx/html/hehe
[root@node2-132 ~]# echo "这是132的hehe的资源查看" > /usr/local/nginx/html/hehe/index.html
	#然后再次访问-->发现能够找到资源
[root@node1 ~]# curl www.liangjiawei.net/haha/
这是132的hehe的资源查看

获取远程客户端真实ip地址

  • 在服务器配置的基础上,去掉复杂的url,直接代理到132的主页就好了;
  • 我们不配置的时候,查看一下日志
  • 然后配置了之后再次查看日志,看看能否多出来什么
#代理服务器131的配置文件,尽量简单
[root@node1 ~]# vim /data/nginx/conf/www.liangjiwei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
        location /  {
                proxy_pass http://192.168.75.132;		#后端的服务器是132,
                }
}
	#重仔配置文件
[root@node1 ~]# nginx -s reload
	#查看验证--->这里使用130的客户端来查看
[root@node-130 ~]# curl www.liangjiawei.net
这是132的服务器
	
	#去到后端服务器查看一下日志文件-->明显发现了,明明是130访问的,但是没有记录
[root@node2-132 ~]# tail -5 /usr/local/nginx/logs/access.log 
192.168.75.131 - - [04/Jul/2021:17:50:33 +0800] "GET /haha/ HTTP/1.0" 200 32 "-" "curl/7.29.0"
192.168.75.131 - - [04/Jul/2021:17:57:48 +0800] "GET //hehe/ HTTP/1.0" 404 154 "-" "curl/7.29.0"
192.168.75.131 - - [04/Jul/2021:17:59:46 +0800] "GET //hehe/ HTTP/1.0" 200 32 "-" "curl/7.29.0"
192.168.75.131 - - [04/Jul/2021:18:01:45 +0800] "GET //hehe/ HTTP/1.0" 200 32 "-" "curl/7.29.0"
192.168.75.131 - - [04/Jul/2021:18:09:48 +0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0"
[root@node2-132 ~]# 


#这里修改一下代理服务器的配置文件
[root@node1 ~]# vim /data/nginx/conf/www.liangjiwei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
        location /  {
                proxy_pass http://192.168.75.132;
                proxy_set_header Host $host;			#请求的主机信息
                proxy_set_header X-Real-IP $remote_addr;    #真实IP            
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	#转发功能
                }
}
	#重载配置文件
[root@node1 ~]# nginx -s reload


#后端服务器需要开启日志功能
[root@node2-132 ~]# vim /usr/local/nginx/conf/nginx.conf
	#在日志功能那里添加一个$http_x_real_ip的变量
....
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$http_x_real_ip"';

    access_log  logs/access.log  main;
	#重载配置文件
[root@node2-132 ~]# nginx -s reload


#然后访问查看--->依然是用130做客户端访问
[root@node-130 ~]# curl www.liangjiawei.net
这是132的服务器
	#再看后端服务器的日志
[root@node2-132 ~]# tail -5 /usr/local/nginx/logs/access.log 
192.168.75.131 - - [04/Jul/2021:17:57:48 +0800] "GET //hehe/ HTTP/1.0" 404 154 "-" "curl/7.29.0"
192.168.75.131 - - [04/Jul/2021:17:59:46 +0800] "GET //hehe/ HTTP/1.0" 200 32 "-" "curl/7.29.0"
192.168.75.131 - - [04/Jul/2021:18:01:45 +0800] "GET //hehe/ HTTP/1.0" 200 32 "-" "curl/7.29.0"
192.168.75.131 - - [04/Jul/2021:18:09:48 +0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0"
192.168.75.131 - - [04/Jul/2021:18:17:21 +0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0" "192.168.75.130" "192.168.75.130"

缓存代理服务器讲解

简单理解:

  • 代理服务器还可以使用缓存功能,比如说疫情的时候,很多人查询结果,如果变化不大,但是直接就使用缓存来给与结果,减少应用服务器(后端服务器)上的资源开销,如果多个客户查询同一样的资源,代理服务器命中后,对后端服务器只会进行一次的资源调度;
  • 浏览器也是存在缓存配置,把请求目标的内容会放在浏览器本地;

实验:

后端服务器是130;

代理服务器是131;

后端服务器配置:

#修改配置文件
[root@node1 nginx]# vim conf/nginx.conf
...............

        proxy_cache_path /data/nginx/cache  max_size=10g levels=1:2 keys_zone=nginx_cache:10m 
inactive=10m use_temp_path=off;
        upstream nginx {
                server 192.168.75.130;
                }
    server {
        listen       80;
        server_name  localhost;
        #这里添加proxy的内容
        location / {
            root   html;
            index  index.html index.htm;
                proxy_pass http://192.168.75.130;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_cache nginx_cache;
                proxy_cache_key $host$uri$is_args$args;
                proxy_cache_valid 200 304 302 1d;
        }

#参数解释:
/data/nginx/cache #缓存资源存放路径
levels #设置缓存资源的递归级别,
	默认为 levels=1:2,表示Nginx为将要缓存的资源生成的key从后依次设置两级保 存。
key_zone #在共享内存中设置一块存储区域来存放缓存的key和 metadata,这样nginx可以快速判断一个request是否命中或者未命中缓存, 1m可以存储8000个key,10m可以存储80000个key 
max_size #最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除不活跃的cache文件 
inactive #未被访问文件在缓存中保留时间,本配置中如果60分钟 未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默 认是10分钟。
需要注意的是,inactive和expired配置项的含义是不同的, expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问 的缓存文件 
use_temp_path #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件 在不同文件系统中不必要的拷贝 
proxy_cache #启用proxy cache,并指定key_zone。如果 proxy_cache off表示关闭掉缓存。


版权声明:本文为Liang_GaRy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。