Nginx基础
Nginx的用途以及特点:
- HTTP服务器:Nginx作为HTTP服务器来说性能非常高,能支持50000个并发连接。CPU和内存占用非常低,10000个没有活动的连接才占用2.5M的内存
- 反向代理服务器:其实正向代理和反向代理是蛮抽象的一种表述。我们可以这样理解,正向代理的话,是代理服务器和我们的客户端在一个逻辑层面内,都属于客户端,只不过我们要通过代理服务器去访问我们浏览器直接访问不到的资源;而反向代理是指我们的反向代理服务器和被其代理的后端服务在一个逻辑层面内,我们浏览器直接访问代理服务器,由代理服务器(作为服务公网入口)去帮我们选择一个后端服务(一般都是局域网)去请求,我们直接请求后端服务是请求不到的
- 负载均衡服务器:所谓的负载均衡,是指我们有多个原始服务的实例,每次请求去选择一个原始服务的方式就叫做负载均衡。Nginx默认支持轮询,hash等负载均衡的方式。详情关注后续相关章节
- 动静分离:也就是现在常说的前后端分离。由于比较热门的HTTP服务器(比如Tomcat)处理静态资源不是很擅长,并且前后端项目耦合在一起也不是很方便维护与升级,所以就有了前后端分离的技术。我们Nginx就是扮演了静态资源服务器的角色,Nginx很擅长处理静态资源
我们总结一下Nginx的特点:
- 跨平台:Nginx可以在大多数的类UNIX操作系统上编译运行,而且也支持windows版本
- 配置简单,上手容易
- 高并发,性能好
- 稳定性比较高,宕机几率很低
Nginx的安装
windows安装比较简单,下载安装包傻瓜式安装即可。我们下面介绍一下Linux系统的安装方法。
我们可以在官网或者附件中下载Nginx的安装包(附件的版本是1.17.8版本)。在安装之前,需要提前下载对应的依赖:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
上传压缩包并解压:
tar -xvf nginx-1.17.8.tar
进入文件夹目录执行以下命令:
./configure && make && make install
之后就会在/usr/local下产生一个nginx的目录,该目录下有对应的配置文件目录(conf),脚本目录(sbin)等等。我们可以进入sbin
目录,使用./nginx
命令启动Nginx。启动之后我们访问对应安装机器的80端口,会出现其欢迎页面。
Nginx的主要命令如下:
./nginx
启动Nginx./nginx -s stop
停止Nginx./nginx -s reload
不停机重新加载配置文件./nginx -t
验证配置文件是否有错误
我们上面的安装方式只是最传统的安装方式,如果需要配置插件需要按照插件的官方文档来安装Nginx,如需指定安装目录,需要在第一步执行./configure
时添加--prefix=/自定义位置/
的参数,指定的目录要提前创建好。
Nginx核心配置文件解读
Nginx的核心配置文件conf/nginx.conf包含三块内容:全局块、events块和http块。
- 全局块
从配置文件到events块之间的内容,次西湖的配置会影响Nginx服务器整体的运行。比如worker进程的数目、错误日志的位置等等。
- events块
events块主要影响Nginx服务器与用户的网络连接,比如worker_connections 1024,标识每个workerprocess支持的最大连接数为1024。
- http块
http块是配置最频繁的部分,虚拟主机的配置,监听端口的配置,请求转发、反向代理、负载均衡等等。
Nginx应用场景之反向代理
本节我们看一下Nginx配置反向代理的方式。我们的需求是,在服务器上部署一个Tomcat,监听8080端口。使用Nginx去反向代理我们的Tomcat。
首先我们启动一个Tomcat服务,这里就不演示了。我们重点关注Nginx配置文件的修改,配置如下:
我们可以看到,Nginx监听9003端口,并将请求代理到了Tomcat的8080端口。重新加载Nginx的配置访问我们服务的9003端口我们可以看到Tomcat的欢迎页面。
这里笔者补充一些相关知识:Nginx默认使用server块来配置相对应的实例,支持多个server实例。也就是说一个Nginx服务器可以代理多个域名,但是多个域名要均解析到该服务器ip上。我的配置习惯是一个子域名配置一个server。当然,大家可以按照自己的习惯来。
server块内部的属性listen我们就不多讲了,主要是配置该server的监听端口,多个server之间的监听端口的隔离的,也就是多个server可以同时监听同一端口。server_name属性就是配置域名。Nginx的处理请求时,会先去server列表里面根据server_name和监听端口匹配一个server出来去处理该请求。那么匹配顺序根据笔者试验得到以下结论:优先匹配server_name和端口均匹配的server(server_name支持模糊匹配,所以匹配server_name时,是先精准匹配,没有匹配到就模糊匹配,模糊匹配也分为前模糊、后模糊和正则,权重依次下降,有兴趣的小伙伴可以研究一下),如果匹配到多个,就选择第一个;如果没有匹配到,就选择第一个配制了监听该端口的server来处理。如果端口也匹配不到,就直接匹配失败。
说完了前两个属性,我们再来讲讲location属性的配置语法,location的语法如下:
location [=|~|~*|^~] /uri/ { … }
在Nginx的配置文件中,location主要有以下几种形式:
- 正则匹配:location ~/rubin {}
- 不区分大小写的正则匹配:location ~*/rubin {}
- 匹配路径的前缀:location ^-/rubin {}
- 精准匹配:location=/rubin {}
- 普通路径前缀匹配:location /rubin {}
优先级为: 4 > 3 > 2 > 1 > 5
Nginx应用场景之负载均衡
Nginx的负载均衡策略如下:
- 轮询:默认策略。每个请求按照时间顺序逐一分配到不同的服务器,如果某一个服务器下线,能自动剔除
upstream rubinServer{
server 111.229.248.243:8080;
server 111.229.248.243:8082;
}
location /abc {
proxy_pass http://rubinServer/;
}
- weight:即权重策略。默认每一个负载的服务器权重都为1,权重越高被分配的请求就越多(用于服务器性能分配不均衡的情况)
upstream rubinServer{
server 111.229.248.243:8080 weight=1;
server 111.229.248.243:8082 weight=2;
}
- ip_hash:每个请求按照ip的hash结果分配,每一个客户端的请求会固定分配到某一个目标机器上,可以解决Session不共享的问题
upstream rubinServer{
ip_hash;
server 111.229.248.243:8080;
server 111.229.248.243:8082;
}
Nginx应用场景之动静分离
动静分离就是使用Nginx配制一个静态资源转发,比如我们的前端VUE项目打包之后就是一些静态文件,我们只需要配置Nginx的前端server指向该静态资源的文件夹即可。示例如下:
Nginx底层进程机制剖析
Nginx启动后,以daemon多进程方式在后台运行。包括一个master进程和多个worker进程。master进程负责管理worker进程,worker进程负责处理业务。
- 以
./nginx -s reload
来说明Nginx信号处理部分
1)master进程对配置文件进行语法检查
2)尝试配置(比如修改了端口号,则尝试分配新的监听端口)
3)尝试成功则使用新的配置,新建worker进程
4)新建完成后,给旧的worker进程发送关闭的消息
5)旧的进程收到信号后将当前进程收到的请求处理完成后关闭该进程
所以,reload之后worker进程的pid是会发生改变的。
- worker进程处理请求部分的说明
例如我们监听了9300端口,一个请求到来时,如果多个worker进程在可用状态,则每个进程都可能处理该请求。
1)master进程创建之后,会建立好需要监听的socket,然后从master进程再fork出多个worker进程。所以,所有的worker进程监听的listenfd在新连接到来时都变得可读。
2)Nginx使用互斥锁来保证只有一个worker进程能够处理请求,拿到互斥锁的那个进程注册listenfd读事件,在读事件里面调用accept接受该连接,然后解析、处理、返回响应。
- Nginx多进程模型好处:
1)每个worker进程都是独立的,不需要加锁,节省开销。切某个worker异常时不影响其他worker进程
2)多进程模型为reload热部署机制提供了支撑
文章评论