一篇文章教你了解和如何使用nginx

1.什么是Nginx

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务 --引用百度百科css

主要功能:反向代理,经过配置文件能够实现集群和负载均衡,静态资源虚拟化html

2.正向代理与反向代理
2.1 正向代理

客户端请求目标服务器之间的一个代理服务器
请求会先通过代理服务器,而后在请求转发到目标服务器,得到内容后在返回给相应到客户端
举例:去网吧上网,网吧就是一个正向代理服务器,咱们开机上网后访问的网站都是经过网吧的服务器,而后请求到目标服务器linux

2.2 反向代理

用户请求目标服务器,由代理服务器决定访问哪一个ip
举例:去学校报到,提交报名表,由教务处决定分到哪一个班级,教务处就至关于反向代理服务器nginx

3.Nginx的安装
3.1 Window版本安装

windows版本比较简单,直接下载启动就行了c++

3.2 Linux版本安装

我这边linux版本是CentOS7版本
安装步骤:web

  1. 安装Nginx
    去官网http://nginx.org/下载对应的nginx包,
    推荐使用稳定版本上传nginx到linux系统
    在这里插入图片描述面试

  2. 安装依赖环境
    (1)安装gcc环境
    yum install gcc-c++
    (2)安装PCRE库,用于解析正则表达式
    yum install -y pcre pcre-devel
    (3)zlib压缩和解压缩依赖,
    yum install -y zlib zlib-devel
    (4)SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https
    yum install -y openssl openssl-devel
    3.解压,须要注意,解压后获得的是源码,源码须要编译后才能安装
    tar -zxvf nginx-1.16.1.tar.gz
    4.编译以前,先建立nginx临时目录,若是不建立,在启动nginx的过程当中会报错
    mkdir /var/temp/nginx -p
    在nginx目录,输入以下命令进行配置,目的是为了建立makefile文件ajax

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi  \
--with-http_ssl_module

注:\ 表明在命令行中换行,用于提升可读性配置命令:命令解释正则表达式

命令 解释
–prefix 指定nginx安装目录
–pid-path 指向nginx的pid
–lock-path 锁定安装文件,防止被恶意篡改或误操做
–error-log 错误日志
–http-log-path http日志
–with-http_gzip_static_module 启用gzip模块,在线实时压缩输出数据流
–http-client-body-temp-path 设定客户端请求的临时目录
–http-proxy-temp-path 设定http代理临时目录
–http-fastcgi-temp-path 设定fastcgi临时目录
–http-uwsgi-temp-path 设定uwsgi临时目录
–http-scgi-temp-path 设定scgi临时目录

make编译
make
安装
make install
进入sbin目录启动
nginx./nginx
中止:
./nginx -s stop
从新加载:
./nginx -s reload
打开浏览器,访问虚拟机所处内网ip便可打开nginx默认页面,显示以下便表示安装成功:
注意事项:
1.若是在云服务器安装,须要开启默认的nginx端口:80
2.若是在虚拟机安装,须要关闭防火墙
3.本地win或mac须要关闭防火墙windows

查看防火墙状态
firewall-cmd --state
中止firewall
systemctl stop firewalld.service
禁止firewall开机启动
systemctl disable firewalld.service

4.Nginx的经常使用命令

./nginx -s stop 强制关闭,不管有没有客户在使用
./nginx -s quit 关闭,若是有客户在使用,等客户使用完在关闭
./nginx -t 校验配置文件
./nginx -v 查看版本号
./nginx -V 详细信息
./nginx -h 帮助文档
./nginx -c 指定特定的配置文件

5.Nginx进程模型解析

Nginx有两个进程:
一个是master进程,是Nginx的主进程,只有一个
一个是work进程,是Nginx的工做进程,能够有多个,能够在配置文件里面配置多个
Nginx进程之间的关系:
在这里插入图片描述
由master下发指令给worker,由worker去连接客户端处理,二者的管理相似于老板于员工之间的关系

6.Nginx处理web机制
6.1 Worker抢占机制

要了解worker抢占机制就要先明白一个名词‘惊群问题’

惊群问题是指在多线程(或多进程)场景下,有多个线程在等待某一资源可用,一旦这个资源可用,那么全部等待这个资源的线程都会被唤醒,可是资源只有一份,那么只有一个线程得到这个资源,其它线程都获取失败
惊群问题致使了没必要要的线程唤醒,实际上只有一个线程能获取这份资源,那么理想状况下只唤醒一个线程就好了。而唤醒多个线程致使了没必要要的线程调度,形成系统开销

而Nginx为了不惊群问题,就有了accept_mutex这个锁,在Nginx默认下是开启的,当accept_mutex开启后,任意时刻只有一个进程能得到accept_mutex锁,得到accept_mutex锁的进程能监听web端口;没法得到accept_mutex锁的进程会把监听套接字从其epoll中删除
在这里插入图片描述

也就是锁master会fork出多个worker,当一个请求过来以后,多个worker会抢占的accept_mutex这个锁,只有有这个锁的worker才有资格处理这个请求

6.2 Nginx服务器事件处理

在Linux环境下用的是epoll模型,当一个请求进入到worker中若是他阻塞了,那么worker会去处理其余的请求,这样一个worker就能够‘同时’处理一百上千个请求。
在这里插入图片描述

6.3 同步与异步,阻塞与非阻塞

这四个概念两两组合,会造成4个新的概念,以下:

  1. 同步阻塞: 客户端发送请求给服务端,此时服务端处理任务时间好久,则客户端则被服务端堵塞了,因此客户端会一直等待服务端的响应,此时客户端不能作其余任何事,服务端也不会接受其余客户端的请求。这种通讯机制比较简单粗暴,可是效率不高。
  2. 同步非阻塞: 客户端发送请求给服务端,此时服务端处理任务时间好久,这个时候虽然客户端会一直等待响应,可是服务端能够处理其余的请求,过一会回来处理原先的。这种方式很高效,一个服务端能够处理不少请求,不会在由于任务没有处理完而堵着,因此这是非阻塞的。
  3. 异步阻塞(不存在,只是举个例子): 客户端发送请求给服务端,此时服务端处理任务时间好久,可是客户端不会等待服务器响应,它能够作其余的任务,等服务器处理完毕后再把结果响应给客户端,客户端获得回调后再处理服务端的响应。这种方式能够避免客户端一直处于等待的状态,优化了用户体验,其实就是相似于网页里发起的ajax异步请求。
  4. 异步非阻塞: 客户端发送请求给服务端,此时服务端处理任务时间好久,这个时候的任务虽然处理时间会好久,可是客户端能够作其余的任务,由于他是异步的,能够在回调函数里处理响应;同时服务端是非阻塞的,因此服务端能够去处理其余的任务,如此,这个模式就显得很是的高效了。
    以上四点,除了第三点,其他的分别为BIO/NIO/AIO,面试官若是问你“请简述一下BIO/NIO/AIO之间的概念与区别”,那么你就能够组织一下语言来回答,或者经过以下生活实例来阐述也是能够的:
  5. BIO: 我去上厕所,这个时候坑位都满了,我必须等待坑位释放了,我才能上吧?!此时我啥都不干,站在厕所里盯着,过了一会有人出来了,我就赶忙蹲上去。
  6. NIO: 我去上厕所,这个时候坑位都满了,不要紧,哥不急,我出去抽根烟,过会回来看看有没有空位,若是有我就蹲,若是没有我出去接着抽烟或者玩会手机。
  7. 异步阻塞: 我去上厕所,这个时候坑位都满了,没事我等着,等有了新的空位,让他通知我就行,通知了我,我就蹲上去。
  8. AIO: 我去上厕所,这个时候坑位都满了,没事,我一点也不急,我去厕所外面抽根烟再玩玩手机,等有新的坑位释放了,会有人通知个人,通知我了,我就能够进去蹲了。
    从这个生活实例中能能够看得出来:
    同步就是我须要本身每隔一段时间,以轮训的方式去看看有没有空的坑位;
    异步则是有人拉完茅坑会通知你,通知你后你再回去蹲;阻塞就是在等待的过程当中,你不去作其余任何事情,干等着;非阻塞就是你再等待的过程当中能够去作其余的事,好比抽烟、喝酒、烫头、玩手机。
    小结:异步的优点显而易见,大大优化用户体验,非阻塞使得系统资源开销远远小于阻塞模式,由于系统不须要建立新的进程(或线程),大大地节省了系统的资源,如此多出来的系统资源能够给其余的中间件去服务了。
7.nginx.conf配置文件详解
7.1 nginx.conf结构

在这里插入图片描述

7.2 nginx.conf 核心配置文件说明

设置worker进程的用户,指的linux中的用户,会涉及到nginx操做目录或文件的一些权限,默认为nobody
user root;
worker进程工做数设置,通常来讲CPU有几个,就设置几个,或者设置为N-1也行
worker_processes 1;
nginx 日志级别debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右愈来愈大
设置nginx进程
pidpid logs/nginx.pid;
设置工做模式

events {
    # 默认使用epoll
    use epoll;
    # 每一个worker容许链接的客户端最大链接数
    worker_connections  10240;
}

http 是指令块,针对http网络传输的一些指令配置

http {
}

include 引入外部配置,提升可读性,避免单个配置文件过大
include mime.types;
设定日志格式,main为定义的格式名称,如此 access_log 就能够直接使用这个变量了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufp2OnC5-1586509226566)(en-resource://database/1286:1)]

参数名 参数意义
$remote_addr 客户端ip
$remote_user 远程客户端用户名,通常为:’-’
$time_local 时间和时区
$request 请求的url以及method
$status 响应状态码
$body_bytes_send 响应客户端内容字节数
$http_referer 记录用户从哪一个连接跳转过来的
$http_user_agent 用户所使用的代理,通常来时都是浏览器
$http_x_forwarded_for 经过代理服务器来记录客户端的ip

sendfile使用高效文件传输,提高传输性能。启用后才能使用tcp_nopush,是指当数据表累积必定大小后才发送,提升了效率。

sendfile        on;
tcp_nopush      on;

keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端屡次请求的时候不会重复创建新的链接,节约资源损耗。

#keepalive_timeout  0;
keepalive_timeout  65;

gzip启用压缩,html/js/css压缩后传输会更快
gzip on;
server能够在http指令块中设置多个虚拟主机

  • listen 监听端口
  • server_name localhost、ip、域名
  • location 请求路由映射,匹配拦截
  • root 请求位置
  • index 首页设置
server {
            listen       88;
            server_name  localhost;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
    }
8.使用Nginx为静态资源提供服务
8.1 静态网页的配置
server {
        # 访问的端口
        listen       90;
        # 访问的路径
        server_name  localhost;
        # 路由的配置
        location / {
            # 资源的存放路径
            root   /home/software/foodie-shop;
            # 默认打开界面
            index  index.html index.htm;
        }
    }
8.2 静态资源的配置
server {
        # 访问的端口
        listen       90;
        # 访问的路径
        server_name  localhost;
        # 路由的配置
       location /test {
            root    /home;
        }
    }

文件存放路径
在这里插入图片描述
网站访问路径
在这里插入图片描述

8.3 location的匹配规则解析
#正则表达式。*表明不区分大小写
location ~* \.(GIF|png|bmp|jpg|jpeg){
root /home;
}

#精确匹配
location  = /{
root /home;
}

#^~ 以某个字符路径开头请求
location ^~ /imooc/img{
root /home;
}

#^~ 以某个字符路径开头请求
location ^~ /imooc/img{
root /home;
}

#默认匹配规则
location / {
root /home;
}

注:本篇文章一些图片来自于网络