nginx初探

什么是Nginx

Nginx(读 engine X)是一个使用C语言实现的跨平台的Web服务器,可运行在多操作系统平台上,并且可使用当前操作系统的一些高效API来提升自己的性能。同时,Nginx基于事件驱动的架构实现,能处理百万级的TCP连接,并且高度模块化,这样就使其形成了一个平台,基于此开发了许多第三方模块。

为什么选择Nginx

选择nginx的原因主要在于以下几个特点:

高性能:Nginx完全使用C语言进行开发,采用事件驱动模型,对操作性进行了特别优化,可无阻塞处理海量并发

高扩展:基于Nginx使用模块化的架构设计,其内部是由各个不同层级、同功能、不同类型的功能模块组合而成,对于模块的修改或升级,都可以专注于本模块,无需关注其他模块的耦合。同时其他开发者可以开发新的模块,Nginx框架允许其充分利用其提供的各种高效机制,使其完美融合到Nginx现有框架中。这就造就了庞大的第三方模块,满足日常需求,同时自己也可以按照自己业务逻辑进一步开发。我还看中了一个,目前Nginx还有一个良好的lua(后期对该脚步进行介绍)脚本语言开发环境,代表有:Openresty

低内存消耗:由于代码的质量高,同时没有使用像传统的多线程编程,这样就没有了进程和线程切换成本,资料查得一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存

高可靠:Nginx内部使用内存池分配资源,避免了C常见的资源泄漏问题;同时模块化的设计使得各个功能完全解耦合;另一重大优势在于使用one master/multi workers进程池设计原则,保证工作进程的任何错误不影响整个系统的运行,同时master可以快速启动新的worker来提供稳定服务

安装

对于前期我们作为使用,并不进行模块开发,可以直接进行安装编译好的版本

Windows安装

可直接到官网进行相应版本下载,解压即可

Mac安装

方法1:可以用brew很方便地安装Nginx

方法2:通过源码编译进行安装

到官网下载 包,解压之后进入目录,运行

运行命令

本文基于mac系统进行运行,各平台除路径不一定相同外,其他操作均一致

启动和停止服务

使用默认配置启动

启动指定配置选项

-c参数指定配置文件来启动Nginx

指定工作目录启动

-p用来设置工作目录,参数后接路径

发送信号命令

-s可以快速停止或重启Nginx,参数后接信号,可以是:stop,quit,reload,reopen

测试配置信息是否粗五

-t测试配置文件是否正确

显示版本信息

-v显示Nginx的版本信息,-V显示完全版本信息

验证安装

如果已经启动了Nginx服务器,可以通过浏览器网页进行访问进行测试,也可以通过命令行工具curl进行测试。如此时默认配置开启了localhost:80服务,

浏览器访问

浏览器输入地址http://127.0.0.1:8914/

curl访问

查看nginx进程信息

在类Unix系统下可使用如下命令

从ps的输出我么可以看到当前两个Nginx进程,其中进程号为50934的是master进程,50935的为worker进程

配置Nginx

配置文件介绍

Nginx的配置文件(nginx.conf)决定了Nginx的进程数量、日志信息、反向代理、请求处理等多方面的信息。启动的时候加载配置文件,通过配置信息调用不同的模块和运行参数

进程配置

以下三个进程配置只能在全局域中进行配置:

用于设置工作进程的个数,通常设置为当期CPU核心数,这样能达到性能最佳,以让工作进程和CPU核心一一对应上,默认值为1,如果不清楚当前服务器的核心数量,可以设置为auto,Nginx会自动进行获取并设置

是否启动Nginx的进程池机制,默认为on。如果设置为off,那么Nginx就不会创建master进程,只会用默认的一个工作进程进行处理,同时上面设置的worker_processes也会无效,并发处理能力就会大打折扣,此处可以在调试的时候进行设置为off,其他场景建议不要使用

是否以守护进程的方式进行运行,默认为on,多数情况是运行在后台。当我们需要进行调试或需要获取调试信息的时候可禁用,方便再控制台进行日志输出

events配置

配置影响Nginx服务器或与用户的网络连接。每个进程的最大连接数、选取哪种事件驱动模型处理连接请求、是否允许同时接受多个网路连接和开启多个网络连接序列化等

http配置

可以嵌套多个server、配置代理、缓存、日志定义等,绝大多数功能和第三方模块的配置。

Nginx几乎90%的功能都是提供http服务,所以http块的配置也是异常复杂,几乎整个配置文件都是它的领地。一般模式如下:

一般http块的内容较多,可以通过include引入子配置(将server、location等配置分离成单独文件),这样可以降低配置复杂度

server配置

在http块中使用server指令定义一个虚拟主机,通过指令来确定域名、端口等参数

通过keepalive_timeout设置keepalive的超时时间,通常用于客户端复用HTTP的长链接,提高服务器的性能,如果希望发送完后就主动断开,那么就设置为0即可

通过listen来设置虚拟主机监听端口,默认80

通过server_name设置虚拟主机对外的主机名称

location配置

location相当于虚拟主机的虚拟目录,Nginx再成功陪陪虚拟主机后,会继续查找虚拟目录(location块)以确定请求如何处理

location 使用配置文件里的uri参数匹配HTTP请求行里的URI, 默认是前缀匹配,也支持正则表达式。 使用几个前缀来做进一步的匹配限定:

=: URI必须完全匹配

~: 大小写敏感匹配

~*: 大小写不敏感匹配

^~: 匹配前半部分即可

@: 用于内部子请求,外部无法访问

upstream配置

该配置主要用在反向代理时访问服务器集群和负载均衡策略,结合server节点下的location中的proxy_pass配置。其配置方式如下:

对于负载均衡除了默认的轮询还有其他几种方式进行分配:

轮询(默认)分配

weight(加权轮询)分配:通过指定权重进行比率分配,当服务器性能参差不齐时进行几率轮询

ip_hash(通过请求访问ip的hash结果进行映射)分配:每一个客户端固定访问一个后端服务器,这样就可以确保session的问题

backup 热备:如果有两台服务器,当一台服务器发生故障时, 才启动第二台服务器提供服务

关于nginx负载均衡配置的几个状态参数讲解

down,表示当前的server暂时不参与负载均衡。

backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

maxfails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxynext_upstream 模块定义的错误。

failtimeout,在经历了maxfails次失败后,暂停服务的时间。maxfails可以和failtimeout一起使用。

欢迎关注交流共同进步

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180606G24NKV00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券