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

相关推荐
头顶秃成一缕光44 分钟前
Springboot原理(面试高频)
spring boot·后端·面试
__淡墨青衫__1 小时前
Django操作指令大集合说明
后端·python·django
后端小肥肠1 小时前
FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案
java·开发语言·spring boot·后端·excel
brzhang2 小时前
麻了,Expo 出了一个 a0.dev,可以一句话生成一个 react native App,这下移动端客户端!卒!
前端·后端
计算机-秋大田3 小时前
基于Spring Boot+VUE的个人驾校预约管理系统设计与实现(LW+源码+)
java·vue.js·spring boot·后端·课程设计
Asthenia04123 小时前
HashMap深度解析:死环问题、源码设计与面试高频考点
后端
计算机-秋大田3 小时前
基于Spring Boot的网上宠物店系统设计与实现(LW+源码+讲解)
java·前端·spring boot·后端·课程设计
陈老师还在写代码5 小时前
讲解一下SpringBoot的RPC连接
spring boot·后端·rpc
码上飞扬5 小时前
云原生时代的后端开发:架构、工具与最佳实践
后端
昔我往昔5 小时前
Spring Boot部署到服务器
服务器·spring boot·后端