nginx 从入门到入坑
nginx 基本概念
Nginx(发音同 engine x)是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个 BSD-like 协议下发行,可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及 Microsoft Windows 等操作系统中运行。
Nginx 由俄罗斯的程序设计师 Igor Sysoev 所开发,最初供俄国大型的入口网站及搜寻引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强(用于解决 C10K 问题),事实上 nginx 的并发能力确实在同类型的网页服务器器中表现较好。
nginx 原理
master 和 worker
nginx在启动后,会有一个master进程和多个worker进程。
master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程异常退出后,,会自动重新启动新的worker进程。
而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致
一个master 和多个 worker 的好处
1 可以使用 nginx -s reload 热部署,利用 nginx 进行如部署操作
2 每个worker 是独立的进程,如果一个出问题,其他的独立worker 还能继续工作,实现请求过程,不会造成服务中断。
nginx优点
1 .高并发。静态小文件
2 占用资源少。2万并发、10个线程,内存消耗几百M。
3 功能种类比较多。web,cache,proxy。每一个功能都不是特别强。
4 支持epoll模型,使得nginx可以支持高并发。
5 nginx 配合动态服务和Apache有区别。(FASTCGI 接口)
6 利用nginx可以对IP限速,可以限制连接数。
7 配置简单,更灵活。
nginx配置文件
第一部分 全局块
设置一些影响nginx 服务器整体运行的配置指令
worker_processes 1;
nginx 服务器并发处理服务的关键配置,worker_processes 值越大可支持的并发处理数量也越多,但是会受到硬件,软件等设备的制约
第二部分 events
涉及的指令主要影响 nginx 服务器与用户的网络连接
第三部分 http块
1 http 全局快
http 全局块配置的指令包括 文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求数上限等。
2 server
这块与虚拟主机有密切关系,每个server块相当于一个虚拟主机
每个server块可以分为 全局server块 以及可以同时包括多个 location
(1) 全局server 块
最常见的配置是本虚拟机 主机的监听配置和 本虚拟 主机的名称 以及 IP
(2) location
一个server 可以配置多个 location 块
主要是 基于 nginx 服务器收到的请求 字符串(),对虚拟主机名称(也可以是IP 别名)之外的的字符串进行匹配,对特定的请求进行处理。地址定向,数据缓存和应答控制等功能,还有许多第三方模块的配置
nginx 常用用途
1 正向代理
所谓正向代理就是顺着请求的方向进行的代理,即代理服务器他是由你配置为你服务,去请求目标服务器地址。
2 反向代理
所谓反向代理正好与正向代理相反,代理服务器是为目标服务器服务的,虽然整体的请求返回路线都是一样的都是Client到Proxy到Server。
3负载均衡
单个服务器解决不了,我们增加服务器的数量,让后将请求分发到各个服务器上,将原先分发到单个服务器上的内容,分发到多个系统,这就是我们说的负载均衡
ngnix 的负载均衡 策略:
1 轮询 (默认)
2 weight 权重
默认为1 权重 越高 分配的用户就越多
3 ip_hash
每个请求按照访问的ip 的hash 结果分配。这样 每个访客固定访问一个服务器 ,可解决 session 的问题,
直接在 upstream server_poll {
ip_hash
}
4动静分离
动静分离,通过中间件将动静分离和静态请求进行分离;
通过中间件将动态请求和静态请求分离,可以减少不必要的请求消耗,同时能减少请求的延时。
通过中间件将动态请求和静态请求分离
动静分离是指,静态页面与动态页面解耦分离,用不同系统承载对应流量的架构设计方法。
nginx高可用
准备工作
1 需要多台 nginx
2 需要 虚拟 IP
3 需要 keepalived