Nginx介绍,安装

1.基本介绍

  • Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。

  • Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004104 日。

  • Nginx 特点是占有内存少,并发能力强。

事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,一般来说,如果我们在项目中引入了 Nginx ,我们的项目架构可能是这样:

15-1

在这样的架构中 , Nginx 所代表的角色叫做负载均衡服务器或者反向代理服务器,所有请求首先到达 Nginx 上,再由 Nginx 根据提前配置好的转发规则,将客户端发来的请求转发到某一个 Tomcat 上去。

Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理负载均衡

那么这里涉及到两个概念:负载均衡服务器、反向代理服务器。

2.负载均衡服务器

负载均衡(Load Balance)建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,再让这个中间服务器在服务器集群中通过负载均衡算法选择一个服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

负载均衡策略很多,也有很多层,对于一些大型网站基本上从 DNS 就开始负载均衡,负载均衡有硬件和软件之分,各自代表分别是 F5Nginx (目前 Nginx 已经被 F5 收购),早些年,也可以使用 Apache 来做负载均衡,但是效率不如 Nginx ,所以现在主流方案是 Nginx

2.1 Load Balancing Methods

nginx-server

开源Nginx 支持四种负载平衡方法,Nginx Plus还增加了两种方法。所以在Nginx 上设置负载平衡时,有五种主要方法。前四个在开源Nginx 和Nginx Plus中都可用,而最后一个是Nginx Plus功能。

Nginx Plus 相当于付费版本的 Nginx。提供了更多的功能,针对企业需要的一些服务进行了优化。

有关功能的比较页面,请参考: Compare Models - NGINX

2.1.1 Round Robin, optionally weighted

默认的load balancing方法。

1
2
3
4
5
upstream myapp {
server webserver1.example.com;
server webserver2.example.com;
server webserver3.example.com;
}

在请求过来时,按顺序分发请求,第一次来的server1上,第二次打到server2上,第三次打到server3上,第四次又回到server1上,1-2-3,1-2-3, ... 的这样循环。

Round Robin也可以加权重,为每一个服务器指定权重。

1
2
3
4
5
upstream myapp {
server webserver1.example.com weight = 2;
server webserver2.example.com weight = 1;
server webserver3.example.com weight = 1;
}

这样配置后,请求会这样打:1-1-2-3,1-1-2-3, ...

weight越大,负载的权重就越大,默认为1。

2.1.2 Least Connected, optionally weighted

这种方法是每次来的请求都会打到当前连接数最少的upstream里的web server上, 比如有3台server,server1,server2都有10个连接,3只有1个连接,如果在接下来的9个请求1和2的10个连接都没有断开,那么这9个请求都会被打到3上。

例如有三个负载均衡的服务器,第一个进入的请求非常非常短。它的处理速度非常快——也许只需要10毫秒。下一个请求需要很长时间来处理。第三个也很短。第四个,也很短。第五个,很长。不知何故,这种情况一次又一次地发生,服务器2不断受到这些巨大请求的冲击。它们会持续很长时间,而发送到其他服务器的请求非常短。在这种情况下,循环往复是行不通的,因为随着越来越多的连接进入。接近能够处理的最大连接数,服务器处理每个请求的时间会越来越长。

2.1.3 IP Hash

IP Hash会将IP地址的前3个8位元相同的请求打到同一台机器上,来简单的保持回话。 这种方法有个弊端是有些内网统一出口ip都会被打到同一台机器,不能有效的实现load-balancing。

2.1.4 Generic Hash

Generic Hash可以自定义请求的分发,可以根据IP地址和查询变量或者URL或者其他参数, 当这些参数都和上次一样时就会将请求打到上次的那台机器

2.1.5 Least Time(Nginx Plus), optionally weighted

Least Time只能在Nginx Plus中用,和Least Connected类似,会将请求打到连接数最少并且响应速度最快(响应时间最短)的机器上。 同时,它也可以像Round Robin一样使用权重。

2.1.6 如何选择该用哪种load-balancing方法

  • Round Robin适用于所有的server配置和位置(同一个机房)都一样,所有的请求都是短暂的请求。

  • Least Connected适用于所有的server配置和位置都一样,请求处理时间长度会变的会话。

  • IP Hash适用于需要简单的会话保持(根据客户IP地址的前3个八位元决定被用的服务器)。

  • Generic Hash适用于需要简单的会话保持(基于参数组合的哈希决定被用的服务器)。

  • Least Time适用于servers在不同的位置且拥有不同的配置,请求会话长度是可变的,可用于健康检查。

3.代理服务器

Nginx作为一个反向代理服务器为我们服务,代理分为正向代理反向代理

3.1 正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

3.2 反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

image-20221124102228743

为什么使用反向代理

  • 可以起到保护网站安全的作用,因为任何来自Internet的请求都必须先经过代理服务器。
  • 通过缓存静态资源,加速Web请求。
  • 实现负载均衡。顺便说下,目前市面上,主流的负载均衡方案,硬件设备有F5,软件方案有四层负载均衡的LVS,七层负载均衡的Nginx、Haproxy等。

4.Mac安装Nginx

在安装前,需要以下应用程序作为支持。如果没有安装以下应用程序则需要安装。

mac可以通过brew来方便的安装nginx:

1
2
brew search nginx --查看nginx版本信息
brew install nginx --下载nginx

然后我们通过命令查看nginx安装信息:

1
brew info nginx ----查看nginx安装信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
wangwang@localhost ~ % brew info nginx
nginx: stable 1.21.4 (bottled), HEAD
HTTP(S) server and reverse proxy, and IMAP/POP3 proxy server
https://nginx.org/
/usr/local/Cellar/nginx/1.21.4 (26 files, 2.2MB) *
Poured from bottle on 2022-01-26 at 11:12:52
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/nginx.rb
License: BSD-2-Clause
==> Dependencies
Required: [email protected] ✔, pcre ✔
==> Options
--HEAD
Install HEAD version
==> Caveats
Docroot is: /usr/local/var/www

The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.

nginx will load all files in /usr/local/etc/nginx/servers/.

To restart nginx after an upgrade:
brew services restart nginx
Or, if you don't want/need a background service you can just run:
/usr/local/opt/nginx/bin/nginx -g daemon off;
==> Analytics
install: 45,814 (30 days), 114,920 (90 days), 455,820 (365 days)
install-on-request: 45,784 (30 days), 114,766 (90 days), 455,039 (365 days)
build-error: 1 (30 days)

我们可以看到默认的配置文件nginx.conf位置信息。通过open命令来打开文件夹。

1
open /usr/local/etc/nginx --nginx.conf文件目录

成功打开nginx目录,也可以看到nginx.conf的配置文件(后面会用到这个配置文件)。但我们并没有找到nginx被安装到了哪里。

1
open  /usr/local/Cellar/nginx  --nginx安装目录

浏览器输入localhost:8080,我们就能看到如下页面,即Nginx安装成功。

image-20221125095746582

5.Nginx相关命令

  • 启动命令: nginx
  • 快速停止命令 nginx -s stop
  • 平稳退出命令:nginx -s quit
  • 重新加载配置文件命令:nginx -s reload
  • 检查配置文件正确性:nginx -t
  • 查询nginx主进程号:ps -ef | grep nginx

6.Nginx小试牛刀

通过前面的简介,我们已经对Nginx有了一个初步的认知。现在我们通过Nginx反向代理来访问我们的服务。

我们新建一个springboot工程,然后引入web依赖,在controller中写一个入口,来测试Nginx代理。

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/hello")
public class DemoController {

@RequestMapping("/getHello")
public String getHello(){
return "hello world!";
}
}

将端口号改为8089:

1
server.port = 8089

Nginx的配置都是在nginx.conf里,我们通过配置该文件来配置我们的代理。找到localtion位置。

1
2
3
location / {
proxy_pass http://127.0.0.1:8089;
}

只需要上面的代码,即可。然后启动Nginx。输入http://localhost:8080/hello/getHello,即可看到如下页面。浏览器不直接访问前台的 8089(当然,访问nginx前提是你项目能正常访问),而是访问nignx的8080,效果如下:

image-20221125111159370

项目配置的是8089,但是通过访问Nginx的8080端口,Nginx通过配置的路由拦截,通过我们配置的参数代理到8089端口,也就是访问了8089端口并返回了数据,用户在整个过程中是无感知的。这也说明了Nginx是通过反向代理来帮助我们去访问资源。

Nginx 只是一个代理,自身并不提供服务。

7.Nginx启动问题记录

在运行Nginx的时候,遇到一个问题:

1
nginx启动或者重启失败,报错nginx: [error] open() "/usr/local/etc/nginx/nginx.pid" failed (2: No such file or directory)

解决办法:

  1. 通过open /usr/local/etc/nginx打开nginx.conf的位置
  2. 新建一个logs文件夹
  3. 配置nginx.conf,更改pid,如下:
1
2
#pid        logs/nginx.pid;
pid /usr/local/etc/nginx/logs/nginx.pid;

启动Nginx的时候,logs文件夹下会生成nginx.pid。


博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,不用于任何的商业用途。如有侵权,请联系本人删除。谢谢!


Nginx介绍,安装
https://nanchengjiumeng123.top/2022/11/12/operations/nginx/2022-11-12_Nginx/
作者
Yang Xin
发布于
2022年11月12日
许可协议