瑞吉外卖-day08-Nginx
瑞吉外卖-day08-Nginx
课程内容
- Nginx 入门
- 反向代理
- 负载均衡
1. Nginx-概述
1.1 介绍

Nginx 是一款的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)。其特点是,事实上 nginx 的并发能力在同类型的网页服务器中表现较好,中国大陆使用 nginx 的网站有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 是由伊戈尔·赛索耶夫为访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。
1.2 下载和安装
1.2.1 下载
在 Nginx 的官网的下载页面中下载地址,就展示了当前 Nginx 版本,并提供了下载的连接。 如下:

在本项目中,我们所学习的 Nginx 选择的是稳定版本的 1.16 这个版本,我们可以直接从官网下载,当然在我们的课程资料中也已经提供了该版本的安装包。

如果是 Windows 版本下载 nginx/Windows-1.16.1

1.2.2 linux 安装
点击查看
1). 安装依赖包
由于 nginx 是基于 c 语言开发的,所以需要安装 c 语言的编译环境,及正则表达式库等第三方依赖库。
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
2). 下载 Nginx 安装包
yum install wget
wget https://nginx.org/download/nginx-1.16.1.tar.gz
wget :
wget 命令用来从指定的 URL 下载文件。wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget 会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。
执行完 wget 指令后,就会在当前所在目录看到下载下来的文件。
3). 解压 nginx 压缩包
tar -zxvf nginx-1.16.1.tar.gz
4). 配置 Nginx 编译环境
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx
说明:
--prefix 指定的目录,就是我们安装 Nginx 的目录。
5). 编译&安装
make & make install
1.2.3 windows 安装部署 👈
下载完成后,解压缩,运行 cmd,使用命令进行操作,,,不要直接双击 nginx.exe,这样会导致修改配置后重启、停止 nginx 无效,需要手动关闭任务管理器内的所有 nginx 进程,再启动才可以。
使用命令行到达 nginx 的加压缩后的目录
# cd 到你的解压缩目录
cd D:\nginx-1.16.1
3、启动 nginx 服务,
start nginx
4、查看任务进程是否存在,dos 或打开任务管理器都行
tasklist /fi "imagename eq nginx.exe"


1.3 目录结构
1.3.1 Linux 目录结构
点击查看
安装完 Nginx 后,我们可以切换到 Nginx 的安装目录(/usr/local/nginx),先来熟悉一下 Nginx 的目录结构,如下图:

备注: 上述我们用到的一个指令 tree,该指令可以将我们指定的目录以树状结构展示出来。如果没有这个指令,可以通过以下指令进行安装。 yum install tree
重点目录和文件如下:
目录/文件 | 说明 | 备注 |
---|---|---|
conf | 配置文件的存放目录 | |
conf/nginx.conf | Nginx 的核心配置文件 | conf 下有很多 nginx 的配置文件,我们主要操作这个核心配置文件 |
html | 存放静态资源(html, css, ) | 部署到 Nginx 的静态资源都可以放在 html 目录中 |
logs | 存放 nginx 日志(访问日志、错误日志等) | |
sbin/nginx | 二进制文件,用于启动、停止 Nginx 服务 |
1.3.1 windows 目录结构 👈

重点目录和文件如下:
目录/文件 | 说明 | 备注 |
---|---|---|
conf | 配置文件的存放目录 | |
conf/nginx.conf | Nginx 的核心配置文件 | conf 下有很多 nginx 的配置文件,我们主要操作这个核心配置文件 |
html | 存放静态资源(html, css, ) | 部署到 Nginx 的静态资源都可以放在 html 目录中 |
logs | 存放 nginx 日志(访问日志、错误日志等) |
2. Nginx-命令
2.1 常用命令(windows)
提示
- 查看版本
nginx -v
- 检查配置文件
修改了 nginx.conf 核心配置文件之后,在启动 Nginx 服务之前,可以先检查一下 conf/nginx.conf 文件配置的是否有错误,命令如下:
nginx -t
- 启动 nginx 命令:
start nginx
- 停止 nginx:
nginx -s stop
- 快速停止或关闭 Nginx:
nginx -s stop
# 停止之后,我们可以查看 nginx 的进程:
tasklist /fi "imagename eq nginx.exe"
- 正常停止或关闭 Nginx:
nginx -s quit
- 配置文件修改重装载命令:
nginx -s reload

图片看不清,可以 Ctrl+滑轮 放大来看 gif 动图
2.2 环境变量配置
如果需要在 windows 其他盘符使用 nginx 命令,可以将 nginx 配置到 window 的环境变量中
3. Nginx-应用
介绍了并安装了 Nginx 之后,本章节将要讲解的是 Nginx 的使用,我们主要从以下四个方面进行讲解。
3.1 配置文件结构
nginx 的配置文件(conf/nginx.conf)整体上分为三部分: 全局块、events 块、http 块。这三块的分别配置什么样的信息呢,看下表:
区域 | 职责 |
---|---|
全局块 | 配置和 nginx 运行相关的全局配置 |
events 块 | 配置和网络连接相关的配置 |
http 块 | 配置代理、缓存、日志记录、虚拟主机等配置 |
具体结构图如下:

在全局块、events 块以及 http 块中,我们经常配置的是 http 块。
在 http 块中可以包含多个 server 块,每个 server 块可以配置多个 location 块。
3.2 部署静态资源
3.2.1 介绍
Nginx 可以作为静态 web 服务器来部署静态资源。这里所说的静态资源是指在服务端真实存在,并且能够直接展示的一些文件,比如常见的 html 页面、css 文件、js 文件、图片、视频等资源。
相对于 Tomcat,Nginx 处理静态资源的能力更加高效,所以在生产环境下,一般都会将静态资源部署到 Nginx 中。
将静态资源部署到 Nginx 非常简单,只需要将文件复制到 Nginx 安装目录下的 html 目录中即可。
server {
listen 80; #监听端口
server_name localhost; #服务器名称
location / { #匹配客户端请求url
root html; #指定静态资源根目录
index index.html; #指定默认首页
}
}
3.2.2 测试
在资料中,我们提供了一个静态的 html 文件,我们需要将这个文件部署到 nginx 中,然后通过 nginx 访问 html 静态资源。
1). 将静态资源上传到 nginx-1.16.1\html 目录
2). 启动 nginx
start nginx
3). 访问
http://localhost/hello.html

http://localhost/
, 访问该地址,访问的是 nginx 的默认首页
4). 配置首页

如果我们需要将 hello.html 作为 nginx 的首页,可以修改 location 的 index 指令,配置为 hello.html,如下:

配置完毕后,我们可以通过指令,来检查配置文件是否配置正确: nginx -t

配置文件修改了,我们需要重新加载一下,才可以生效:
nginx -s reload
5). 访问
http://localhost/

3.3 反向代理
3.3.1 概念介绍
1). 正向代理
正向代理服务器是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器返回给客户端。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问 Internet 的途径。
正向代理一般是在客户端设置代理服务器,通过代理服务器转发请求,最终访问到目标服务器。

2). 反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器。,也无须在用户端作任何设定,对于用户来说,访问反向代理服务器是完全无感知的。

那么在本小节,我们就是要使用 nginx 来作为反向代理服务器使用。 在 nginx 中,我们可以在 nginx.conf 中配置反向代理:
server {
listen 82;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8080; #反向代理配置,将请求转发到指定服务
}
}
上述配置的含义为: 当我们访问 nginx 的 82 端口时,根据反向代理配置,会将请求转发到 http://127.0.0.1:8080
对应的服务上。
3.3.2 测试
需求: 在 http://127.0.0.1:8080
这台服务器中部署了 java(瑞吉外卖) 应用,运行端口为 8080,现在我们需要在访问 nginx 的 82 端口时,通过 nginx 将请求转发到 http://127.0.0.1:8080
的服务。

1). 在 启动瑞吉外卖项目
注意端口 8080
2). 启动 nginx,并且中的 nginx.conf 中配置反向代理

3). 检查配置文件,并重新加载
# 检查配置文件是否正确
nginx -t
#直接强行停止进程后,重启服务
TASKKILL /F /IM nginx.exe
#停止之后,我们可以查看 nginx 的进程 是否真正关闭
tasklist /fi "imagename eq nginx.exe"
#启动服务器
start nginx
4). 访问

注意: 在访问 82 端口时,有可能访问不通,原因是以为防火墙中没有开放端口号。我们可以通过两种方式来解决该问题:关闭防火墙
3.3.3 瑞吉外卖反向代理案例 2(前端后端分离)
步鄹
- 准备工作
- 下载静态资源和 jar 包
- 运行后台 jar 包,提供接口访问
- 将静态资源 dist 压缩包,拷贝到 nginx 安装目下 html 下
- 修改 nginx 配置文件(conf/nginx.conf)
- 启动 nginx 服务器
- 访问
http://localhost/
1️⃣ 准备工作
- 下载静态资源和 jar 包下载地址
- 运行后台 jar 包,提供接口访问
java -jar reggie_take_out-1.0-SNAPSHOT.jar

- 将静态资源 dist 压缩包,拷贝到 nginx 安装目下 html 下

2️⃣ 修改配置文件
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html/dist; #定位的文件夹位置
index index.html;
}
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8080;
}
#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;
}
}
rewrite ^/api/(.*)$ /$1 break; 是什么意思? 请查看 3.3.4 反向代理配置
3️⃣ 检查配置文件,并重启
# 检查配置文件是否正确
nginx -t
#直接强行停止进程后,重启服务
TASKKILL /F /IM nginx.exe
#停止之后,我们可以查看 nginx 的进程 是否真正关闭
tasklist /fi "imagename eq nginx.exe"
#启动服务器
start nginx

注意:后台 swagger 的路径:
http://localhost:8080/doc.html
3.3.4 反向代理配置
前端工程部署完成之后,我们可以正常的访问到系统的登录页面,点击登录按钮,可以看到服务端发起的请求,请求信息如下:

而大家知道,在我们之前开发的工程中,是没有这个前缀的,那这个时候,在不修改服务端代码的情况下,如何处理该请求呢?
实际上,通过 nginx 的就可以轻松解决这个问题。
在上述我们配置的 nginx.conf 中,除了配置了静态资源的加载目录以外,我们还配置了一段反向代理的配置,配置信息如下:
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8080;
}
这一段配置代表,如果请求当前 nginx,并且请求的路径如果是 /api/ 开头,将会被该 location 处理。而在该 location 中,主要配置了两块儿信息: rewrite(url 重写) 和 proxy_pass(反向代理)。 接下来我们就来解析一下这两项的配置。
1). 路径重写 rewrite
rewrite ^/api/(.*)$ /$1 break;
这里写的是一个,代表如果请求路径是以 /api/
开头,后面的请求路径任意,此时将原始的 url 路径重写为 /$1
,这里的$1
指代的就是通配符 .* 这一块的内容。比如:
/api/employee/login ------> ^/api/(.*)$ --------> 此时 (.*) 匹配的就是 employee/login ------> 最终重写为/$1 : /employee/login
2). 反向代理
proxy_pass http://localhost:8080;
路径重写后的请求,将会转发到后端的 http://localhost:8080 服务器中。 而这台服务器中,就部署的是我们的后端服务。
3.4 负载均衡
3.4.1 概念介绍
早期的网站流量和业务功能都比较简单,单台服务器就可以满足基本需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障出现。
应用集群: 将同一应用部署到多台机器上,组成应用集群,接收负载均衡器分发的请求,进行业务处理并返回响应数据
负载均衡器: 将用户请求根据对应的负载均衡算法分发到应用集群中的一台服务器进行处理

此处的负载均衡器,我们将会使用 Nginx 来实现,而 Nginx 的负载均衡是基于反向代理的,只不过此时所代理的服务器不是一台,而是多台。