关于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的正则匹配顺序
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是饭店/线程是服务员/状态、通知和回调是传菜员
比如餐馆的服务员为用户点菜,当有用户点完菜后,服务员将菜单给后台厨师,此时有两种方式:
第一种,阻塞方式:就在出菜窗口等待,直到厨师炒完菜后将菜送到窗口,然后服务员再将菜送到用户手中;
第二种,非阻塞的:等一会再到窗口来问厨师(状态、通知和回调),某个菜好了没?如果没有先处理其他事情,等会再去问一次;
同步和异步:
同步和异步又是另外一个概念,它是事件本身的一个属性
服务员直接跟厨师打交道,菜有没有做好,服务员直接知道,但只有当厨师将菜送到服务员手上,这个过程才算正常完成,在此过程服务员只能等待在厨房等待厨师做菜,这就是同步的事件,对于同步的事件,你只能以阻塞的方式去做。
同样是点菜,有些餐馆有专门的传菜人员,当厨师炒好菜后,传菜员将菜送到传菜窗口,并通知服务员,在这等待期间服务员可做别的事情,菜好了会有人通知,不用担心耽误,这就变成异步的了,对于异步的事件,阻塞和非阻塞都是可以的
#此案例来自网络
可以这么理解:
异步处理,可以是阻塞的,也可以是非阻塞的(服务员可以做别的事情也可不做别的事情),因为有传菜员的通知
同步处理,只能是阻塞的(服务员只能等待厨师)
同步的事件,对于同步的事件,你只能以阻塞的方式去做。
同样是点菜,有些餐馆有专门的传菜人员,当厨师炒好菜后,传菜员将菜送到传菜窗口,并通知服务员,在这等待期间服务员可做别的事情,菜好了会有人通知,不用担心耽误,这就变成异步的了,对于异步的事件,阻塞和非阻塞都是可以的
可以这么理解:
异步处理,可以是阻塞的,也可以是非阻塞的(服务员可以做别的事情也可不做别的事情),因为有传菜员的通知
同步处理,只能是阻塞的(服务员只能等待厨师)
#此案例来自网络