nginx 简单实践:正向代理、反向代理【nginx 实践系列之二】

〇、前言

本文为 nginx 简单实践系列文章之二,主要简单实践了两个内容:正向代理、反向代理,仅供参考。

关于 Nginx 基础,以及安装和配置详解,可以参考博主过往文章:

https://www.cnblogs.com/hnzhengfy/p/Nginx.html

注意:可以使用测试域名,但前提是要修改 hosts 文件。

路径和重启:Linux(/etc/hosts)(重启命令:/etc/init.d/network restart);Windows(C:\Windows\System32\drivers\etc\hosts)。

例如:192.168.1.1 www.testczzj.com

一、正向代理

1.1 正向代理简介

正向代理主要是为了客户端服务,位于客户端和目标服务器之间。

当客户端(如 Web 浏览器或移动应用程序)需要访问互联网上的资源时,它会向正向代理发送一个请求,并指定目标服务器。然后,正向代理会代替客户端向目标服务器转发这个请求。一旦目标服务器处理了请求并生成了响应,正向代理会将这个响应返回给客户端。

主要用途:

  • 正向代理常用于在防火墙内的局域网客户端提供访问 Internet 的途径。例如,公司内部网络,通过一个或多个代理服务器访问互联网资源 ,以节省带宽、提高访问速度或进行内容过滤
  • 正向代理可以用于提高网络性能,例如通过缓存经常访问的内容来减少带宽使用量。
  • 正向代理还可以隐藏客户端的真实身份,客户端主动使用代理服务器,服务端不知道实际发起请求的客户端,使客户端能够访问一些原本无法直接访问的资源,如Google、YouTube等。

1.2 正向代理的示例

Nginx 默认情况下是作为反向代理服务器使用的。为了让其充当正向代理,需要通过配置文件进行修改。

配置文件的路径:/usr/local/nginx/conf/nginx.conf。配置内容如下:

复制代码
server {
    listen 8888;
    resolver 8.8.8.8 ipv6=off;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
            proxy_pass $scheme://$host;
            proxy_set_header Host $host;
            allow all;

            #if ($request_method = "CONNECT") {
            #        proxy_pass https://$host;
            #}

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_connect_timeout 60;
            proxy_send_timeout 60;
            proxy_read_timeout 60;
    }
}

如下示例,通过正向代理方式,访问百度首页:

复制代码
[root@www ~]# curl -x http://www.testczzj.com:8888 http://www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
[root@www ~]# curl -x https://www.testczzj.com:8888 https://www.baidu.com
curl: (56) Received HTTP code 400 from proxy after CONNECT
[root@www ~]# 

注意,百度首页的协议为 https 时,会返回 400 错误,此问题尚未解决,有哪位大佬知道烦请指教,再做补充。

参考:https://blog.csdn.net/qq_42978535/article/details/142653929

https://blog.csdn.net/weixin_43334761/article/details/135863106

二、反向代理

2.1 反向代理简介

  • 位于服务器端和客户端之间,主要用于服务器端的负载均衡、缓存静态内容、加密和SSL加速、安全防护等。
  • 服务器主动使用代理服务器,客户端不知道实际提供服务的服务端
  • 常用于网站后端,将客户端的请求转发到内部服务器,然后将响应返回给客户端,对外表现为统一的服务地址

当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理"代理"的是服务器端,而且这一个过程对于客户端而言是无感的。

反向代理广泛应用于网站托管、大型分布式系统以及需要高效管理网络流量的各种场景中。

2.2 反向代理示例一:加载新地址的页面,但 url 不进行跳转

例如,将 http://www.testczzj.com:8888 的请求转发至示例地址 http://www.testczzj.com:5000

先准备一个示例项目:

注:通过dotnet new mvcdotnet run,运行一个示例网站,配置为:"applicationUrl": "https://www.testczzj.com:5001;http://www.testczzj.com:5000"。(另外,代码行app.UseHttpsRedirection();需注释掉,否则 url 会自动重写到 https)

下面是 nginx 的配置详情:

复制代码
server {
    listen 8888;
    server_name www.testczzj.com;

    #charset utf-8;
    #charset koi8-r;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
            root /usr/tmp/dotnet_project_test;
            index index.html index.htm test_page.html;
            proxy_pass http://www.testczzj.com:5000;
    }
}

如下图,自动加载页面 http://www.testczzj.com:5000 的内容,同时 url 未跳转:

2.3 反向代理示例二:根据路径访问不同的地址

例如,根据路径中的 user1、user2,将请求转发到不同的端口:

先准备两个示例项目:

nginx 配置示例:

复制代码
server {
    listen 8888;
    server_name www.testczzj.com;

    #charset utf-8;
    #charset koi8-r;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location /user1/ {
            rewrite ^/user1/(.*)$ /$1 break; # 通过重写,将路径中的 /user1/ 去掉
            proxy_pass http://www.testczzj.com:5000;
    }

    location  /user2/  {
            rewrite ^/user2/(.*)$ /$1 break; # 将路径中的 /user2/ 去掉
            proxy_pass http://www.testczzj.com:5003;
    }
}

效果如下:

参考:https://zhuanlan.zhihu.com/p/451825018

相关推荐
小蒜学长1 小时前
springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW)
java·spring boot·后端·智能手机
追逐时光者2 小时前
精选 4 款开源免费、美观实用的 MAUI UI 组件库,助力轻松构建美观且功能丰富的应用程序!
后端·.net
你的人类朋友3 小时前
【Docker】说说卷挂载与绑定挂载
后端·docker·容器
间彧3 小时前
在高并发场景下,如何平衡QPS和TPS的监控资源消耗?
后端
间彧3 小时前
QPS和TPS的区别,在实际项目中,如何准确测量和监控QPS和TPS?
后端
间彧4 小时前
消息队列(RocketMQ、RabbitMQ、Kafka、ActiveMQ)对比与选型指南
后端·消息队列
brzhang5 小时前
AI Agent 干不好活,不是它笨,告诉你一个残忍的现实,是你给他的工具太难用了
前端·后端·架构
brzhang5 小时前
一文说明白为什么现在 AI Agent 都把重点放在上下文工程(context engineering)上?
前端·后端·架构
Roye_ack5 小时前
【项目实战 Day9】springboot + vue 苍穹外卖系统(用户端订单模块 + 商家端订单管理模块 完结)
java·vue.js·spring boot·后端·mybatis
AAA修煤气灶刘哥7 小时前
面试必问的CAS和ConcurrentHashMap,你搞懂了吗?
后端·面试