天天看点

前端需要知道的Nginx入门知识

Nginx简介

Nginx是一个高性能的HTTP和反向代理服务器,具有高并发、稳定、支持热部署等特点。我们常用它来进行负载均衡、反向代理和缓存HTTP请求等。

Nginx架构

Nginx选择的进程模型和事件模型与前端开发者熟知的nodejs很相似,都是采用异步非阻塞的方式。Nginx在启动后会开启一个master进程和多个worker进程。其中唯一的master进程的主要作用是用来管理下面的多个worker进程,它并不参与具体的事件处理过程。而这多个worker进程之间是平等的关系,他们独立地竞争来自客户端的请求且同一个请求只能在某一个worker进程中被处理。下面一张图可以形象说明:

这里可以认为master进程是整个程序的入口,所有的请求都经它手,再分配给下面的worker进程。另外master进程可以管理worker的状态,当某个worker进程挂掉后,master进程需要关掉它并重启一个。

Nginx的高并发性就得益于这种进程模型。但有些传统开发者这时就会产生一个疑问:当master手下的worker进程都在工作时,新进来的请求不就没地方处理了吗?这样何来高并发呢?其实这个问题的答案就是异步非阻塞。以往我们处理一个请求时,需要接受数据,然后进行i/o处理后再返回数据,期间这个i/o操作就占用了大部分的时间。而Nginx的异步非阻塞方式就是当发生i/o阻塞时,worker进程就去处理其他没有阻塞的事件。而这个阻塞完成后再以异步的方式通知到worker进程。相当于准备好的事件源源不断地进入队列来等待worker进程处理,而worker进程也可以节省等待i/o阻塞的时间。

因此,一般推荐nginx设置worker的个数为CPU的核数,这样一个CPU对应一个worker进程,不断地去处理已准备完毕的事件,也不会出现多个进程竞争一个CPU的情况。

Nginx的配置系统

了解了nginx的原理后,对于不是运维的同学来说,平时我们与nginx打交道最多的地方还是它的配置文件。Nginx的配置系统一般由一个主配置文件nginx.conf和一些额外的辅助配置文件构成,这些配置文件都是纯文本形式,位于Nginx安装目录的conf目录下。 Nginx的配置文件由类似于字符串的简单指令行和配置块构成。对于简单配置,指令以分号结尾,由配置指令和参数两部分组成,例如:

worker_processes  8
复制代码
           

该指令由名为worker_processes的指令和值为8的参数组成,表示Nginx要开启的worker进程个数为8个。 除了简单指令外,Nginx配置还包含一些由大括号括起来的复合配置块。这些配置块的大括号包起来的地方表示处于一定的作用域中,其中的内容一般也是一行行简单指令。例如:

http {
	charset utf-8;
}
复制代码
           

表示所启用的http服务器使用utf-8编码。

Nginx常用的几个配置块有:http、server、location、upstream等。这些配置块可以按照一定的规则进行相互嵌套,例如如果该http服务支持多个虚拟主机,则http上下文中可以出现多个server上下文。在日常工作中,只要我们熟悉了常用的配置指令,就可以实现大部分功能。附上查询文档:Nginx中文文档、nginx.conf中文详解

Nginx与前端开发

作为前端开发,掌握Nginx的基本使用方式可以大大加强我们的开发效率。

  1. 反向代理 前端开发经常会遇到的一个问题就是访问后端资源时出现跨域问题,跨域问题在此就不详述,我们知道它是由于浏览器的安全资源策略而产生的。而Nginx的反向代理恰恰避开了这一点。所谓反向代理就是Nginx代替客户端去向后端请求接口数据,然后再返回给客户端,这样就能避开浏览器的安全资源策略,配置例子:
location ^~ /api {
	proxy_pass https://test.com/;
}
复制代码
           

该配置会代理path为/api开头的请求,并返回https://test.com/返回的数据。

  1. 负载均衡 负载均衡就是将请求平均分摊到多个服务器上,从而避免某个服务器因请求量过多而超载。例如:
upstream test {
	ip_hash;
	server 10.100.100.1;
	server 10.100.100.2;
}
location /test {
	proxy_pass http://test;
}
复制代码
           

该配置表示路径为test的请求会根据一定的规则分配给10.100.100.1和10.100.100.2这两台服务器。这些规则除了该配置中的ip_hash方式,还有url_hash、指定权重方式等。

  1. 内网访问 我们经常会遇到某些公司资源只允许内网访问的情况,这时可以通过location的deny和allow指令来简单实现:
location / {
	allow 10.100.0.1;
	allow 10.100.0.2;
	deny all;
}
复制代码
           

allow和deny指令采用从上到下优先匹配的方式,一旦匹配到就跳出。该配置表示只允许10.100.100.1和10.100.100.2这两个ip访问。

除了以上的几种常用功能,Nginx还可以实现图片处理服务、压缩数据、适配多端环境等功能。而且这些功能只需要熟练使用配置指令即可实现。

写在最后

我个人开了一个公众号“前端搬运小工”,我会定期推送优秀的前端精选文章,拒绝无脑基础入门的文章,带给你不一样的前端视角。

转载于:https://juejin.im/post/5c4e885ce51d450609345716