利用场景
在 LNMP(linux、nginx,mysql、php)中的作用或角色:Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
在 LNMP
中的作用或角色:nginx
自身不能解决 PHP
,它只是个 web
服务器,当接管到申请后,如果是 php
申请,则发给 php
解释器解决,并把后果返回给客户端。php-fpm
是一个守护过程(FastCGI
过程管理器)用于替换 PHP FastCGI
的大部分附加性能,对于高负载网站是十分有用的。sudo apt-get install -y php7.0-fpm
装置
sudo apt-get update
sudo apt-get install -y nginx
启动
所有的启动配置文件都在
/etc/init.d/nginx
这个目录下,所以相干操作都能够在这个文件夹启动命令,这其实就是一个启动脚本。
sudo /etc/init.d/nginx start
sudo service nginx start
原理
Nginx 是以多过程的形式来工作的,当然 Nginx 也是反对多线程的形式的。
Nginx 启动后,在 unix 零碎中会以 daemon(守护过程)的形式在后盾运行,后盾过程蕴含一个 master 过程和多个 worker 过程(你能够了解为工人和管理员)。
worker 过程之间是平等的,每个过程,解决申请的机会也是一样的。当咱们提供 80
端口的 http
服务时,一个连贯申请过去,每个过程都有可能解决这个连贯。那么问题来了,到底最初怎么解决,是由什么决定的呢?咱们来看一看一个残缺的申请是怎么通过相互的合作来实现的:
(1)首先,每个 worker 过程都是从 master 过程 fork
过去,在 master 过程外面,先建设好须要 listen
的 socket
(listenfd
)之后,而后再 fork
出多个 worker 过程。
(2)所有 worker 过程的 listenfd
会在新连贯到来时变得可读,为保障只有一个过程解决该连贯,所有 worker 过程会在注册 listenfd
读事件前抢 accept_mutex
,抢到互斥锁的那个过程注册 listenfd
读事件,而后在读事件里调用 accept
承受该连贯。
(3)当一个 worker 过程在 accept
这个连贯之后,就开始读取申请、解析申请、解决申请。产生数据后,再返回给客户端,最初才断开连接,这样一个残缺的申请就是这样的了。
咱们能够看到:一个申请,齐全由 worker 过程来解决,而且只在一个 worker 过程中解决。
兴许你还有个疑难,那就是 Nginx 采纳多 worker 的形式来解决申请,每个 worker 外面只有一个主线程,那可能解决的并发数很无限啊,多少个 worker 就能解决多少个并发,何来高并发呢?这就是 Nginx 的高超之处,Nginx 采纳了 异步非阻塞 的形式来解决申请,也就是说,Nginx 是能够同时解决成千上万个申请的。
这里补充一下异步非阻塞的概念:
异步的概念是和同步绝对的,也就是不同事件之间不是同时产生的。
非阻塞的概念是和阻塞对应的,阻塞是事件按程序执行,每一事件都要期待上一事件的实现,而非阻塞是如果事件没有筹备好,这个事件能够间接返回,过一段时间再进行解决询问,这期间能够做其余事件。
Nginx 自身做的工作理论很少,当它接到一个 HTTP
申请时,它仅仅是通过查找配置文件将此次申请映射到一个 location block
,而此 location
中所配置的各个指令则会启动不同的模块去实现工作,因而模块能够看做 Nginx 真正的劳动工作者。
-
通常一个
location
中的指令会波及一个handler
模块和多个filter
模块(当然,多个location
能够复用同一个模块)。handler
模块负责解决申请,实现响应内容的生成;filter
模块对响应内容进行解决。