1.nginx概念

关于nginx简介

Nginx是一款轻量级、高性能的Web 服务器/反向代理服务器,处理静态页面的高并发性能非常好,内存少,并发能力强,配置简单,通过80端口与客户端通信

所有的web服务安装好后默认的网页服务端口号都是80,如果你的电脑中已经安装有某种Web 服务器,必须先修改前者默认的网页服务端口80,否则可能会无法完成安装

主要作为高性能的 Web 和反向代理服务器

使用用户

中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

淘宝使用的web服务器是基于nginx二次开发的Tengine

nginx官网 : http://nginx.org/en/download.html

Tengine官网: https://tengine.taobao.org/

关于nginx功能

  • 主要强大之处还是体现在作为web服务器上,作为web服务器可支持稳定情况下25000的并发和高峰28000的并发量,官方测试最大可达50000个连接量
  • 负载均衡
  • 反向代理

与Apache相比

  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率
  • 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务
  • 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多
  • Nginx 安装非常的简单,配置文件非常简洁,Bugs非常少,Nginx 启动容易,几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。能够在不间断服务的情况下进行软件版本的升级
  • nginx :异步非阻塞和nginx——epoll模型(实现高并发);apache:阻塞型和apache—select模型
  • 最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

业务使用方向

  • 反向代理服务器

  • 负载均衡服务器

  • web服务器

  • 前端业务的缓存服务器proxy_cache

nginx目录下的文件

  • html 站点根目录
  • conf 配置文件目录
  • sbin 启动命令的目录
  • logs 日志目录

nginx命令

检查配置文件
nginx -t   
显示版本信息
nginx -v   
关闭
killall -9 nginx
重载配置文件
nginx -s reload
启动
nginx
检测端口
netstat -anput | grep 80
检测进程
ps -ef | grep nginx
访问网站
curl -l www.baidu.com
查看网站web服务程序版本
curl -I  ww.baidu.com 

nginx配置文件

关于配置文件结构:########### 每个指令必须有分号结束 #################
#全局块-----配置影响nginx全局的指令
#user administrator administrators;                      #配置用户或者组,默认为nobody nobody。
#worker_processes 2;                                     #允许生成的工作进程数,默认为1,一核一进程
#pid /nginx/pid/nginx.pid;                               #指定nginx进程运行文件存放地址
error_log log/error.log debug;                           #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

#events块------配置影响nginx服务器或与用户连接的内容
events {
    accept_mutex on;                                     #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;                                     #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;               #事件驱动模型,select|poll|kqueue|epoll异步非阻塞|resig|/dev/poll|eventport
    worker_connections  1024;                            #每个进程的最大连接量,默认为512
}

#http块-----配置大部分的功能和第三方模块
http {
    include       mime.types;                            #文件扩展名与文件类型映射表,支持网页的类型
    default_type  application/octet-stream;              #默认文件类型,默认为text/plain
    #access_log off;                                     #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';        #自定义格式
    access_log log/access.log myFormat;                       #combined,为日志格式的默认值
    sendfile on;                       #允许sendfile方式传输文件,默认为off,开启高效传输
    sendfile_max_chunk 100k;           #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
    keepalive_timeout 65;              #长连接超时时间,默认为75s,可以在http,server,location块

upstream mysvr {                       #负载均衡名称
    server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
    server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1; 
    #server 127.0.0.1:7878 backup;     #备份设备,当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器
    #server 127.0.0.1:7878 down;       #表示当前的server暂时不参与负载均衡
    #ip_hash;                           #使用IP哈希策略
    #url_hash;                         #使用url哈希策略
}
#max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
#fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
#weight=2权重

    error_page 404 https://www.baidu.com;              #错误页

#server块
 server {
        keepalive_requests 120;                        #单连接请求上限次数。
        listen       4545;                             #监听端口可以在端口前加IP地址,这样就监听了指定的主机
        server_name  127.0.0.1;                        #监听地址       

#location块
        location  ~*^.+$ {                             #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写
           #root path;                                 #根目录
           #index vv.txt;                              #设置默认页
           proxy_pass  http://mysvr;                   #请求转向mysvr,定义的服务器列表
           deny 127.0.0.1;                             #拒绝的ip
           allow 172.18.5.54;                          #允许的ip           
                               } 
                                   }
                                       }

配置文件的理解

  • 总的来说我们配置的大部分的功能都是通过http模块实现的,一个配置文件可以有多个http模块,而http模块(用来处理http协议相关内容)下可以有多个server模块(用于处理定义虚拟主机相关信息),server模块下可以有多个location模块(用来处理请求和定义路径,默认的首页等等,具体执行的模块,但是location模块的路径不能重复,否则报错)
  • 注:在执行配置文件时执行顺序,会从上而下,优先执行上面的命令,然后执行下面的命令

location的正则匹配顺序

1.nginx概念_第1张图片

location的root和alias

root的处理结果是:root路径 + location路径
alias的处理结果是:使用alias路径替换location路径

# 如果一个请求的URI是/y/a.html时,匹配到y路径的location,然后使用root路径加上location的y路径,寻找a.html
location ^~ /y/ {
	root /www/root/html/;
}
#web服务器返回: 服务器上的/www/root/html/y/a.html的文件


# 如果一个请求的URI是/t/d.html时,匹配到t路径的location,然后直接使用alias路径寻找d.html
# alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录,使用alias时,目录名后面一定要加"/"
location ^~ /t/ {
	alias /www/root/html/09/;
}
#web服务器返回: 服务器上的/www/root/html/09/d.html的文件

请求解析流程

  • nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址

工作模式

Nginx工作模式简介
nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

Nginx两种工作模式
1、master-worker模式
master-worker模式下nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式。

优点:
1)稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。

2)配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能

3)处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务

2、单进程模式
单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。

优点:
单进程模式由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。

缺点:
单进程模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务

异步非阻塞

异步:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者
非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回
nginx的异步非阻塞:首先是非阻塞,当nginx使用一个线程处理io,如果这个io响应很慢,那么nginx会把这个放到一个队列,这个线程返回,不会因为这一个io一直处理,阻塞工作占用资源,会先去处理别的请求;然后是异步,当着个io处理好了之后通知nginx,nginx继续,这是异步

阻塞和非阻塞:
阻塞和非阻塞指的是执行一个操作是等操作结束再返回,还是马上返回。

举个例子:用户就是餐客/nginx是饭店/线程是服务员/状态、通知和回调是传菜员
比如餐馆的服务员为用户点菜,当有用户点完菜后,服务员将菜单给后台厨师,此时有两种方式:

第一种,阻塞方式:就在出菜窗口等待,直到厨师炒完菜后将菜送到窗口,然后服务员再将菜送到用户手中;
第二种,非阻塞的:等一会再到窗口来问厨师(状态、通知和回调),某个菜好了没?如果没有先处理其他事情,等会再去问一次;


同步和异步:
同步和异步又是另外一个概念,它是事件本身的一个属性

服务员直接跟厨师打交道,菜有没有做好,服务员直接知道,但只有当厨师将菜送到服务员手上,这个过程才算正常完成,在此过程服务员只能等待在厨房等待厨师做菜,这就是同步的事件,对于同步的事件,你只能以阻塞的方式去做。
同样是点菜,有些餐馆有专门的传菜人员,当厨师炒好菜后,传菜员将菜送到传菜窗口,并通知服务员,在这等待期间服务员可做别的事情,菜好了会有人通知,不用担心耽误,这就变成异步的了,对于异步的事件,阻塞和非阻塞都是可以的
#此案例来自网络

可以这么理解:
异步处理,可以是阻塞的,也可以是非阻塞的(服务员可以做别的事情也可不做别的事情),因为有传菜员的通知
同步处理,只能是阻塞的(服务员只能等待厨师)

同步的事件,对于同步的事件,你只能以阻塞的方式去做。
同样是点菜,有些餐馆有专门的传菜人员,当厨师炒好菜后,传菜员将菜送到传菜窗口,并通知服务员,在这等待期间服务员可做别的事情,菜好了会有人通知,不用担心耽误,这就变成异步的了,对于异步的事件,阻塞和非阻塞都是可以的

可以这么理解:
异步处理,可以是阻塞的,也可以是非阻塞的(服务员可以做别的事情也可不做别的事情),因为有传菜员的通知
同步处理,只能是阻塞的(服务员只能等待厨师)

#此案例来自网络

你可能感兴趣的:(nginx,nginx,服务器,apache)