全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。

news2025/1/8 12:48:46

文章目录

  • 1. 文章引言
  • 2. 何谓反向代理
  • 3. 解析nginx的配置文件
    • 3.1 全局块(global block)
    • 3.2 events块(events block)
    • 3.3 http块(http block)
  • 4. 如何配置反向代理
    • 4.1 反向代理示例1
    • 4.2 反向代理示例2
  • 5. 补充说明
    • 5.1 location指令说明
    • 5.2 nginx完整配置文件

1. 文章引言


如果你的服务器还未安装nginx,你可以参考网上的资料来安装它。

我们都知道,nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用,如下图所示:

在这里插入图片描述

接下来,我便重点介绍nginx的反向代理,但在介绍前,我们先了解nginx的正向代理。

什么是nginx的正向代理呢?

如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,如下图所示:

在这里插入图片描述

我们在日常工作中,常用到正向代理,比如你使用单位的局域网去访问互联网。

正向代理容易理解,那么,反向代理是什么呢,我接下来便详细介绍。

2. 何谓反向代理


我们经常访问百度服务器,直接地址栏中输入www.baidu.com即可,百度后端有若干台服务器来支持用户的搜索,如下图所示:

在这里插入图片描述

但用户不关心访问的是哪台服务器,用户关心的是只要能搜到数据就行,这就是我们常说的反向代理。

客户端对反向代理是无感知的,因为客户端不需要任何配置就可以访问。

我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端。

此时,反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP地址。

正向代理和反向代理的区别如下:

  1. 如果我们客户端自己用,就是正向代理。

  2. 如果是在服务器用,用户无感知,就是反向代理。

3. 解析nginx的配置文件


俗话说,预先善其事,必先利其器。

因而,在学习nginx之前,要熟知它的配置文件。

毕竟,如下需要做的所有配置(反向代理、负载均衡、动静分离等),都是基于它的配置文件。

nginx的默认配置文件是在安装目录的conf目录下,后续对nginx的使用基本上都是基于此配置文件进行修改。

完整的配置文件,可以看下文章的最后。

修改过nginx.conf配置文件,记得要重启nginx服务。

配置文件使用#来注释内容,去掉部分以#开头的段落,可以看到如下精简后的配置文件内容:

# 主进程叫master,负责管理子进程,子进程叫worker
# worker_processes配置项表示开启几个业务进程,一般和cpu核数有关
worker_processes  1;

events {
    worker_connections  1024;
}

http {
	# include表示可以引入其他文件,此处表示引入http mime类型
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

	# 虚拟主机,可以配置多个
    server {
        listen       80;
        server_name  localhost;

        location / {
        	# 路径匹配之后,哪个目录下去匹配相应的网页,html是相对路径
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
	}

【注意】:其实注释掉的地方,都是某些功能的示例代码,若使用则取消注释即可。

去掉注释信息后,可将nginx.conf配置文件分为如下三部分:

  1. 第一部分:全局块

  2. 第二部分:events

  3. 第三部分:http

当然,我会详细介绍第三部分的http快。

3.1 全局块(global block)

从配置文件开始到events块之间的内容便是全局块,它主要会设置一些影响Nginx服务器整体运行的配置指令。

比如,开启几个业务进程的worker_processes,如下代码所示:

 worker_processes  1;

worker_processesnginx服务器并发处理服务的关键配置,该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的约束。

当然,除了worker_processes的配置,全局块还有几个主要的配置:

  1. 配置运行nginx服务器的用户(组)

  2. 进程pid存放路径

  3. 日志存放路径和类型以及配置文件的引入等。

3.2 events块(events block)

events块涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置如下:

  1. 是否开启对多work process下的网络连接进行序列化。

  2. 是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每work process可以同时支持的最大连接数等。

events {
	worker_connections  1024;
}

此示例就表示每个work process支持的最大连接数为1024

这部分的配置对nginx的性能影响较大,在实际中应该灵活配置。

3.3 http块(http block)

这部分是nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,如下所示:

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

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
    }
}

需要注意的是:http块也可以包括http全局块、server块,如下的反向代理、动静分离、负载均衡都是在这部分中配置。

  1. http全局块:http全局块配置的指令如下

    • 文件引入

    • MIME-TYPE定义

    • 日志自定义

    • 连接超时时间

    • 单链接请求数上限等。

  2. server块:这块和虚拟主机有密切关系,从用户角度看,虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。

当然,每个server块又分为全局server块,以及可同时包含多个的locaton块

  1. 全局server块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。

  1. location块

一个server块可以配置多个location块。

这块的主要作用是:

  • 基于nginx服务器接收到的请求字符串(例如server_name/uri-string

  • 对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的/uri-string)进行匹配

  • 对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,

  • 还有许多第三方模块的配置也在这里进行,如下所示:

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

    server {
        listen       80;
        server_name  localhost;

        # 若请求路径像这样:www.xxxx/img/example.png
        # 则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件
        location /img/ {
            root /var/www/image;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
    }
}

4. 如何配置反向代理


通过以下两种示例的配置,来演示如何配置反向代理。

4.1 反向代理示例1

实现效果:使用nginx反向代理,访问www.superjson.com直接跳转到127.0.0.1:8081

【注意】:此处如果要想从www.superjson.com跳转到本机指定的ip,需要修改本机的hosts文件。

如何修改本机hosts,可以参考网上教程。

配置代码如下所示:

server {
	listen       80;
	server_name  192.168.20.102;

	location / {
		root   html;
		index  index.html index.htm;
		proxy_pass  http://127.0.0.1:8081
	}
}

如上配置,nginx监听80端口,访问域名为www.superjson.com(不加端口号时,默认为80端口),故访问该域名时会跳转到127.0.0.1:8081路径上。

此处的意为:nginx反向代理服务监听192.168.20.10280端口,如果有请求过来,则转到proxy_pass配置的对应服务器上,仅此而已。

location下,同时配置rootproxy_pass选项时,两个选项只会二选一执行。

此处不能配置https反向代理。

在浏览器的地址栏中输入http://www.superjson.com/,则访问到http://127.0.0.1:8081,如下图所示:

在这里插入图片描述

4.2 反向代理示例2

实现效果:使用Nginx反向代理,根据访问的路径,跳转到不同端口的服务中,nginx监听端口为 8011

  • 访问http://192.168.20.102/edu/直接跳转到 127.0.0.1:8082

  • 访问http://192.168.20.102/test/直接跳转到127.0.0.1:8083

  1. 首先准备两个tomcat,一个8082端口,一个8083端口,且准备好测试的页面。

  2. 修改nginx的配置文件,在http块中配置server,如下所示:

server {
	listen       8011;
	server_name  192.168.20.102;

	location ~ /edu/ {
		proxy_pass  http://127.0.0.1:8082
	}

	location ~ /test/ {
		proxy_pass  http://127.0.0.1:8083
	}
}

如上配置,当请求到达nginx反向代理服务器时,会根据请求路径不同进行分发到不同的服务上。

5. 补充说明

5.1 location指令说明

该指令用于匹配URL, 语法如下:

location [ = | ~ | ~* | ^~] uri {

}
  1. = :用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求

  2. ~:用于表示uri包含正则表达式,并且区分大小写

  3. ~*:用于表示uri包含正则表达式,并且不区分大小写

  4. ^~:用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求。字符串匹配度最高的 location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。

【注意】:如果uri包含正则表达式,则必须要有~或者~*标识

5.2 nginx完整配置文件

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚合效度全流程

聚合效度分析流程如下: 一、聚合效度定义 聚合效度(convergent validity),又称收敛效度,是指测量同一变量的测量项会落在同一因子上,强调本应该在同一因子下的测量项,确实在同一因子下。即一个…

基于nodejs+vue地方特色的风景文化宣传网站vscode

管理员可以根据系统给定的账号进行登录,登录后可以进入木里风景文化管理平台对木里风景文化所有模块进行管理。包括查看和修改自己的个人信息以及登录密码。 该系统为每一个用户都分配了一个用户账号,用户通过账号的登录可以在系统中查看木里风景文化信息…

怎么依靠网络赚钱,网上可以做什么副业

如今,网上赚钱已经成为许多人职业生涯的选择之一。网上有很多可靠的兼职,让你在家里轻松赚钱。今天给大家推荐五份可靠的网上兼职。一、怎样选择可靠的网络兼职可靠的网络兼职一般是指在家通过网络平台完成兼职任务,完成任务后即可获得报酬。…

JVM中TLAB(Thread Local Allocation Buffer)+逃逸分析

1、为什么有TLAB(Thread Local Allocation Buffer)堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地…

java地图导出——添加经纬线

概述 前面的文章Node实现切片的拼接和地图的导出和Java实现地图的导出分别讲述可如何在node和java中实现切片的拼接以及地图的导出。本文,书接前文,实现java导出时经纬度的添加。 实现后效果 实现 完整的实现思路流程如下图: 1. 根据切片…

什么是Makefile?如何编写Makefile?

🥇今日学习目标:什么是Makefile?如何编写Makefile? 🤵‍♂️ 创作者:JamesBin ⏰预计时间:10分钟 🎉个人主页:嵌入式悦翔园个人主页 🍁专栏介绍:L…

RabbitMQ实现死信队列

目录死信队列是什么怎样实现一个死信队列说明实现过程导入依赖添加配置编写mq配置类添加业务队列的消费者添加死信队列的消费者添加消息发送者添加消息测试类测试死信队列的应用场景总结死信队列是什么 “死信”是RabbitMQ中的一种消息机制,当你在消费消息时&#…

单调栈(C/C++)

目录 1. 单调栈的定义 2. 单调栈的常见用途 3. 案例分析 3.1 暴力解法 3.2 单调栈 4. 单调栈总结 1. 单调栈的定义 单调栈顾名思义,就是栈内的元素是单调的。根据栈内元素的单调性的不同,可以分为: 单调递增栈:栈内元素是单…

LeetCode 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

为什么前序和中序或者中序和后序,两两组合能构建一个二叉树? 因为前序和后序可以确定根,而中序可以划分出左右区间。 文章目录从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树从前序与中序遍历序列构造二叉树 难度 中等 题目链…

基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文

1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统,通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括:首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …

TS泛型,原来就这?

一、泛型是什么?有什么作用? 当我们定义一个变量不确定类型的时候有两种解决方式: 使用any 使用any定义时存在的问题:虽然知道传入值的类型但是无法获取函数返回值的类型;另外也失去了ts类型保护的优势 使用泛型 泛型…

记一次线上es慢查询导致的服务不可用

现象 某日线上业务同学反馈订单列表查询页面一直loding,然后提示请求超时,几分钟之后恢复正常 接到报障之后,马上根据接口URL,定位到了请求链路,发现是es查询超时,这里我们的业务订单表数据是由几百万的&a…

【数据结构】时间复杂度和空间复杂度以及相关OJ题的详解分析

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯长路漫漫浩浩,万事皆有期待 文章目录1.算法效率1.1 如何衡…

独家 | Gen-1——可以改变视频风格的AI模型

翻译:吴振东校对:张睿毅本文约1000字,建议阅读3分钟 本文简单介绍了Runway公司的发展史,以及他们新推出的生成式AI模型Gen-1,可用于通过应用文本提示或者参考图像所指定的任意风格,将现有视频转换为新视频。…

php mysql高校教材管理系统

我的目标就是在于开发一个功能实用、操作方便,简单明了的管理系统;其能够录入教师个人的信息,教导主任信息,在操作上能够完成诸如添加、修改、删除、按各种条件进行查询、等方面的工作,基本满足学校的日常业务的需求. …

System V|共享内存基本通信框架搭建|【超详细的代码解释和注释】

前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支…

string和自动推断类型

欢迎来观看温柔了岁月.c的博客目前设有C学习专栏C语言项目专栏数据结构与算法专栏目前主要更新C学习专栏,C语言项目专栏不定时更新待C专栏完毕,会陆续更新C项目专栏和数据结构与算法专栏一周主要三更,星期三,星期五,星…

【项目管理】项目进度管理中的逻辑关系

项目的进度管理是项目核心管理之一,通过合理的进度安排,制定出科学可行的分项工期表,并条理清晰的显示出项目进度之间的逻辑关系。 1、目标是计划的灵魂 进度计划必须按照确定的项目总进度要求进行编制,了解项目总目标和整体安…

网络安全——数据链路层安全协议(2)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.局域网数据链路层安全协议 1.IEEE 802.10 (1)IEE…

JavaWeb HTTP和Maven

4、Http 4.1、什么是HTTP HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。 文本:html,字符串,~ ….超文本:图片,音乐,视频,定位&am…