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

1.什么是Nginx

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

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

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

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

2.2 反向代理

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

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

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

3.2 Linux版本安装

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

  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文件

./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需要关闭防火墙

查看防火墙状态
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;
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章