入门Nginx反向代理服务器

article/2025/8/22 7:55:41

前言

博主最近学习了Nginx,故想通过撰写博客的方式加强对知识的认识和记忆,所涉及知识浅薄,如有错误,敬请指正


一.Nginx简介

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器;其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx配置文件


server {  # 当nginx接到请求后,会匹配其配置中的service模块# 匹配方法就是将请求携带的host和port去跟配置中的server_name和listen相匹配listen       8080;        server_name  localhost; # 定义当前虚拟主机(站点)匹配请求的主机名location / {root   html; #  文件根目录# 设定Nginx服务器返回的文档名index  index.html index.htm; # 先找根目录下的index.html,如果没有再找index.htm}
}
error_page 500 502 503 504 /50x.html; 报错编码对应页面
location = /50x.html {
root html;
}

server{ } 其实是包含在 http{ } 内部的。每一个 server{ } 是一个虚拟主机(站点)。

上面代码块的意思是:当一个请求叫做localhost:8080请求nginx服务器时,该请求就会被匹配进该代码块的 server{ } 中执行。

在一个server里可以有多个location,location的匹配规则如下:

前置测试访问域名:www.test.com/api/upload

1.location和proxy_pass都带/,则真实地址不带location匹配目录
访问地址:www.test.com/api/upload–>http://127.0.0.1:8080/upload

location /api/ {proxy_pass http://127.0.0.1:8080/;
}

2.location不带/,proxy_pass带/,则真实地址会带/
访问地址: www.test.com/api/upload–>http://127.0.0.1:8080//upload

location /api {proxy_pass http://127.0.0.1:8080/;
}

3.location带/,proxy_pass不带/,则真实地址会带location匹配目录/api/
访问地址: www.test.com/api/upload–>http://127.0.0.1:8080/api/upload

location /api/ {proxy_pass http://127.0.0.1:8080;
}

4.location和proxy_pass都不带/,则真实地址会带location匹配目录/api/
访问地址: www.test.com/api/upload–>http://127.0.0.1:8080/api/upload

location /api {proxy_pass http://127.0.0.1:8080;
}

5.同1,但 proxy_pass带地址
访问地址: www.test.com/api/upload–>http://127.0.0.1:8080/server/upload

location /api/ {proxy_pass http://127.0.0.1:8080/server/;
}

6.同2,但 proxy_pass带地址,则真实地址会多个/
访问地址: www.test.com/api/upload–>http://127.0.0.1:8080/server//upload

location /api {proxy_pass http://127.0.0.1:8080/server/;
}

7.同3,但 proxy_pass带地址,则真实地址会直接连起来
访问地址: www.test.com/api/upload–>http://127.0.0.1:8080/serverupload

location /api/ {proxy_pass http://127.0.0.1:8080/server;
}

8.同4,但 proxy_pass带地址,则真实地址匹配地址会替换location匹配目录
访问地址: www.test.com/api/upload–>http://127.0.0.1:8080/server/upload

location /api {proxy_pass http://127.0.0.1:8080/server;
}

二、反向代理

1.反向代理是什么

在这里插入图片描述

客户端不需要任何配置就能访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外就一个服务器,暴露的是反向代理服务器地址,隐藏了真实服务器IP地址。代理对象是服务端,不知道客户端是谁

反向代理的作用:
保障应用服务器的安全(增加一层代理,可以屏蔽危险攻击,更方便的控制权限)
实现负载均衡(稍等~下面会讲)
实现跨域(号称是最简单的跨域方式)

2.配置反向代理

配置反向代理案例一

1.在windows系统的host文件(C盘Windods/System32/driver/etc/hosts)进行域名和ip对应关系的配置
在这里插入图片描述
2.nginx里进行请求转发的配置(反向代理配置) nginx.conf

主要修改 server_name、proxy_pass 两个配置:
server_name:主机IP
proxy_pass:nginx 代理地址

在这里插入图片描述

输入网址,显示tomcat主页

在这里插入图片描述

配置反向代理案例二

1.准备工作

部署tomcat 8080和tomcat8081

因为tomcat默认的端口号是8080,所以要设定tomcat的端口号时,需要修改server.xml中的部分端口,启动tomcat

在两个tomcat文件中找到webapps,在其目录下建立两个文件edu,vod,里面放入里那个html页面,并测试页面可成功访问。

2.找到nginx配置文件 nginx.conf

server {listen       9001;server_name  192.168.17.129;location ~ /edu/ {proxy_pass  http://127.0.0.1:8080;}location ~ /vod/ {proxy_pass  http://127.0.0.1:8081;}
}   

3.重启nginx,测试
在这里插入图片描述
在这里插入图片描述

三、负载均衡

1.负载均衡是什么

随着业务的不断增长和用户的不断增多,一台服务已经满足不了系统要求了。这个时候就出现了服务器 集群。

在服务器集群中,Nginx 可以将接收到的客户端请求“均匀地”(严格讲并不一定均匀,可以通过设置权重)分配到这个集群中所有的服务器上。这个就叫做负载均衡。

2.nginx负载均衡的策略

1、RR(默认
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
weight代表权重,默认为1,权重越高分配的客户端越多

upstream test{//添加服务器名server localhost:8080 weight =10;server localhost:8081  weight = 20;
}

3、ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
​ 每个请求按访问IP的hash结果分配,这样后续就可固定 访问一个后端服务器

  upstream test {ip_hash;server localhost:8080;server localhost:8081;}

4\fair(第三方)
根据响应时间来进行分配,响应时间的长短来分配

upstream test{//添加服务器名server localhost:8080;server localhost:8081;fair;
}

5\url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

  upstream backend { hash $request_uri; hash_method crc32; server localhost:8080;server localhost:8081;} 

四、动静分离

1.动静分离是什么

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

2.动静分离配置

upstream test{ server localhost:8080; server localhost:8081; }  server { listen    80; server_name localhost; location / { root  e:wwwroot; index index.html; } # 所有静态请求都由nginx处理,存放目录为html location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ { root  e:wwwroot; } # 所有动态请求都转发给tomcat处理 location ~ .(jsp|do)$ { proxy_pass http://test; } error_page  500 502 503 504 /50x.html; location = /50x.html { root  e:wwwroot; } } 

这样我们就可以吧HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活

总结

但愿吉祥


http://chatgpt.dhexx.cn/article/UHbRK0gf.shtml

相关文章

推导大O阶方法

1、用常数1取代运行时间中的所有加法常数; 2、只保留最高阶项; 3、去除最高阶项的常数; 常数阶是O(1); 线性阶是O(n); 对数阶是O(logn); 平方阶是O&…

大O算法复杂度表示

序言:算法的时间复杂度和空间复杂度都是用“ 大O表示法” 来表示的。其中O是个常量。 常见的 排序算法的时间复杂度: 冒泡排序、插入排序、希尔排序、选择排序的时间复杂度是O(n^2); 快速排序的时间复杂度是 O&#…

数据结构学习笔记:算法复杂度的度量之“大O记号”

分析算法复杂度的非常重要的方法:大O记号!! 下面来让我们看一下到底什么是大O记号 举个例子: 用一个直尺去评价算法复杂度,上面的刻度就相当于大O记号,我们不一定要一味的强调刻度的精细程度,没…

算法复杂度渐进符号(大O、Ω和θ)的个人理解

做软考习题时,碰到了这样的一道题: 关于算法复杂度渐进符号(O、Ω、θ),详细解释可参考: 【双语字幕】什么是算法复杂度渐进符号?阿布老师算法课11 这里节选总结了视频的重点内容,…

数据结构考研:大O表示法最浅显易懂且详细深入的解释及与小o表示法的区别(十分钟必懂)

大O表示法的背景 作为软件工程专业的学生,在我们学习数据结构的时候,总是会碰见对各种算法时间复杂度和空间复杂度的大O表示法的描述。我们只是将信将疑的用着,并不知道大O表示法的准确含义,今天博主李同学在查阅各方资料后进行详…

算法的时间复杂度(大O表示法)

首先我们先来看个例子, 我想找个1~100的数字,你的目标是以最少的次数猜到这个数字。你每次猜测后,我会说小了、大了或对了。下面我们来看下两种简单的方法(方法有很多种),再来引入算法的运行时间&#xff0…

算法时间复杂度分析——大O、大Ω、大θ、小o,小ω

最近开始转战传统算法分析的研究工作了,重新拾起以前学过的一些内容。 目录 一、概述 二、对常见的Ο和Ω进行分析 2.1 大O表示法 2.2 大Ω表示法 三、P问题,NP问题,NP-hard问题,NPC问题 3.1 P问题和NP问题 3.2 NPC问题和N…

复杂度分析(大O表示法)

复杂度分析 前文提要 本文完完全全引用极客时间的文章《数据结构与算法之美》,作者王争。 数据结构是作为程序猿绕不过的一道坎,所以萌生了学习的想法,试读了几篇文章后发现讲的很好,也有很多人订阅,于是不回头的走…

big O notation - 大 O 表示法

big O notation - 大 O 表示法 Big O notation (with a capital letter O, not a zero), also called Landau’s symbol. 大 O 表示法 (大写字母 O,不为零),也称为 Landau’s symbol。 Big O notation is a mathematical notation that describes the l…

算法分析:大O符号/大Ω符号/大Θ符号/小o符号/小w符号

感谢作者分享,原文链接:http://blog.csdn.net/u012816041/article/details/49888631 大O,渐进表示法,接下来我尝试用最简单的方式进行说明。 学习算法我经常听到这个词汇,我一开始很难理解,什么鬼&#xff…

算法分析—大O、大Ω、大θ

前言 在算法的学习中,最开始便是要学习算法的分析。学习算法分析时,我们便会接触到这么几个符号:大O、大Ω、大θ,常常让人难以理解。 在通常的算法分析时,我们可以明白,在输入规模较小,各种算…

算法分析——大O标记法

目录 一. 运行时间 二. 大O 表示法 2.1 示例 三. 总结 五. 扩展 一. 运行时间 每次介绍算法时,我们都将讨论其运行时间。一般而言,应选择效率最高的算法,以最大限度地减少运行时间或占用空间。 可是,如果代码都还没有运行&a…

Oracle数据库查询语句

1 oracle数据库查询表的所有数据–select * from 表名;(* 代表所有) 2 oracle数据库查询表中指定字段的值–select 字段名1,字段名2,……from 表名; 3 oracle数据库往表中添加数据信息–(添加信息使用inser…

Access数据库的查询

内容很简单,我搭建access数据库就是为了简单测试access语句的对错,以及学习access数据库的语法。 1.打开access数据库。 2.主页->空数据库 3.创建数据 4.创建->查询设计 5.【显示表】中的【表】【查询】【两者都有】,都可以。点击添加…

数据库查询语句SQL中like、%、-的区别

数据库查询语句SQL中like、%、-的区别 数据库查询语句SQL中like、%、-的区别 %百分号通配符:表示任何字符出现任意次数(可以是0次) SQL 语句选取 name 以字母 "k" 结尾的所有客户: SELECT * FROM Websites WHERE name LIKE %k; 执行输出结果: 下划线通配符:表示…

使用oracle数据库分页查询语句,各种数据库的分页查询语句

各种数据库的分页查询语句 1.oracle数据库分页select * from (select a.*,rownum rc from 表名 where rownum=endrow) a where a.rc=startrow2.DB2数据库分页Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by 列名) as 各种数据库的分页…

解决数据库查询语句where条件为空查询全部数据,不为空按照条件查询

问题:在用查询语句查询电影类型,电影年代,电影区域的时候,要返回全部的数据,就是where条件为空,返回所有的数据 解决:select * from 表 where (字段条件 or 条件‘’) 代码: const …

数据库内外联接查询语句

建立如下表并插入数据: create table s(sid varchar2(10) primary key,sname varchar2(50),sage number(30));insert into s values(111,小红,20);insert into s values(222,小红,20);insert into s values(333,小红,20);insert into s values(555,小红,20);create…

SQL Server数据库的查询语句

select version; #查询数据库的版本 select servername; #查询服务名 select host_name(); #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字 select db_name(); #查询当前数据库名 select db_name(1); #查询第一个数据库名 select db_name(…

数据库去重语句整理

示例数据 Test表中有id和name两个字段,id各不相同,name有重复。 现在需要去除重复的数据,只保留重复的里面id最大的数据。 一、去重语句一(通用型): SELECT * FROM test c where c.id in( SELECT b.id from test a,test b wher…