nginx知识梳理(一)
一、nginx简介
1.1 Nginx是什么?
Nginx 是一个高性能的网页服务器,能够反向代理 HTTP
、HTTPS
、SMTP
、POP3
、IMAP
,也可以作为一个负载均衡器和 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
。