Nginx – 为优质网络服务当家理纪


Ngnix 是一款轻量级、高性能的 Web 应用服务器软件,同时也是一款代理服务器软件。它可以作为反向代理服务器软件,也可以作为电子邮件(IMAP/POP)代理服务软件。

作为服务器软件领域的佼佼者,Ngnix 真正体现了“小身体,大能量”的特色。软件本身小巧精致,配置和使用简单,但功能非常强大。其典型功能特点有,

  • 高性能 Web 服务器
    • 官方数据表明能支持高达 50000 个并发数
    • 反向代理服务器
    • 负载均衡
    • 动静结合

在网络应用架构中,Nginx 使用非常广泛,具有重要的地位和作用。

Nginx 安装部署

需要安装 Ngnix 主程序和相关的配套支撑库。

手动编译需要源码,或者安装后缀为 -dev 的库

  • Nginx 主程序
    • 可直接用软件仓库的版本,可以手动编译安装。
    • 官网网站:Nginx.org
    • 可执行程序文件:nginx (bin 或 sbin 中)
  • PCRE 库
    • PCRE (Perl Compatible Regular Expressions) 是一个 Perl 库,包括 Perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式
    • 库名称:libpcre3、libpcre3-dev (Ubuntu 18.04)
  • zlib 库
    • zlib 库提供了很多种压缩和解压缩的方式,nginx 使用 zlib 对 http 包的内容进行 gzip
    • 库名称:zlib1g-dev (Ubuntu 18.04)
  • OpenSSL 库
    • OpenSSL 是一个强大的安全套接字层密码库。囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
      nginx 不仅支持 http 协议,还支持 https(即在 ssl 协议上传输 http),需要安装 OpenSSL 库。
    • 库名称:openssl (Ubuntu 18.04)

Nginx 基本指令

使用可执行文件 nginx 启动服务。

./nginx

启动后,可以通过 -s 参数对 nginx 进行控制。

nginx -s signal
注:-s 参数表明采用向 nginx 发送信号的方式

指令 备注
nginx -s quit 优雅停止。此方式是待 nginx 进程处理任务完毕进行停止
nginx -s stop 强制停止。此方式先查出 nginx 进程 id,再使用 kill 命令强制杀掉进程
nginx -s reload 重启服务,重新加载更新后配置(使用最多的指令,尤其是运行中进行配置更改
ngnix -s reopen 重新打开 log 文件
nginx -t nginx 不运行,仅仅对配置文件进行测试

Nginx 配置文件的基本结构

nginx 的所有功能都是通过配置文件进行添加。

pic-1

ngnix.conf 是 nginx 的中心配置文件,文件主要由三个大的部分组成:全局块、events 块、http 块。采用了一种“递进式”的结构布局。

全局块

全局块配置影响 nginx 服务器整体运行的配置指令。主要设置包括,

  • 运行 nginx 服务器的用户或用户组;
  • 允许生成的 worker process 数量;
  • 进程 pid 的存放路径;
  • 配置文件的引用,重点是服务器整体功能模块的配置
    • /etc/nginx/modules-enabled/*.conf

events 块

events 块配置影响 nginx 服务器与用户的网络连接。

http 块(包含多个 server 块)

http 块是 nginx 服务器中配置最频繁的部分。又进一步可细分为 “http 全局块”“server 块”

(1) http 全局块

http 全局块针对 http 的全局参数需求设计,主要设置包括,
– 文件引入
– MIME-TYPE类型
– 日志定义
– 连接超时时间
– ……

(2) server 块

server 块主要针对“虚拟主机”的概念设计。

“虚拟主机”是一种概念上的主机,从用户角度看,一台“虚拟主机”就和一台独立硬件的主机完全一样。

每个 http 块可以包括多个 server 块,每个 server 块就相当于一个虚拟主机。如此,每个 http 块可以包括多个“虚拟主机”的设置。

每个 server 块又进一步可细分为 “全局 server 块” 和多个 “location 块”

  • 全局 server 块对一个“虚拟主机”的核心参数进行设置,如“监听端口”、“主机名”、“主机的根目录”等
  • location 块是客户端对服务器的访问路由设置。客户端访问一个“虚拟主机”的不同路径时,设置对应的处理

Ngnix 配置文件的基础参数与场景设置

通用参数设置

典型的 nginx.conf 内容如下,

####################
# 设置 nginx 的 worker process 进程执行的用户
####################
user www-data;

####################
# 设置 nginx 中并发处理进程 worker process 的数量
# 这个设置一般与 CPU 内核数量相匹配,每个用于 nginx 的内核分配一个 worker
####################
worker_processes 2;

####################
# 设置 nginx 的 pid
####################
pid /run/nginx.pid;

events {
        ####################
        # 每一个 worker 进程允许的最大连接数
        # "worker 的数量 X 每个 worker 的连接数"决定了 nginx 的并发性能
        ####################
        worker_connections 768;
}

http {

        ####################
        # 进行文件传输,打开后文件传输性能提升
        ####################
        sendfile on;
        ####################
        # 当数据包累计到一定大小后,再发送,提升发送效率;
        # 与 sendfile 合用
        ####################
        tcp_nopush on;


        ####################
        # 设置服务器传输文件的 mime 类型以及默认类型
        ####################
        include /etc/nginx/mime.types;
        default_type application/octet-stream;


        ####################
        # 设置日志
        ####################

        ###### 用户对服务器的访问请求记录
        access_log /var/log/nginx/access.log;

        ###### 设置 error 日志的存储位置
        error_log /var/log/nginx/error.log;
        ###### 设置 error 日志的存储位置,以及存储的日志级别
        ###### 共分为 debug info notice warn error crit(ical) 等级别
        # error_log /var/log/nginx/error.log info;


        ####################
        # Gzip 压缩设置
        ####################
        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ####################
        # 虚拟主机设置 (Virtual Host Configs),即 server 块设置
        # 一个 server 块,一个"虚拟主机"
        ####################

        ###### server 块直接设置
        server {

            ###### 设置监听端口。本机所有的 ip 上都监听 80 端口
            ###### 如果只想监听某个端口,可以写为 192.168.1.202:80;
            ###### 这样的话,只监听 192.168.1.202 上的 80 口
            listen 80;

            ###### 设置服务器域名
            server_name localhost;

            ###### 站点根目录(程序目录)
            root /var/www/html;
            ###### 索引文件 
            index index.html index.htm

            location / {
                root html;
                index index.html index.htm
            }

            error_page 500 502 503 504 /50x.html;

            location /50x.html {
                root html;
            }   


        ###### server 块的优化配置
        ###### 将 server 块放入单独的“碎片”配置文件中引入
        ###### 方便多个 server 的设置,每一个 server 对应一个单独的“碎片”
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }
}

用户认证参数设置

nginx 提供 web 用户认证功能。可以通过设置认证机制,让 web 页面得到受控访问。

nginx 中用户认证功能由 ngx_http_auth_basic_module 模块实现,该模块也是 nginx 默认编译的常规模块。

参数 说明 作用域
auth_basic 作为 realm 使用,响应报文中使用 http 块, server 块, location 块, limit_except
auth_basic_user_file 用户认证文件 http 块, server 块, location 块, limit_except

认证模块的配置文件示例如下,

server {
    listen 8081;
    server_name jiat.com;

    auth_basic "User auth";
    auth_basic_user_file /etc/nginx/sites-available/passwd;

    location / {
        root /var/www/html/authdir;
        index index.html;
    }
}

创建认证使用的用户名和密码,如使用 htpasswd 工具,

htpasswd -c /etc/nginx/sites-availables/passwd username
New password: 输入密码
Re-type new password: 再次输入密码

WebDAV 参数设置

设计缘起

WWW 推出后发展迅速,但其流行的主要特征是作为一个信息发布的媒介,即仅仅是一个“只读”的媒介。随着其使用愈加广泛,对 Web 的期望也愈加水涨船高,除了一个“可读”的媒介外,让 Web 进一步扩展,成为一个“可写、可编辑”媒介的需求也很迫切,人们期望在网络上利用 Web 实现“分布式编辑(创作)”,在这样的背景下,W3C 联盟专门成立了另一个 IETF 工作组对上述需求进行研究,最终以 RFC 4918 的形式发布了 WebDAV。

Berner-Lee 在设计第一个 Web 浏览器 WorldWideWeb 的时候,实际上可以同时查看和编辑网页;但是,随着 Web 的发展,其逐步演变成一个“只读”的媒体。

WebDAV 概述

WebDAV,全名 Web-based Distributed Authoring and Versioning,即 “基于 Web 的分布式编辑与版本控制”。顾名思义,其设计目的就是要实现“ Web 上的分布式(多人协作)编辑 ”,要让 Web 成为一个“可写、可协作”,而不仅仅是“可读”的媒体。WebDAV 协议为网络用户提供了一套框架,可以在服务器上进行文档的创建、修改和移动。

为完成上述的目标,WebDAV 在设计中融入了几个重要特征,

特征名称 特征说明
文档作者或修改日期的属性维护 文件的创建、删除、查询的信息维护
命名空间管理 在服务器的命名空间中拷贝、移动 web 页面
资源集合管理 创建、删除、列表各种资源
写入覆盖保护机制 与文件的锁定、解锁相关(并发控制)

在实现上,WebDAV 对 HTTP 1.1 协议进行了扩展,在 GET、POST、HEAD 等几个 HTTP 标准方法以外添加了一些新的方法,以此提供并发控制和命名空间的操作的手段,使应用程序可对 Web Server 直接读写,并支持写文件锁定 (Locking) 及解锁 (Unlock),及文件的版本控制。

很多“网盘”的相关功能,都是靠 WebDAV 的支持来实现。

Nginx 中设置 WebDAV 支持

(1) DAV 支持的模块

nginx 通过模块实现对 DAV 的支持。主要模块有如下两个,

  • ngx_http_dav_module 模块

    nginx 中标准的 dav 模块。对 dav 实现有限的支持,只支持 GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE 这几个方法。

  • nginx-dav-ext-module 模块

    nginx 的 dav 扩展模块。dav 的完整支持。补充了 ngx_http_dav_module 中缺少的方法,如 PROPFIND, PROPPATCH, OPTIONS, LOCK, UNLOCK。

要获得 WebDAV 完整的功能,需要上述两个模块都启动。

(2) DAV 模块安装

  • 源码编译安装
    ## 下载 dav 扩展模块源码
    cd /usr/local/src && git clone --recursive https://github.com/arut/nginx-dav-ext-module
    
    ## 编译安装
    ./configure \
    --with-http_dav_module \
    --add-module=/usr/local/src/nginx-dav-ext-module
    
    make && make install
    
  • apt 安装
     apt install nginx-extras
    

(3) DAV 模块的配置示例

server {
        listen 8000;
        root /var/www/html/webdav/;

        # 认证方式
        auth_basic "Please input password"; #这里是验证时的提示信息
        # 存放认证用户名、密码文件(确认有对应权限)
        auth_basic_user_file /etc/nginx/sites-available/passwd;

        autoindex on; # 开启目录文件列表

        # DAV支持的请求方法
        dav_methods PUT DELETE MKCOL COPY MOVE;
        # DAV扩展支持的请求方法
        dav_ext_methods PROPFIND OPTIONS;

        # 为创建的文件和文件夹设置默认权限
        dav_access  user:rw group:rw all:r;

        # WebDAV 默认只能在已存在的目录中创建文件;
        # 开启本选项,可以自动创建所需的目录
        create_full_put_path on;
}

SSL 参数设置

Ngnix 特色场景设置

反向代理参数设置

负载均衡参数设置

动静结合设置

Reference

  1. https://www.cnblogs.com/yangyh11/p/9801466.html
  2. https://www.youtube.com/playlist?list=PLmOn9nNkQxJFqjd8stdqdXgTnDDpr0baO
  3. Nginx concepts I wish I knew years ago (中文)
  4. https://blog.csdn.net/weixin_34290390/article/details/92931579
  5. https://zhuanlan.zhihu.com/p/348351797

WebDAV

  1. https://en.wikipedia.org/wiki/WebDAV
  2. https://www.cnblogs.com/yunying61/p/16955885.html
  3. https://www.cnblogs.com/tros/p/16517193.html
  4. https://www.jianshu.com/p/50cc357c4391
  5. https://dandelioncloud.cn/article/details/1564578996983918594

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注