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,将请求转发到不同的端口:

  • 访问地址:http://www.testczzj.com:8888/user1/,转发至:http://www.testczzj.com:5000。
  • 访问地址:http://www.testczzj.com:8888/user2/,转发至:http://www.testczzj.com:5003。

先准备两个示例项目:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882621.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KubeSphere 和 K8s 高可用集群离线部署全攻略

本文首发:运维有术,作者术哥。 今天,我们将一起探索如何在离线环境中部署 K8s v1.30.6 和 KubeSphere v4.1.2 高可用集群。对于离线环境的镜像仓库管理,官方推荐使用 Harbor 作为镜像仓库管理工具,它为企业级用户提供了高效、安全的镜像存储方案。而在本指南中,我们将以 …

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-13- iframe操作-中篇(详细教程)

1.简介 按照计划今天就要用实际的例子进行iframe自动化测试。宏哥还是用之前找到的一个含有iframe的网页(QQ邮箱和163邮箱),别的邮箱宏哥就没有细看了,可能后期这两个邮箱页面优化升级,也就不能用了,但是现在还可以用。所以今天这一篇的主要内容就是用这两个网页的iframe…

炸裂:SpringAI内置DeepSeek啦!

好消息,Spring AI 最新快照版已经内置 DeepSeek 了,所以以后项目中对接 DeepSeek 就方便多了。但因为快照版会有很多 Bug,所以今天咱们就来看稳定版的 Spring AI 如何对接 DeepSeek 满血版。 SpringAI和DeepSeek介绍 Spring AI 是 Spring 生态系统中的一个重要项目,旨在将人…

openssl生成证书请求时报错:invalid extension string:v3_conf.c:140:name=subjectAltName,section=@alt_names

解决方法: 1. 使用自定义的openssl-ca.cnf openssl req -new -key client.key -out client.csr -subj "/C=cn/ST=nanjing/L=nanjing/O=zte/OU=zte/CN=localhost" -config ./openssl-ca.cnf2. 修改系统的/etc/pki/tls/openssl.cnf 注释掉[ v3_req ]段部分 # [ v3_req…

linux中文件操作相关命令和使用

linux中文件操作相关命令和使用 cat more/less head/tail vi/vim等相关命令 cat 1. 文件查看 cat 文件名 --全部内容显示 -- 好东西 可以用于配置文件查看过滤 cat 文件名 | grep 筛选内容 --内容筛选显示 2. 文件创建并输入初始化文本 -- 新建content.txt 文…

APIPark 新增 AI 大模型负载均衡,APIKey 资源池以及 AI Token 消耗统计等重磅功能!

开发者们好!APIPark V1.4 功能更新给大家带来「负载均衡」、「APIKey 资源池」以及「Token 消耗统计」等重要功能,看看是否能帮助到大家更好地使用 AI 大模型~ V1.4 版本说明新功能 [❤️新增] 新增支持 AI 模型负载均衡:同时接入多款大模型,当原定的 AI 服务商无法访问时,…

活动营销系统

一、整体架构图二、核心业务系统介绍 2.1.接入层统一异常处理逻辑2.2.邀请服务逻辑2.3.权益发放服务2.4.排行榜服务 2.4.1.榜单服务数据结构 数据结构分为两块:配置中心数据,因为排行榜没有后台配置平台,只能将配置数据放到配置中心,具备实时更改配置的能力 数据表,主要是排行榜…

004 条件渲染

1、v-ifv-if指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回true值的时候被渲染。<p v-if="flag">我是孙猴子</p>data(){return{flag:true}} 2、v-else你可以使用 v-else 指令来表示 v-if 的"else块"<p v-if="flag&quo…

Tinyfox 简易教程之:Hello World!

Tinyfox程序设计系列教程之入门篇一,什么是 Tinyfox: Tinyfox 是一款自带 HTTP 服务器的以 WebApi、WebSocket 及“动态HTML”为核心功能的超轻量级的独立性极强的高性能 Web 应用程序基础框架。 Tinyfox 简单易用,性能强劲,跨平台,既支持 Linux 也支持 Windows,既支持 x…

中电金信:更智能、更精准、更专业,中电金信AI产品全栈接入DeepSeek

短短两周的时间,AI届新星DeepSeek凭借低成本、高性能和开源策略,以“中国速度”席卷全网,逆袭成为全球用户量增速最快的AI模型。作为大模型领域的一匹黑马,DeepSeek为千行百业提供了AI解决方案的新选择。2025年开工首日,中电金信研究院便第一时间在产品平台、智能应用、智…

deepseek基础篇--本地知识库推理

一.Ollama 搜索安装 dmeta-embedding-zh https://ollama.com/shaw/dmeta-embedding-zh dmeta-embedding-zh 是一个仅含 4 亿参数的中文嵌入模型,适用于多种场景。它在 MTEB 基准测试中表现出色,尤其适合语义检索、RAG 和其他 LLM 应用。 安装成功 二、使用工具 Cherry Studi…

认识嵌入式开发需要的设备

认识嵌入式开发需要的设备开发板 Arduino用于快速原型设计和学习嵌入式系统基础树莓派用于学习Linux嵌入式系统和复杂应用开发STM32开发板用于学习ARM Cortex-M系列微控制器的开发ESP32开发板用于学习Wi-Fi和蓝牙等无线通信技术的开发GD32开发板调试工具 示波器观察电信号的波形…