Nginx配置详解

模块说明

Nginx配置文件中分了五块区域
分别是全局块、events块、http块、server全局块、location块
布局如下图:
在这里插入图片描述

全局块

此部分配置会影响Nginx全局

  1. 配置用户名
  2. 启动的进程数
  3. 错误日志存放路径
  4. pid文件存放路径

events块

主要影响Nginx服务器与用户的网络连接

  1. 设置工作模式
  2. 单进程最大并发链接数
  3. 网络连接序列化
  4. 设置一个进程能否同时接受多个网络连接

http块

进行http的相关参数配置

  1. 引入配置文件
  2. 服务日志
  3. 允许sendfile方式传输文件
  4. 设置单连接请求上限

server块

一个虚拟主机,需要配置域名、端口,只处理对应主机域名的http请求,可同时包含多个location块

  1. 监听的端口或ip地址加端口等
  2. 主机名称 基于主机名或ip的虚拟主机配置,用于与http请求header头的Host匹配

location块

http请求对应的路径设置

  1. location配置
  2. 网站默认页配置
  3. 更改location的uri

FastCGI

CGI全称是“通用网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序一般运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

Nginx+FastCGI运行原理

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。
在这里插入图片描述

参数详解

Nginx配置:
//全局块
user www-data;   //用户
worker_processes 1   //启动进程数 最好与cpu数量相等
error_log  logs/error.log //错误日志存放 可以放在全局块、http块、server块
pid  run/nginx.pid   //nginx是系统的守护进程,需要在某文件中保存当前程序的主进程号,nginx支持该保存文件路径的自定义,若不指定,默认路径为logs/nginx.pid

//events块 主要影响Nginx服务器与用户的网络连接
设置工作模式
events {
   use epoll;   //epoll是多路复用IO 用在linux2.6以上的内核,可以大大提高nginx性能  查看Linux内核版本 cat /proc/version  事件驱动模型的选择,包括select、poll、epoll、kqueue、rtsig等
   worker_connections 1024 单个worker_processes进程的最大并发链接数
   accept_mutex on  //设置网络连接序列化,防止惊群现象发生,默认即为on (惊群现象指的是一个请求过来将多个睡眠的进程被叫醒,但只有一个进程能获得链接,影响了性能)
   multi_accept on  //设置一个进程能否同时接受多个网络连接,默认为off(一个进程同时接受多个网络连接会有怎样的影响?)
}

http{
include mime.types    //引入配置文件,mime.types是网络资源的媒体类型,前端请求的资源类型
access_log on;    //服务日志也叫访问日志 可以查到用户的地址 主要用于分析用户的浏览行为
sendfile on;   
sendfile_max_chunk  size    //允许sendfile方式传输文件,默认为off,可放在http块、server块、location块。size表示能传输的最大数据不能超过size,size = 0表示不限制,默认为0
keepalive_timeout timeout [header_timeout]   //可放在http块、server块、location块。timeout表示服务端对连接的保持时间 默认为75秒   header_timeout 为可选项,表示在应答报文头部的keep-alive域设置超时时间: Keep-Alive:timeout=header_timeout
keepalive_requests number  //单连接请求数上限
}

server {
listen IP / listen IP:PORT /listen PORT 监听ip上所有端口的连接/…
server_name name1 name2  基于名称和IP的虚拟主机配置

location [ = | ~ | ~* | ^~ ] uri {...}   // ‘=’表示请求字符串与uri严格匹配,一旦匹配成功则停止;’~’用于正则uri前,区分大小写;’~*’用于正则uri前,不区分大小写;’^~’用于标准uri前,要求nginx找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配

location ~ \.php$ {
	root  html;
    #fastcgi_pass 127.0.0.1:9000;    FastCGI进程监听的IP地址和端口
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;   
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;   # fastcgi_param指令指定放置PHP动态程序的主目录,也就是$fastcgi_script_name前面指定的路径,这里的$document_root 指的是root指定的路径
    include fastcgi_params;   #fastcgi_params文件是FastCGI进程的一个参数配置文件,在安装Nginx后,会默认生成一个这样的文件,这里通过include指令将FastCGI参数配置文件包含了进来。
    }

}

备注

配置文件Mime-types:包含了各种浏览器能识别的mime类型以及对应类型的文件后缀名
在这里插入图片描述

名词解释

惊群效应

惊群现象指的是一个请求过来将多个睡眠的进程被叫醒,但只有一个进程能获得链接,影响了性能。