nginx是什么
nginx 是一个高性能的 http 和反向代理 web 服务器,有以下两个核心特点
- 占有内存少
- 并发能力强
nginx能做什么
作为http服务器
nginx 可以作为 http 服务器,也就是说可以作为一个 web 服务器,接收 http 请求
作为代理服务器
什么是正向代理
在说反向代理服务器之前,我们先来看什么是正向代理。对于一个客户端而言,是需要有客户端和服务器的,如下图所示

比如我们去访问百度的服务器,我们在浏览器中直接输入百度的网址就可以,但是如果你想要访问 google 就访问不了,但是现在有很多的代理软件,你安装了代理软件之后,你就可以访问 google 了,就像上图所示,我们是不能直接访问 google 的,但是代理软件可以访问,所以现在我们饶了一下,既然代理软件可以访问 google,那么我们让代理软件帮我们访问 google 将数据返回给我们就可以了,这个代理软件做的事情就是正向代理。所以结论就是 正向代理就是代理客户端
什么是反向代理
上面说了正向代理,而且给出了结论,正向代理就是代理客户端,那么此时说反向代理就很容易知道,反向代理就是代理服务器端了,nginx 就有这样的 功能,看下图所示
如上图所示,对于客户端而言,他其实不知道真实的服务器的地址的,只知道 nginx 的地址,对于客户端而言,nginx 服务器就是一个真实的服务器,这就叫做反向代理。代理的对象是服务器。
负载均衡
看上面反向代理模块的图,上面我们只是说 nginx 可以将请求转到真实的服务器去处理,但是从上图可以看到,真实的服务器是有多个的,那么到底给谁去处理呢?**确定给哪一台服务器的过程就是负载均衡 ,而nginx也提供了这样查找的功能,也就是说 nginx 可以提供负载均衡的功能。
动静分离
什么是动态资源,什么是静态资源
先来讲一下什么是静态资源,什么是动态资源。区分而标准也很简单,无论在哪种状态下显示的结果都是一样的就是静态资源,而可以根据不同情形来显示不同 的内容就是动态资源。
- 像 css、js、图片等资源都是静态资源,因为无论在那种情形在访问都是不会改变的。
- 像 jsp、servlet 这些就是动态资源。
如何做静态分离
所谓的动静分离就是将动态资源和静态资源分开。以前我们开发一个 web 应用的时候一般都是使用 tomcat 来作为我们的服务器,我们的所有请求都是直接给到 tomcat 服务器。此时动静资源是没有分离的。但是 tomcat 擅长的其实是处理动态资源,也就是擅长处理 servlet 和 jsp 这些。对于静态资源效率并没有那么高,既然 tomcat 处理静态资源效率不高,那么就应该找一个擅长处理静态资源的服务器去处理静态资源 没有做动静分离之前的请求是如下图所示的。 如上图所示,此时无论是请求静态资源(js)还是动态资源(servlet),最终所有的请求都是给到了 tomcat 服务器。 下面看一下如果做了动静分离,请求路径是怎么样的
其实就是当访问静态资源的时候,nginx 不再是直接转发请求给 tomcat 了,而是自己去处理这个静态资源的请求。
nginx的安装与配置文件解读
下面来看一下 nginx 的安装和配置文件的相关内容
nginx的安装
nginx下载地址 我这里是下载的1.18window版本的。下载下来直接解压即可,解压后目录如下
nginx的启动和停止
进入到 nginx 解压的目录,在该目录中打开 cmd 可以使用如下命令来启动和关闭 nginx
nginx的核心配置文件
nginx 的核心配置文件就是 conf 目录想的 nginx.conf 文件,该配置文件主要包含三大块内容
全局块
如上图所示,这里就是全局块的内容
- user nobody 表示的 是运行用户
- work_processes 表示的是 work 进程数量,通常设置为和 cpu 数量相等
- 后面三个是配置日志文件的位置
- 最后一个是设置 pid 对于全局配置文件而言,我们一般是不需要修改什么。
events块
events 块主要影响 nginx 服务器与用户的网络连接,比如 worker_connections 1024,表示的是 workderprocess 支持的最大连接数是1024
http块(server块)
http 块是我们经常需要修改的部分,这一块也是比较重要的一部分。在这里面我们可以进行 虚拟主机的配置,监听端口的配置,请求转发,反向代理和负载均衡的配置等
nginx的应用
将nginx作为反向代理服务器
配置一台服务器
上面我们也说过,nginx 可以作为反向代理服务器,现在我们先启动 nginx nginx 的默认端口是80, 所以我们可以直接访问
http://localhost
会出现如下的界面 现在我们来启动一个 tomcat,tomcat 的默认端口是 8080,现在访问
http://localhost:8080
会出现如下所示的界面 既然 nginx 可以作为反向代理服务器,那么也就说当我们访问 nginx 的时候实际上访问的是 tomcat,现在我们就要做这件事情的配置。
通过这样的配置之后,我们再去访问
http://localhost
看到的页面如下 可以看到我们访问的结果是 tomcat
配置两台服务器
上面是只使用了一台服务器,也就是只是启动了一个 tomcat,现在我们想要启动两个服务器(也就是启动两个 tomcat),然后当我们访问 http://localhost/abc
的时候访问第一个 tomcat,访问 http://localhost/def
的时候访问第二个 tomcat 需求如图所示 现在我们来修改 nginx 的配置
这里配置有一个坑需要注意,之前在配置一台 tomcat 的时候,proxy_pass 的地址直接是
http://localhost:8080
就可以了,但是现在配置两台之后,我们需要在最后加上一个反斜杠。
location配置中的url最后是否有反斜杠的区别
- 在 proxy_pass 的 url 最后面加上了反斜杠,表明这是一个绝对路径,此时在 location 中的内容是不会拼接在 proxy_pass 的后面的,就像上面 location 是 /abc,然后 proxy_pass 是
http://127.0.0.1:8080/
, 那么最后访问的真实地址就是http:127.0.0.1:8080/
- 如果在 proxy_pass 的 url 最后面没有加上反斜杠,表示这是一个相对路径,此时在 location 中的内容是会拼接在 proxy_pass 的后面的,如果 location 是 /abc,然后 proxy_pass 是
http:127.0.0.1:8080
,那么最后真实地址就是http://127.0.0.1:8080/abc
, 在第一个例子中我们是没有加上反斜杠的,例子中 location 是/
, 然后 proxy_pass 是http:localhost:8080
那么真实的访问地址就是http://localhost:8080/
分别访问不同的网址得到的结果如下
location的配置规则
经过上面的两个例子,我们知道很多配置都是配置 location,那么 location 配置有哪些规则呢?location 的语法格式如下
bash
location [=|~|~*|^~] /uri {......}
以下匹配规则从上到下优先级依次降低
- 精确匹配 location = /abc{其他内容}
- 匹配路径的前缀 location ^~ /abc{其他内容}
- 不区分大小写的正则匹配
location ~*/abc{其他内容}
- 正则匹配 location ~/abc{其他内容}
- 普通路径前缀匹配 location /abc{其他内容}
使用nginx完成负载均衡的配置
既然是使用负载均衡,那么就需要多个服务器,在上面的例子中我们启动了两个 tomcat,现在我们这里启动三个 tomcat ,每一个 tomcat 配置不同的端口即可。 然后我们修改每一个 tomcat 目录下层 webapps/root 目录下 index.jsp 文件 在 home 这个位置加上对应的端口,这样我们在页面上可以区分我们访问的是哪一个 tomcat
做完上述步骤后,我们启动三个tomcat,然后访问这三个页面,可以看到如下的结果
可以看到这三个 tomcat 我们都已经启动起来了。先看下图
和上面的图不同之处在于我们现在启动了三个 tomcat,并且如果访问路径是
http://localhost/abc
那么请求就会到达 tomcat1 或者tomcat2,到底是到达 tomcat1 还是 tomcat2 呢,此时就需要配置负载均衡的配置了。
常用的负载均衡策略
既然需要配置负载均衡策略,我们就先来说一下常用的有哪几种负载均衡的策略
轮询
轮询,也是 nginx 的默认负载均衡的策略,所谓轮询就是按照时间顺序逐一分配到不同的服务器,如果某一台服务器下线,能自动剔除。 具体配置如下:
conf
upstream clusterServer {
server localhost:8080;
server localhost:8081;
}
server {
}
location /abc {
proxy_pass http://clusterServer/;
}
- 如上图所示,使用集群的配置就需要添加 upstream 标签,这个标签和 server 标签是同级的(我们之前的配置都是在 server 内部进行配置的)
- upstream 后面跟着的是集群的名称,这个名称我们可以随意取,后面会使用到
- upstream 里面配置的是需要参数集群的服务器的地址,这里我是让 8080 和 8081 这两个 tomcat 参与了集群
- 现在我们需要修改 server 标签里面的 location 标签的内容,之前我们 proxy_pass 是直接配置服务器地址,现在需要改成配置集群的地址,这里就需要使用到我们上面配置的集群的名称。
从上面的截图可以看到,可以配置集群也可以不配置集群,这两个是可以同时使用的。 访问结果: 现在我们输入
http://localhost/abc
看一下访问结果可以看到我们配置的集群已经生效了,同样的路径,但是处理的服务器并不是一台。
weight
还有一种负载均衡的策略是 weight , 所谓的 weight 就是权重的意思,nginx 中默认每一个负载的 weight 都是1,权重越高被分配的请求就越多(用于服务器性能不均衡的情形),配置方式如下: 当这样配置之后,我们再去访问
http://localhost/abc
会发现 8081端口的 tomcat 处理请求的次数比 8080 端口的 tomcat 次数多。
ip_hash
每个请求按照 ip 的 hash 结果分配,每⼀个客户端的请求会固定分配到同⼀个⽬标服务器处理,可以解决分布式 session 问题
ip_hash 的缺陷
上面的例子中是客户端直接访问 nginx,这样 nginx 可以拿到客户端的 ip,但是如果在客户端和 nginx 之间还有一个代理服务器的话,那么nginx 就拿不到真实的客户端 ip,拿到的是前面那个代理服务器的 ip,所以在新版的 nginx 中推出了 url_hash,配置方式如下
conf
upstream xxx {
hash $request_uri;
server 127.0.0.2;
server 127.0.0.3;
}
动静分离示例
上面在理论分析阶段已经知道,tomcat 处理静态资源效率不高,但是 nginx 处理静态资源效率比较高,所以可以让 tomcat 只处理动态资源,让 nginx 来处理静态资源,要想这么做也很简单,就是当 nginx 接收到请求之后,判断一下,那些是静态资源的请求,如果是静态资源的请求,就不要将请求转发给 tomcat,自己直接处理就行。 现在我们在 nginx 中添加一个配置
其实就是加了一个 location,这里面如果拦截到 static 请求就会认为是一个静态资源的情况,此时就会转到 staticData 这个目录中去寻找资源,这个目录是我们自己创建的。 此时我们使用地址
http://localhost/static/index.html
就能访问到这个 index.html 里面的内容