目录
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)
- OpenSSL 是一个强大的安全套接字层密码库。囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
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 的所有功能都是通过配置文件进行添加。
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 扩展模块。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
- https://www.cnblogs.com/yangyh11/p/9801466.html
- https://www.youtube.com/playlist?list=PLmOn9nNkQxJFqjd8stdqdXgTnDDpr0baO
- Nginx concepts I wish I knew years ago (中文)
- https://blog.csdn.net/weixin_34290390/article/details/92931579
- https://zhuanlan.zhihu.com/p/348351797
WebDAV
- https://en.wikipedia.org/wiki/WebDAV
- https://www.cnblogs.com/yunying61/p/16955885.html
- https://www.cnblogs.com/tros/p/16517193.html
- https://www.jianshu.com/p/50cc357c4391
- https://dandelioncloud.cn/article/details/1564578996983918594