Nginx反向代理

2023-11-10

Nginx反向代理

一、何为Nginx及其作用

Web服务器

在这里插入图片描述

Web服务器是一种软件或计算机程序,用于接收来自客户端的HTTP请求,并提供相应的HTTP响应。它的主要功能是处理和传输Web内容,以便用户可以通过互联网访问和浏览网站。

Web服务器通过网络接口(如网络端口)监听客户端发起的HTTP请求,并将请求转发给相应的处理程序(如应用程序、脚本或静态文件),以生成并返回相应的HTTP响应。它可以响应多种类型的HTTP请求,包括GET、POST、PUT、DELETE等。

Web服务器通常提供以下功能:

  1. 静态文件服务:Web服务器可以直接提供静态文件,如HTML、CSS、JavaScript、图像和其他媒体文件,以便客户端可以通过URL访问和获取这些文件。
  2. 动态内容生成:Web服务器可以将请求转发给应用程序或脚本,以生成动态内容,并将生成的结果作为HTTP响应返回给客户端。这使得网站可以动态生成和呈现内容,如动态页面、数据库查询结果等。
  3. 路由和重定向:Web服务器可以根据请求的URL路径将请求路由到不同的处理程序或处理路径。它还可以执行重定向操作,将请求重定向到另一个URL或位置。
  4. 安全性和身份验证:Web服务器通常提供安全性功能,如SSL/TLS加密通信、数字证书支持和基本的身份验证机制,以保护网站和客户端之间的通信安全。
  5. 缓存和性能优化:Web服务器可以缓存静态内容或动态内容的响应,以减轻后端服务器的负载并提高性能。它还可以实现各种性能优化技术,如压缩、缓存控制和CDN集成。

常见的Web服务器软件包括Apache HTTP Server、Nginx、Microsoft IIS、LiteSpeed等。它们在功能、配置和性能等方面可能有所不同,但都提供了处理和传输Web内容所需的基本功能。

反向代理服务器

反向代理服务器是一种位于服务器端的代理服务器,它接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器返回的响应发送回客户端。客户端并不直接与后端服务器通信,而是与反向代理服务器建立连接。

具体来说,反向代理服务器的工作流程如下:

  1. 客户端向反向代理服务器发送请求,例如请求访问一个网站。
  2. 反向代理服务器接收到请求后,根据一定的负载均衡算法选择一个后端服务器处理该请求。这里的负载均衡算法可以是轮询、随机选择、基于性能指标的选择等。
  3. 反向代理服务器将客户端的请求转发给选中的后端服务器。
  4. 后端服务器处理请求并生成响应。
  5. 反向代理服务器将后端服务器返回的响应发送回客户端。

假设有一个班级里有多个同学和多位科任老师,还有一个班长。班级里的同学需要向科任老师提问问题,但并不知道科任老师们的详细联系方式。于是,他们将问题提交给班长,班长根据一定的策略选择一个合适的科任老师来回答问题,并将答案传递回给同学。

在这个例子中,班长就是反向代理服务器,同学是客户端,科任老师是后端服务器。班长接收同学的问题,并根据一定的选择策略(类似于负载均衡算法)选择一个合适的科任老师来回答问题,同学并不直接与科任老师联系,而是通过班长作为中间人来进行交互。这样做的好处是,同学不需要知道每位科任老师的联系方式,而且科任老师的联系方式和身份得到了保护。同样地,反向代理服务器隐藏了后端服务器的真实IP地址和细节,增加了安全性和保护了后端服务器。

Nginx作用

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

  1. Web服务器:Nginx可以作为静态文件服务器,能够快速、高效地处理和传输静态文件,如HTML、CSS、JavaScript、图像等。它支持高并发的请求处理和静态内容的快速传输,有助于提高网站的性能和响应速度。
  2. 反向代理服务器:Nginx可以作为反向代理服务器,接收客户端请求,并将请求转发给后端的应用服务器。它可以实现负载均衡、请求分发和缓存等功能,将客户端的请求合理分配给后端的多个服务器,提高系统的可扩展性和稳定性。
  3. 负载均衡:Nginx可以通过负载均衡算法将客户端请求分发给多个应用服务器,实现请求的平衡分布,避免某个服务器过载,提高系统的性能和可靠性。
  4. 反向代理缓存:Nginx可以缓存服务器的响应,减少对后端服务器的请求,提高系统的响应速度和吞吐量。它可以根据请求的URL和响应的头部信息来缓存响应,提供快速的静态内容访问。
  5. 安全性增强:Nginx可以作为安全层,提供对Web应用程序的保护。它支持SSL/TLS协议,能够提供安全的HTTPS连接。此外,Nginx还支持访问控制、反向代理访问认证、DDoS防护等安全功能,提高系统的安全性。

二、Nginx设置示例

1. nginx.conf设置文件构成

(1) events 块:这个块用于定义与事件处理相关的参数,如工作进程的数量和连接的处理方式。示例如下:

events {
worker_connections 1024; // 每个工作进程的最大连接数
use epoll; // 使用 epoll 事件驱动机制
	}

(2) http 块:这个块包含了 HTTP 相关的配置指令,用于定义 HTTP 服务器的行为。在这个块中可以定义全局的配置以及具体的 server 块。示例如下:

http {
    # 定义全局的配置,例如日志记录、MIME 类型映射等

    server {
        # 定义具体的 server 配置,包括监听端口、域名、请求处理等
        listen 80; // 监听端口 80
        server_name example.com; // 域名

        location / {
            # 处理请求的具体逻辑
        }
    }

    server {
        # 可以定义多个 server 块,用于支持多个虚拟主机或反向代理配置等
        # ...
    }
}

2. 具体示例

(1)只有一个服务器

http {
    server {
        listen 80; # Nginx 监听的端口,可以是80或者其他可用端口

        location / {
            proxy_pass http://127.0.0.1:8080; # 将请求转发给 Tomcat 服务器
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

在上述配置中,Nginx 监听在本地的 80 端口,同时配置了一个 location 块,用于处理客户端对 Nginx 服务器的请求。/代表所有以http://127.0.0.1:8080为根地址的指令全都经过Nginx服务器代理,proxy_pass 指令中,我们将请求转发给本地的 Tomcat 服务器地址和端口(127.0.0.1:8080)。proxy_set_header 指令用于设置代理请求头,以便将原始客户端的 IP 地址传递给后端的 Tomcat 或者Flask等服务器。以VUE项目为例,原本其使用命令行npm run dev使得项目运行在8080端口,此时如果你想在前端访问8080端口下的项目,就需要输入localhost:8080,但是使用了上述代理之后只需要输入localhost或者localhost:80就好(因为默认端口就是80)。

(2)一个server多个服务器

server {
        listen 80; # Nginx 监听的端口,可以是80或者其他可用端口

        location /app1/ {
            proxy_pass http://backend_servers1; # 将请求转发给 backend_servers1 组
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /app2/ {
            proxy_pass http://backend_servers2; # 将请求转发给 backend_servers2 组
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

server 块中,我们通过 location 块为不同的 URI 路径配置反向代理。例如,当客户端请求 /app1/ 路径时,Nginx 会将请求转发给 backend_servers1 组中的后端服务器;当客户端请求 /app2/ 路径时,Nginx 会将请求转发给 backend_servers2 组中的后端服务器。这样,Nginx 可以同时反向代理多个后端服务器,实现负载均衡和请求的均衡分布。这里的**backend_servers1**可以类似示例(1)中设置为http://127.0.0.1:8080

(3)VUE项目实战

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        # 打包好的VUE项目,放于dist文件夹
        root html/dist;
        index  index.html index.htm;
        
        location /api/web1 {
			  rewrite ^.+api/web1/?(.*)$ /$1 break;
			  # 后端的真实接口
			  proxy_pass http://127.0.0.1:8083;
			  proxy_redirect off;
			  proxy_set_header Host $host;
			  proxy_set_header X-Real-IP $remote_addr;
			  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			  proxy_set_header   Cookie $http_cookie;
			  # proxy_redirect off;
			  proxy_set_header X-NginX-Proxy true;
			  # 加大请求缓存
			  proxy_buffer_size  128k;
			  proxy_buffers   32 32k;
			  proxy_busy_buffers_size 128k;
		}
		
      location /api/web2 {
			  rewrite ^.+api/web2/?(.*)$ /$1 break;
			  # 后端的真实接口
			  proxy_pass http://127.0.0.1:8082;
			  proxy_redirect off;
			  proxy_set_header Host $host;
			  proxy_set_header X-Real-IP $remote_addr;
			  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			  proxy_set_header   Cookie $http_cookie;
			  proxy_set_header X-NginX-Proxy true;

			  # 加大请求缓存
			  proxy_buffer_size  128k;
			  proxy_buffers   32 32k;
			  proxy_busy_buffers_size 128k;
		}
}

以VUE项目为例,需要先将项目打包,打包教程按照(48条消息) 使用Nginx部署Vue项目超详细图文教程!含踩坑步骤!_nginx vue_Hi丶ImViper的博客-CSDN博客链接教程为例。

server { ... }: 定义一个服务器块,用于处理具体的请求。

  • listen 80;: 监听端口 80,该服务器块将处理来自客户端的请求。
  • server_name localhost;: 定义服务器的名称为 localhost
  • root html/dist;: 指定根目录为 html/dist,即将静态文件(例如打包好的 VUE 项目)放置于该目录。
  • index index.html index.htm;: 指定默认的索引文件为 index.htmlindex.htm
  • location /api/web1 { ... }: 配置反向代理位置,当客户端请求路径以 /api/web1 开头时,将请求转发到 http://127.0.0.1:8083,并设置一些代理相关的头部信息。
  • location /api/web2 { ... }: 同理,配置另一个反向代理位置,将请求转发到 http://127.0.0.1:8082

在具体的配置中,rewrite 指令用于重写请求的 URL,去除 /api/web1/api/web2 的前缀部分。然后使用 proxy_pass 指令将请求转发给相应的后端服务器。其他的 proxy_set_header 指令用于设置代理请求头,以便将客户端的 IP 地址等信息传递给后端服务器。

(4) 可能出现的BUG

location / {
		  # 此处的 @router 实际上是引用下面的转发,否则在 Vue 路由刷新时可能会抛出 404
		  try_files $uri $uri/ @router;
		  # 请求指向的首页
		  index index.html;
		}
location @router {
		   rewrite ^.*$ /index.html last;
		 }

一般使用Webpack进行前端项目封装的时候,就算输入一个错误的域名,例如下列的localhost:8080/cv(原本应该是cvparameter),仍会出现空白的html页面,而不会报错。但是当我们使用Nginx进行反向代理的时候,可能会出现**erro 500或者404**,这时候就需要检查nginx.conf是否有以上代码。

上述配置的作用是,在单页应用中,当用户访问根路径 / 时,Nginx 会尝试查找与请求路径相匹配的文件或目录,如果找不到则将请求转发到 @router 块。@router 块对所有的请求进行重写,将请求指向 index.html 文件,然后再交给 Vue 路由处理请求的资源。

这样做的目的是解决在 Vue 路由刷新时可能出现的 404 错误,因为在单页应用中,所有的路由资源实际上都是由 index.html 文件和 Vue 路由动态生成的。通过配置 Nginx 将请求重写到 index.html 文件,确保 Vue 路由能够正确处理这些请求,从而避免 404 错误的出现。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx反向代理 的相关文章

随机推荐

  • errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint

    微信access token 在一个地方获取了 同一个公众号其它地方获取的access token 都会失效 就会出现标题中的错误 这个原因可能大家都知道 但是排除的时候可能不好排除 我找了一上午在系统里面 都没有找到 因为自己负责的系统全
  • ReactNative入门(二)——导航和路由

    React Navigation官方文档 https reactnavigation org docs getting started 安装react navigation npm install react navigation nati
  • 临时变量生命期

    有关临时对象的生命周期有三种情况 一般情况 临时性对象的被摧毁 应该是对完整表达式 full expression 求值过程中的最后一个步骤 该完整表达式造成临时对象的产生 以及两个特殊情况 凡含有表达式执行结果的临时性对象 应该存留到ob
  • 网络安全与网站安全及计算机安全:如何使用Kali Linux的Rarcrack获取RAR压缩文件加密密码?

    知识点详解 1 1 Rarcrack是一款获取压缩文件密吗的软件 但是仅支持zip rar和7z三种类型 1 2 在kali操作系统中是没有此工具的 所以就必须先安装才能使用 1 3 安装Rarcrack的指令 apt install ra
  • 测试博客

    在这里插入代码片 TOC Markdown编辑器的使用 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何使用Markdown编辑器 可以仔细阅读这篇文章 了解一下Markdown的基本语法知识 新的改变 我们
  • 【备忘】清理Office缓存

    背景 电脑安装了M365 Apps for enterprise的客户端 遇到不常见的奇怪问题 尝试看清理缓存是否可以解决 清理步骤 1 关闭所有Office365 应用 2 搜索 AppData 并打开该文件夹 3 进到 AppData
  • java开发Demo~×××扫码支付,java开发示例

    开发所需工具类 开发所需jar 具体的代码不贴了 说明下PayConfigUtil中的参数 APP ID和APP SECRET在公众平台 MCH ID和API KEY在商户平台 其中API KEY是自己设置的 并不是自动生成的 Contro
  • element-variables

    Element Chalk Variables Transition all transition all 3s cubic bezier 645 045 355 1 default fade transition opacity 300m
  • Linux——进程退出

    目录 一 进程退出时有三种选择 1 1 echo 命令 功能 打印距离现在最近一次执行某进程的退出码 例2代码 例3 例4代码 1 3 进程运行过程中可能会出现的错误种类 二 总结 一 进程退出时有三种选择 1 使用return 语句 2
  • Python常见的开发工具合集对比

    Python是一种功能强大且易于学习的编程语言 被广泛应用于数据科学 机器学习 Web开发等领域 随着Python在各个领域的应用越来越广泛 越来越多的Python开发工具也涌现出来 但是 对于新手来说 选择一款合适的Python开发工具可
  • 反向电压极性保护电路

    反向电压极性保护电路 原文地址点击这里 电压反接保护 Reverse Voltage Protect RVP 电路主要用在需要直流电压供电电源的输入端 用于防止输入电压极性反接而造成电路系统元器件的损坏 甚至事故 大多数电路系统都需要极性正
  • Xcode8不能在iOS7上调试,Could not find Developer Disk Image的解决方法

    升级完Xcode8之后 默认情况下 是无法进行iOS7的调试的 因为Xcode8里面不再游iOS7的镜像文件 所以会提示 Could not find Developer Disk Image 解决方法如下 打开finder 应用程序 Xc
  • $.ajax()常用参数,JQuery中$.ajax()方法参数详解

    url 要求为String类型的参数 默认为当前页地址 发送请求的地址 type 要求为String类型的参数 请求方式 post或get 默认为get 注意其他http请求方法 例如put和 delete也可以使用 但仅部分浏览器支持 t
  • 1003 Emergency (25分) PAT 甲级

    1003 Emergency 25分 As an emergency rescue team leader of a city you are given a special map of your country The map show
  • UnityAPI:AndroidJavaClass和AndroidJavaObject

    AndroidJavaClass 和 AndroidJavaObject的区别 AndroidJavaClass 构造函数 当Java类构造函数无参数时使用 AndroidJavaObject 构造函数有多个重载 当Java类构造函数有参数
  • 系统端口详解

    Mon Dec 20 05 40 51 2004 UTC This services files is an attempt at collating the various port numbers lists that I ve enc
  • 【整理六】

    1 props和state相同点和不同点 render方法在哪些情况下会执行 props是一个从外部传进组件的参数 由于React具有单向数据流的特性 所以他的主要作用是从父组件向子组件中传递数据 它是不可改变的 如果想要改变它 只能通过外
  • windwos自带端口转发功能

    端口转发配置 netsh interface portproxy add v4tov4 listenport 1526 listenaddress 192 168 10 100 connectport 1522 connectaddress
  • C++基础学习-31成员函数模板,模板显式实例化与声明

    目录 一 普通类的成员函数模板 二 类模板的成员函数模板 三 模板显式实例化与声明 一 普通类的成员函数模板 不管是普通类还是类模板 它的成员函数都可以是个函数模板 成为 成员函数模板 不可以是虚函数 否则编译器会报错 class A pu
  • Nginx反向代理

    Nginx反向代理 一 何为Nginx及其作用 Web服务器 Web服务器是一种软件或计算机程序 用于接收来自客户端的HTTP请求 并提供相应的HTTP响应 它的主要功能是处理和传输Web内容 以便用户可以通过互联网访问和浏览网站 Web服