什么是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一起使用。
欢迎关注交流共同进步
领取专属 10元无门槛券
私享最新 技术干货