Nginx

Nginx简介

  1. 什么是 Nginx
    Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,是 一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致 认为它是 Apache2.2+mod_proxy_balancer 的轻量级代替者,不仅是因为响应静态页面的速 度非常快,而且它的模块数量达到 Apache 的近 2/3。对 proxy 和 rewrite 模块的支持很 彻底,还支持 mod_fcgi、ssl、vhosts ,适合用来做 mongrel clusters 的前端 HTTP 响应。
  2. 选择 Nginx 的理由
    第一,它可以支持 5W 高并发连接;
    第二,内存消耗少;
    第三,成本低。
  3. Nginx 的作用
    网关 —面向客户的总入口。
    虚拟主机 —一台机器为不同的域名/ip/端口提供服务
    路由 —使用反向代理,整合后续服务为一个完整业务
    静态服务器 —mvvm 模式中,用来发布前端 html/css/js/img
    负载集群 —使用 upstream,负载多个 tomcat

Nginx架构设计

  1. Nginx 模块化设计
    高度模块化的设计是 Nginx 的架构基础。Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。
    Nginx模块图
  • 核心模块
    核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、 事件驱动机制、进程管理等核心功能。
  • 标准 HTTP 模块
    标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。
  • 可选 HTTP 模块
    可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如: Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。
  • 邮件服务模块
    邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
  • 第三方模块
    第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。
  1. Nginx 多进程模型
    在这里插入图片描述
    1、服务器每当收到一个客户端时。就有服务器主进程(master process)生成一个子进程 (worker process)出来和客户端建立连接进行交互,直到连接断开,该子进程结束。
    2、优点
    2.1、各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响, 同时降低编程的复杂度,降低开发成本。
    2.2、采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时, 其它进程正常工作,master 进程则很快启动新的 worker 进程,确保服务不中断,将风险 降到最低。
    3、缺点
    操作系统生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定 的开销;当有大量请求时,会导致系统性能下降。
  2. Nginx epoll 模式
    在这里插入图片描述
    select 和 poll 的处理模式如上图:
    –在某一时刻,进程收集所有的连接,其实这几十或上百万连接中大部分是没有事件发 生的。因此,如果每次收集事件时,都把这几十或上百万连接的套接字传给操作系统(这 首先就是用户态内存到内核内存的大量复制),而由操作系统内核寻找这些链接 上没有处理的事件,将会是巨大的浪费。
    而 epoll 改进了收集连接的动作,提高效率。
    epoll 的优点:
    1.支持一个进程打开大数目的 socket 描述符(FD)
    2.IO 效率不随 FD 数目增加而线性下降
    3.使用 mmap 加速内核与用户空间的消息传递
  3. 正向代理与反向代理
    1、代理:意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始 服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服 务器转交请求并将获得的内容返回给客户端。
    2、反向代理,服务端推出的一个代理招牌。

Nginx安装配置

1、源码编译方式:
安装 make:yum -y install autoconf automake make
安装 g++: yum -y install gcc gcc-c++
#一般系统中已经装了了 make 和 g++,无须再装
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum install -y openssl openssl-devel
#安装 nginx 依赖的库
wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar -zxvf nginx-1.15.8.tar.gz cd nginx-1.15.8
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#配置 #–prefix 指定安装目录
#–with-http_ssl_module 安装 https 模块
#creating objs/Makefile 代表编译成功
make && make install
#make 编译
#make install 安装

2、Nginx 目录结构:

  • Conf 配置文件
  • Html 网页文件
  • Logs 日志文件
  • Sbin 二进制程序

3、Nginx 常用命令
启停命令: ./nginx -c nginx.conf 的文件。如果不指定,默认为 NGINX_HOME/conf/nginx.conf
./nginx -s stop 停止
./nginx -s quit 退出
./nginx -s reload 重新加载 nginx.conf

Nginx模型概念

Nginx 会按需同时运行多个进程:

一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。
所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。
主进程以 root 用户身份运行,而 worker、cache loader 和 cache manager 均应以非特权用 户身份(user 配置项)运行。

主进程主要完成如下工作:

  1. 读取并验正配置信息;
  2. 创建、绑定及关闭套接字;
  3. 启动、终止及维护 worker 进程的个数;
  4. 无须中止服务而重新配置工作特性;
  5. 重新打开日志文件;

worker 进程主要完成的任务包括:

  1. 接收、传入并处理来自客户端的连接;
  2. 提供反向代理及过滤功能;
  3. nginx 任何能完成的其它任务;

nginx.conf配置文件结构

在这里插入图片描述
#user nobody; #主模块命令, 指定 Nginx 的 worker 进程运行用户以及用户组,默认由 nobody 账号运行。
worker_processes 1;#指定 Nginx 要开启的进程数。
worker_rlimit_nofile 100000; #worker 进程的最大打开文件数限制
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
以上这块配置代码是对 nginx 全局属性的配置。
user :主模块命令, 指定 Nginx 的 worker 进程运行用户以及用户组,默认由 nobody 账号运行。
worker_processes: 指定 Nginx 要开启的进程数。
error log:用来定义全局错设日志文件的路径和日志名称。 日志输出级别有 debug,info,notice,warn,error,crit 可供选择, 其中 debug 输出日志最为详细,面 crit(严重)输出日志最少。默认是 error
pid: 用来指定进程 id 的存储文件位置。
event:设定 nginx 的工作模式及连接数上限,
其中参数 use 用来指定 nginx 的工作模式(这里是 epoll,epoll 是多路复用 IO(I/O Multiplexing)中的一种方式),
nginx 支持的工作模式有 select ,poll,kqueue,epoll,rtsig,/dev/poll。
其中 select 和 poll 都是标准的工作模式,kqueue 和 epoll 是高效的工作模 式,对于 linux 系统,epoll 是首选。
worker_connection 是设置 nginx 每个进程最大的连接数,默认是 1024,所以 nginx 最大的连接数max_client=worker_processes*worker_connections
进程最大连接数受到系统最大打开文件数的限制,需要设置 ulimit。
下面部分是 nginx 对 http 服务器相关属性的设置
http {
include mime.types; 主模块命令,对配置文件所包含文件的设 定,减少主 配置文件的复杂度,相当于把部分设置放在别的地方,然后在包含进来,保持主 配置文件的简洁
default_type application/octet-stream; 默认文件类型,当文件类型未定义时候就 使用这类设置的。
#log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Expected 'EOF', got '#' at position 32: …inx 日志的格式 #̲ 'status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
# ‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”’;
#access_log logs/access.log main;
sendfile on; 开启高效文件传输模式(zero copy 方式),避免内核缓冲区 数据和用户缓冲区数据之间的拷贝。
#tcp_nopush on; 开启 TCP_NOPUSH 套接字(sendfile 开启时有用)
#keepalive_timeout 0; 客户端连接超时时间
keepalive_timeout 65;
#gzip on; 设置是否开启 gzip 模块
}
下面是 server 段虚拟主机的配置
server {
listen 80; 虚拟主机的服务端口
server_name localhost; 用来指定 ip 或者域名,多个域名用逗号分开
#charset koi8-r;
location / {
#地址匹配设置,支持正则匹配,也支持条件匹配,这里是默认请求地址,用户可以location 命令对 nginx 进行动态和静态网页过滤处理
root html; 虚拟主机的网页根目录
index index.html index.htm; 默认访问首页文件
}
#error_page 404 /404.html;
#redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

路由Location使用

1、Location 语法规则
语法规则: location [=|~|~*|^~] /uri/ {… } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用 匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

符号含义
== 开头表示精确匹配
^~^~开头表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可(禁止正则匹配)
~~ 开头表示区分大小写的正则匹配
~*~* 开头表示不区分大小写的正则匹配
!和!*!和!*分别为区分大小写不匹配及不区分大小写不匹配的正则
/用户所使用的代理(一般为浏览器)

匹配规则优先级如下:
在这里插入图片描述

  1. =精准匹配命中时,停止 location 动作,直接走精准匹配
  2. 一般匹配(含非正则)命中时,先收集所有的普通匹配,最后对比出最长的那一条
  3. 如果最长的那一条普通匹配声明为非正则,直接此条匹配,停止 location
  4. 如果最长的那一条普通匹配不是非正则,继续往下走正则 location
  5. 按代码顺序执行正则匹配,当第一条正则 location 命中时,停止 location

2、path匹配过程
在这里插入图片描述
假设 http 请求路径为
http://192.168.88.88:8088/mvc/index?id=1 ,匹配过程如下:

  1. 将整个 url 拆解为域名/端口/path/params
  2. 先由域名/端口,对应到目标 server 虚拟主机
  3. path 部分参与 location 匹配,path = path1 匹配部分 + path2 剩余部分
  4. 进入 location 方法体内部流程。
  5. 若是静态文件处理,则进入目标目录查找文件:root 指令时找 path1+path2 对应的文 件;alias 指令时找 path2 对应的文件
  6. 若是 proxy 代理,则形如 proxy_pass=ip:port 时转发 path1+path2 路径到 tomcat;形如 proxy_pass=ip:port/xxx 时 转 发 path2 路 径 到 tomcat。params 始 终 跟 随 转 发 。

rewrite 使用

rewrite regex replacement [flag];
flag=【break/last/redirect/permanent】

  1. regex 是正则表达式
  2. replacement 是替换值,新值
  3. flag – 后续处理标识
  • flag=break
    发生 nginx 内部重定向,path 值被更新,rewrite 层面的命令会中断。原控制流程逻辑不变往下走
  • flag=last
    发生 nginx 内部重定向,path 值被更新,rewrite 层面的命令会中断。控制流程刷新,重新进 行整个 location 层的逻辑流程。
  • flag= redirect/permanent
    发生页面重定向(301 永久重定向/302 临时重定向),nginx 流程结束,返回 http 响应到浏览 器,页面 url 更新
  • flag 为空
    发生 nginx 内部重定向,path 值被更新,rewrite 层面的命令继续。最后一个 rewrite 完毕, 刷新控制流程,重新进行 location 重匹配

upstream–负载

语法格式:
upstream 负载名 {
[ip_hash;] server ip:port [weight=数字] [down];
server ip:port [weight=数字];
}
[]内容为可选项

  1. 轮询(默认)
    upstream order {
    server 192.168.88.88:8000;
    server 192.168.66.66:8000;
    }
    不配置 weight(即默认 weight 均为 1)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
  2. weight
    upstream order {
    server 192.168.1.12:8000 weight=3;
    server 192.168.2.23:8000 weight=1 down;
    }
    指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 down 暂时不参与负载
  3. ip_hash
    upstream order {
    ip_hash;
    server 192.168.1.18:8000;
    server 192.168.2.33:8000;
    }
    每个请求按访问 ip 的 hash 结果分配,这样同一客户端的请求总是发往同一个后端服务器, 可以解决 session 的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值