nginx知识梳理(一)

一、nginx简介

1.1 Nginx是什么?

Nginx 是一个高性能的网页服务器,能够反向代理 HTTPHTTPSSMTPPOP3IMAP,也可以作为一个负载均衡器和 HTTP 缓存。是一个免费、开源、高性能的 HTTP 服务器。

Nginx 以其高性能、稳定性、丰富的特性、以及简单配置和低资源消耗而著称。Nginx 是由 Igor Sysoev 开发设计来供俄罗斯的大型门户网站和搜索引擎 Rambler 的使用。此软件在 BSD-like 协议下发行,可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris 和 Microsoft Windows 等操作系统中运行。

1.2 nginx的优势?

与传统的服务器不同,Nginx 不依赖线程来处理请求。相反,它使用了一个更具可扩展性的事件驱动(异步)体系结构。这种体系结构使用较小的内存量,但更重要的是,内存的使用量在有负载的时候更加可预测。即使你不希望同时处理数千个请求,但仍然可以从 Nginx 的高性能和小内存占用中受益。Nginx 在所有方向都可以扩展:从最小的 VPS(Virtual Private Servers)到大型的服务器集群。

二、nginx安装(以ubuntu系统为例)

2.1 配置apt源

将下面内容添加到 /etc/apt/sources.list.d 文件下,这里我们重新创建一个文件 nginx.list 来存放下面的源信息:

$ sudo vim /etc/apt/sources.list.d/nginx.list

# 添加内容
deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx

导入nginx密钥

wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
rm nginx_signing.key

2.2 安装

sudo apt update
sudo apt install -y nginx

三、nginx配置

nginx包含各种指令,期中包括以下两个:

  • 简单指令:由名称和参数组成,之间以空格分隔,并以分号(;)结束。
  • 块指令:和简单指令具有相似的结构,不过不是由分号结尾,而是由一组大括号({})包含一些附加指令。这样的块指令又称为上下文(如:event、http、server 和 location)。

Nginx 及其模块的工作方式是在配置文件中确定的,默认的配置文件(nginx.conf)存放在目录 /etc/nginx 下。

可以将 Nginx 的配置文件的结构抽象成如下示意图:

Nginx的模块

Nginx 的架构是以高度模块化为设计基础,除了非常少量的核心代码,其它的一切皆是模块。高度抽象的模块接口,结构的设计简单,使得 Nginx 十分的灵活与高效,默认情况下只会加载默认、必须的模块,其它的一些功能实现需要加载一些第三方的模块。

而配置文件中的各个指令配置项其实便是对模块的一个功能配置。

Nginx 在运行时至少需要加载几个核心的模块和一个事件类模块,这些模块运行时所支持的配置项称为基础配置,这样的配置项很多,一般将其分为四大类:

  • 调试配置项。
  • 必备配置项。
  • 优化配置项。
  • 事件类配置项。

有一些基础配置项没有在 nginx.conf 配置文件中写出,但是会有默认的值,这里只是简单的罗列配置文件中有的配置项:

user nginx;  # 运行用户,为必备配置项
worker_processes 1; # 启动工作进程数量,通常设置为可用的 CPU 内核数,为优化配置项

# 错误日志文件的路径与级别,为调试配置项
error_log /var/log/nginx-error.log warn;

pid  /var/run/nginx.pid; # 定义 PID 文件位置,为必备配置项

# 事件配置块上下文,其中指定影响连接处理的指令
events {
    worker_connections 1024; # 设置一个工作进程可以打开的同时连接的最大数量,默认为 1024
}

其它更多核心配置项可以参考官方说明

在 Nginx 中有一个非常重要的核心模块就是 ngx_http_core_module 模块,它实现了静态 Web 服务器的主要功能,而其相关的配置项都放在 http{} 配置块中:

http {
       # 设置 mime 的类型,类型由 mime.type 文件定义
     include       /etc/nginx/mime.types;
     default_type  application/octet-stream;

       # 设定日志格式
     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';

     access_log  /var/log/nginx/access.log  main;

     # sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,
     # 对于普通应用,必须设为 on,
     # 如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,
     # 以平衡磁盘与网络 I/O 处理速度,降低系统的 uptime
     sendfile        on;
     #tcp_nopush     on;

     # 连接超时时间
     keepalive_timeout  65;

     # 开启 gzip 压缩
     # gzip  on;

     # 包含 /etc/nginx/conf.d 下的所有以 conf 结尾的配置文件
     include /etc/nginx/conf.d/*.conf;
 }

一个典型、完整的静态 Web 服务器还会包含多个 server 配置块和 location 配置块,例如 /etc/nginx/sites-available/default 文件:

# 设置虚拟主机配置
 server {
        # 监听 80 端口
        listen    80;
        # 设置虚拟服务器的名称
        server_name  www.nginx.cn;

        # 定义服务器的默认网站根目录位置
        root /data/www/html;

        # 设定本虚拟主机的访问日志路径与级别
        access_log  logs/nginx.access.log  main;

        # location 块指令,根据请求目录或文件配置处理的行为

        # location / 表示当访问根目录时所做的行为
          location / {
          # 按顺序查找访问的 uri 文件或相关的目录,若是不存在则返回 404
              try_files $uri $uri/ =404;
          }
        ....
}

server 配置块类似于 Apache 中的 VirtualHost 配置块,用于配置虚拟主机。

其中 location 用于匹配请求的 URI(URI 表示的是访问路径,除域名以外的内容),匹配的方式有多种:

  • 精准匹配。
  • 忽略大小写的正则匹配。
  • 大小写敏感的正则匹配。
  • 前半部分匹配。

其语法如下:

location [ = | ~ | ~* | ^~ ] pattern {
    ......
    ......
}

其中各个符号的含义:

  • =:用于精准匹配,需要请求的 uri 与 pattern 表达式完全匹配的时候才会执行 location 中的操作。
  • ~:用于区分大小写的正则匹配。
  • ~*:用于不区分大小写的正则匹配。
  • ^~:用于匹配 URI 的前半部分。

我们以这样的实例来进一步理解:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
  • 当访问 www.shiyanlou.com 时,请求访问的是 /,所以将与配置 A 匹配。
  • 当访问 www.shiyanlou.com/test.html 时,请求将与配置 B 匹配。
  • 当访问 www.shiyanlou.com/documents/document.html 时,请求将匹配配置 C。
  • 当访问 www.shiyanlou.com/images/1.gif 请求将匹配配置 D。
  • 当访问 www.shiyanlou.com/docs/1.jpg 请求将匹配配置 E。

当一个 URI 能够同时被多个 location 匹配的时候,则按顺序被第一个 location 所匹配。

在 location 中处理请求的方式有很多,如上文中的 try_files,还有常用的 pass_proxy 。

发表评论

后才能评论