nginx配置之深入理解

继上一篇《debian+nginx配置初探--php环境、反向代理和负载均衡》成功之后,有点小兴奋,终于不用整lvs那么复杂来搞定负载,但还是有很多概念没弄清楚。

什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?

  • CGI全称是“通用网关接口”(Common Gateway Interface),其实我理解的是一个协议,它描述了客户端和HTTP服务器之间如何传输数据,因此它有各种语言的实现如perl、tcl等,php的实现就是php-cgi。而由于CGI的缺点:每一个连接都启动一个进程这造成CGI的性能低下,因此FastCGI应运而生。
  • FastCGI是CGI的一种改进协议,将CGI解释器进程保持在内存中,以此获得较高的性能。 CGI程序反复加载是CGI性能低下的主要原因,如果CGI程序保持在内存中并接受FastCGI进程管理器调度, 则可以提供良好的性能、伸缩性、Fail-Over特性等。
    一般情况下,FastCGI的整个工作流程是这样的:
    1. Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)。
    2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
    3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
    4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时, 请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
  • PHP-FPM和Spawn-FCGI都是FastCGI的PHP实现,前者比后者更优秀,可以有效控制内存和进程、可以平滑重载PHP配置。而Spawn-FCGI是lighttpd中的一部份,在PHP-FPM没出现之前是广泛使用的。
    php-fpm的命令选项:
    • start 启动php的fastcgi进程
    • stop 强制终止php的fastcgi进程
    • quit 平滑终止php的fastcgi进程
    • restart 重启php的fastcgi进程
    • reload 重新平滑加载php的php.ini
    • logrotate 重新启用log文件


Nginx配置中的Location语法 

由前一篇可以感性认识下location的用法,它的语法如下:

location [=|^~|~|~*] /uri/ { … }
  • = 开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
  • ~ 开头表示区分大小写的正则匹配
  • ~* 开头表示不区分大小写的正则匹配
  • !~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
  • / 通用匹配,任何请求都会匹配到。

多个location配置的情况下匹配顺序为: 首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

示例:

location = / {
   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
location ~* \.png$ {
   #规则E
}
location !~ \.xhtml$ {sudo /etc/init.d/nginx
用法: nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}
start 启动
stop 停止
restart 重启
reload 平滑重新加载
force-reload 强制重新加载,其实就是restart
status 查看状态
configtest 测试配置是否正确
   #规则F
}
location !~* \.xhtml$ {
   #规则G
}
location / {
   #规则H
}

那么产生的效果如下:

  • 访问根目录/, 比如http://localhost/ 将匹配规则A
  • 访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
  • 访问 http://localhost/static/a.html 将匹配规则C
  • 访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到规则C
  • 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
  • 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
  • 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

概念普及

  • 代理
    1. 标准的代理缓冲服务器
      一个标准的代理缓冲服务被用于缓存静态的网页(例如:html文件和图片文件等)到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号。客户端上网时,每次都把请求送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发给客户端浏览器。
    2. 透明代理缓冲服务器
      透明代理缓冲服务和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于Linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因为不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。
    3. 反向代理缓冲服务器
      反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于本地WEB服务器和Internet之间,处理所有对WEB服务器的请求,阻止了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。
  • 常见的Web负载均衡方法
    1. 用户手动选择方法
      这是一种较为古老的方式。通过在主站首页入口提供不同线路、不同服务器连接的方式,来实现负载均衡。这种方式在一些提供下载的网站中比较常见。
    2. DNS轮询方式
      大多域名注册商都支持对同一主机名添加多条A记录,这就是DNS轮询,DNS服务器将解析骑牛按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡。但DNS负载虽然成本低,但可靠性低,而且负载不够均衡。可以使用linux的dig命令来查看DNS负载。
    3. 四/七层负载均衡设备
      OSI模型的最低层或第一层:物理层物理层包括物理连网媒介,实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西。它规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。虽然物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率。物理层定义的标准包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45等。
      OSI模型的第二层:数据链路层 数据链路层主要作用是控制网络层与物理层之间的通信。它保证了数据在不可靠的物理线路上进行可靠的传递。它把从网络层接收到的数据分割成特定的可被物理层传输的帧,保证了传输的可靠性。它的主要作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。它是独立于网络层和物理层的,工作时无需关心计算机是否正在运行软件还是其他操作。数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。
      OSI模型的第三层:网络层很多用户经常混淆2层和3层的相关问题,简单来说,如果你在谈论一个与IP地址、路由协议或地址解析协议(ARP)相关的问题,那么这就是第三层的问题。网络层负责对子网间的数据包进行路由选择,它通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中两个节点的最佳路径。另外,它还可以实现拥塞控制、网际互连等功能。网络层协议的代表包括:IP、IPX、RIP、OSPF等。
      OSI模型的第四层:传输层传输层是OSI模型中最重要的一层,它是两台计算机经过网络进行数据通信时,第一个端到端的层次,起到缓冲作用。当网络层的服务质量不能满足要求时,它将提高服务,以满足高层的要求;而当网络层服务质量较好时,它只需进行很少的工作。另外,它还要处理端到端的差错控制和流量控制等问题,最终为会话提供可靠的,无误的数据传输。传输层协议的代表包括:TCP、UDP、SPX等。
      OSI模型的第五层:会话层会话层负责在网络中的两节点之间建立和维持通信,并保持会话获得同步,它还决定通信是否被中断以及通信中断时决定从何处重新发送。
      OSI模型的第六层:表示层表示层的作用是管理数据的解密与加密,如常见的系统口令处理,当你的账户数据在发送前被加密,在网络的另一端,表示层将对接收到的数据解密。另外,表示层还需对图片和文件格式信息进行解码和编码。
      OSI模型的第七层:应用层简单来说,应用层就是为操作系统或网络应用程序提供访问网络服务的接口,包括文件传输、文件管理以及电子邮件等的信息处理。应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。
      OSI模型和TCP/IP模型的关系:

      硬件四/七层负载交换机一般有F5 BIG-IP、Citrix NetScaler、Radware、Cisco Css、Foundry等;软件四层负载的代表作是LVS;软件七层负载大多基于HTTP的反向代理,如Nginx、L7SW、HAProxy等。
    4. 多线多地区智能DNS解析与混合负载均衡方式
      以新浪首页为例,负载均衡同时用到了“多线多地区智能DNS解析、DNS轮询、四/七层负载均衡交换机”等技术。智能DNS解析能够根据用户本地设置的DNS服务器线路和地区,将对同一个域名请求解析到不同的IP上。

启动

可以使用

sudo /etc/init.d/nginx

用法

nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}
  • start 启动
  • stop 停止
  • restart 重启
  • reload 平滑重新加载
  • force-reload 强制重新加载,其实就是restart
  • status 查看状态
  • configtest 测试配置是否正确

可以查看"/etc/init.d/nginx"看具体含义。

posted @ 2014-09-25 15:52  码农神说  阅读(254)  评论(0编辑  收藏  举报