Nginx描述
Nginx的三大应用场景
1.1、静态资源服务
1.2、缓存、负载均衡服务器
1.3、API服务(openresty)
nginx优点
更快、高扩展性、高可靠性、低内存消耗、单机支持10万以上的并发连接、热部署、最自由的BSD许可协议
nginx的开源项目
- 阿里巴巴Tengine
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
中文文档地址: https://tengine.taobao.org/nginx_docs/cn/docs/ - OpenResty
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便 地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
nginx的基本架构
多进程的master-worker I/O复用方式
- master进程主要用来管理 worker 进程,具体包括以下主要功能:
(1)接收来自外界的信号。
(2)处理配置文件读取。
(3)创建,绑定和关闭套接字
(4)启动,终止和维护配置的工作(worker)进程数
(5)当woker进程退出后(异常情况下),会自动重新启动新的woker进程。 - worker 进程的主要任务是完成具体的任务逻辑。其主要关注点是与客户端或后端真实服务器(此时 worker 作为中间代理)之间的数据可读/可写等I/O交互事 件。
(1)接收客户端请求;
(2)将请求一次送入各个功能模块进行过滤处理;
(3)与后端服务器通信,接收后端服务器处理结果;
(4)数据缓存
(5)响应客户端请求
OpenResty安装
下载安装
官方地址:http://openresty.org/cn/
yum update -y
yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
yum install -y gcc
wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
tar zxvf openresty-1.15.8.2.tar.gz
cd openresty-1.15.8.2
./configure -j2
make -j2
sudo make install
# better also add the following line to your ~/.bashrc or ~/.bash_profile file.
# /etc/profile =>source /etc/profile
export PATH=/usr/local/openresty/bin:$PATH
openresty -V
return 简单测试使用
修改配置文件openresty/nginx/conf/nginx.conf
location = /test1 {
return 403 ;
}
location = /test2 {
default_type text/html ;
return 200 'test2 test2 test2';
}
location = /test3 {
default_type application/json ;
return 200 '{"name":"test3","result":"success"}';
}
location = /test4 {
return http://localhost/1.jpg; #这是一个重定向
}
保存后 openresty -s reload
http://localhost/test1 => 403 Forbidden
http://localhost/test2 => test2 test2 test2
http://localhost/test3 => {“name”:“test3”,“result”:“success”}
http://localhost/test4 => http://localhost/1.jpg
nginx配置文件解释
配置文件模板
worker_processes 1;
events{
worker_connections 1024;
}
http {
include mine.types;
...
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
error_page 500 502 503 504 /50x.html;
}
}
- main (全局设置),
main 部分设置的指令将影响其它所有部分的设置; - http(http服务器设置)
http标准核心模块,http服务的相应配置 - server (主机设置)
接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过构建虚拟主机( server )的概念来将这些不同的服务配置隔离 - location (URL匹配特定位置后的设置)
location 部分用于匹配网页位置(比如,根目录“/”,“/images”,等等), server 是对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置.
nginx配置块详细说明
配置语法说明:
1、配置文件由指令与指令块构成
2、每条指令以;分号结尾,指令与参数间以空格符号分隔
3、指令块以{}大括号将多条指令组织在一起
4、使用#符号添加注释,提高可读性
5、include语句允许组合多个配置文件以提升可维护性
6、使用$符号使用变量
7、部分指令的参数支持正则表达式
配置块:server
由于IP地址的数量有限, 因此经常存在多个主机域名对应着同一个IP地址的情况, 这时在 nginx.conf 中就可以按照 server_name (对应用户请求中的主机域名) 并通过server块来定义虚拟主机, 每个 server 块就是一个虚拟主机, 它只处理与之相对应的主机域名请求。
这样, 一台服务器上的 Nginx 就能以不同的方式处理访问不同主机域名的 HTTP请求了
语法:
主机名称
语法: server_name name[...];
默认: server_name"";
配置块: server
虚拟主机名可以使用确切的名字, 通配符, 或者是正则表达式来定义,在开始处理一个 HTTP 请求时, Nginx 会取出 header 头中的 Host , 与每个 server 中的server_name 进行匹配, 以此决定到底由哪一个 server 块来处理这个请求。
有可能一个 Host 与多个 server 块中的 server_name 都匹配, 这时就会根据匹配优先级来选择实际处理的 server 块
注意:优先级问题,所导致的配置不生效
server_name与Host的匹配优先级如下:
1) 首先选择所有字符串完全匹配的server_name, 如 nginx.2367.com 。
2) 其次选择通配符在前面的server_name, 如 *.2367.com。
3) 再次选择通配符在后面的server_name, 如nginx.2367.* 。
4) 最后选择使用正则表达式才匹配的server_name, 如 ~^\.testweb\.com$
如果都不匹配
1) 优先选择listen配置项后有default或default_server的
2) 找到匹配listen端口的第一个server块
配置块:location
语法
location
语法: location[=|~|~*|^~|@]/uri/{...}
配置块: server
location会尝试根据用户请求中的URI来匹配上面的/uri表达式, 如果可以匹配, 就选择
location{}块中的配置来处理用户请求。 当然, 匹配方式是多样的, 下面介绍location的匹配规则。
location表达式类型
- ~ 表示执行一个正则匹配, 区分大小写;
- ~* 表示执行一个正则匹配, 不区分大小写;
- ^~ 表示普通字符匹配。 使用前缀匹配。 如果匹配成功, 则不再匹配其他location;
- = 进行普通字符精确匹配。 也就是完全匹配;
- @ 它定义一个命名的 location, 使用在内部定向时, 例如 error_page, try_files
优先级:
- 等号类型(=) 的优先级最高。 一旦匹配成功, 则不再查找其他匹配项
- 前缀普通匹配(^~)优先级次之。 不支持正则表达式。 使用前缀匹配, 如果有多个location匹配的话, 则使用表达式最长的那个
- 正则表达式类型(~ ~*) 的优先级次之。 一旦匹配成功, 则不再查找其他匹配项
- 常规字符串匹配, 如果有多个location匹配的话, 则使用表达式最长的那个
优先级: (location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径)
文件路径的定义:
- 以root方式设置资源路径
语法: root path;
配置块: http、 server、 location、 if - 以alias方式设置资源路径
语法: alias path;
配置块: location
alias也是用来设置文件资源路径的, 它与root的不同点主要在于如何解读紧跟location后面的uri参数
注意: location中使用root指令和alias指令的意义不同
- root, 相当于追加在root目录后面 。 比如访问的是 xxx/test=>/www/test
- alias, 相当于对location中的uri进行替换, 比如访问的是 xxx/test, 想要访问到/www/test就必须设置 alias /www/test
常用命令和控制信号
命令
- 查看Nginx的版本号:nginx -V
- 停止 nginx -s stop
- 退出 nginx -s quit
- 重启加载配置 nginx -s reload
- 配置文件启动 nginx -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的
- nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
信号操作
我们还可以通过信号去操作 nginx ,默认, nginx 将其主进程的 pid 写入到 /usr/local/nginx/nginx.pid 文件中
信号:
- TERM,INT 快速关闭
- QUIT 从容关闭
- HUP 重载配置 用新的配置开始新的工作进程 从容关闭旧的工作进程
- USR1 重新打开日志文件
- USR2 平滑升级可执行程序。
- WINCH 从容关闭工作进程
nginx 停止命令,等所有请求结束后关闭服务
Kill -QUIT nginx 主进程号
重新载入配置
kill -HUP nginx 主进程号
一些信号
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM 终止进程 虚拟计时器到时