Web服务器?
Nginx是一种Web服务器,那么什么是Web服务器呢?
Web服务器是可以向发出请求的浏览器提供文档的程序:
Web服务器,是指驻留于互联网上某种类型计算机的程序。当Web浏览器(客户端)连到Web服务器上,并请求文件时,Web服务器将处理该请求,并将文件发送反馈到Web浏览器上,附带的信息会告诉Web浏览器如何查看该文件。由于Web服务器,使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,所以人们常把它们称为“HTTP服务器”。
也就说时候,我们日常在网上使用http开头的网址来访问网站都依赖于Web服务器来处理我们的请求,Web服务器是来专门处理HTTP请求(request)。
Web服务器的工作就简单的四个步骤:连接过程、请求过程、应答过程以及关闭连接。
目前主流的Web服务器有IIS,Apache,Nginx。
区分Web容器和Web服务器:
容器:容器是中间件的一种,作为操作系统和应用程序之间的桥梁,给处于其中的应用程序组件提供一个环境,使应用程序直接跟容器中的环境变量交互,而不必关注其它系统问题。例如:tomcat(servlet容器),Jboss(EJB容器)。这些容器提供的接口严格遵守J2EE规范中的web application 标准。
web容器:我们把遵守J2EE规范标准的web服务器就叫做J2EE中的web容器。处理 web服务的容器,例如tomcat(servlet容器),IIS(asp容器)。web容器用于给处于其中的应用程序组件(ASP、JSP)提供一个环境,是中间件的一个组成部分,它实现了对动态语言的解析。比如tomcat可以解析jsp,是因为其内部有一个servlet容器。
Nginx是什么?
nginx是一个轻量级的Web服务器,他可以处理HTTP请求,给客户端返回文档。除此之外,还可以处理IMAP/POP3 代理服务(邮件)。除此之外,他还是一个反向代理、负载平衡服务器。
下文主要讲nginx在处理HTTP请求过程的工作流程。
Nginx在HTTP请求处理过程中扮演的角色:
它可以把静态文件的请求直接返回静态文件资源,把动态文件的请求转发给后台的处理程序,例如php-fpm、apache、tomcat、jetty等
那么这里Nginx是如何跟两边进行通信的呢?
跟客户端通信
客户端与Nginx之间的连接是遵循http协议的。Nginx会监听http端口,Nginx运行在服务器上,只能等待客户端的被动连接,进行三次握手后建立连接。
HTTP 连接建立和请求处理过程:
- Nginx 启动时,创建Master 进程,加载配置文件
- Master 进程,初始化监听的 socket
- Master fork 出数个Worker 进程,竞争新的连接,获胜方通过三次握手(一个请求只能在一个worker中处理),建立 Socket 连接,并处理请求
1、master进程:管理进程
master进程主要用来管理worker进程,具体包括如下4个主要功能:
(1)接收来自外界的信号。
(2)向各worker进程发送信号。
(3)监控woker进程的运行状态。
(4)当woker进程退出后(异常情况下),会自动重新启动新的woker进程。
master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
2、worker进程:处理请求
每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。
而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之
间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置
的,一般我们会设置与机器cpu核数一致
每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。
跟服务提供方通信
下文主要从nginx与PHP后端通信为例说明:
- FastCGI
FastCGI是一个在HTTP服务器和动态脚本语言间通信的接口,主要优点是把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx和lightpd。
同时,FastCGI也被许多脚本语言所支持,如PHP。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程执行,然后将得到的结构返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端。
- Nginx + FastCGI
Nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。
- Nginx+PHP-FPM
PHP-FPM是管理FastCGI的一个管理器,它作为PHP的插件存在。
- 整体工作流程:
1)、FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程。
主进程php-fpm主要是管理fastcgi子进程,监听9000端口。
fastcgi子进程等待来自Web Server的连接。
2)、当客户端请求到达Web Server Nginx是时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理。
3)、FastCGI进程管理器PHP-FPM选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。
4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。
5)、FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。
示例:Nginx配置运行php: 编辑nginx.conf加入如下配置:
server {
listen 80;
server_name foo.com;
root /path;
location / {
index index.html index.htm index.php;
if (!-e $request_filename) {
rewrite . /index.php last;
}
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
}