Nginx
一、什么是 nginx
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP/POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。
二、优点(高性能、高并发、低内存)
更快
传统的基于进程或线程处理并发连接的模型,使用单独进程或线程来处理每一个请求,并阻塞网络或输入输出。
nginx 是一个模块化的、事件驱动的、异步的、单线程的、非阻塞的架构。
nginx 大量使用多路复用和事件通知,并将特定 任务专门用于分离进程。在数量有限的单线程中,高效运行循环中处理连接。
高扩展性(模块化)
高度模块化的设计是 Nginx 的架构基础。
高可靠性
Nginx 可以在服务器上持续不间断的运行数年。
热部署
在升级的时候不需要终止服务
BSD 许可证
开源免费,修改源码之后可进行商用。
三、Nginx 架构
四、Nginx 命令与配置文件
4.1、安装
yum install -y nginx
安装之后查看 nginx 的安装位置
whereis nginx
查看 nginx 进程
ps -ef | grep nginx # 能够看到一个 master 进程多个 worker 进程
master 进程的作用:master 进程主要用来管理监控 worker 进程,包含接收外界的信息,并将接收到的信号发送给各个 worker 进程,监控 worker 进程的状态,当 worker 进程出现异常退出后,会自动重新启动新的 worker 进程。还负责读取配置文件,判断配置文件语法是否真确。
worker 进程作用:专门用来处理用户请求的,各个 worker 进程之间是平等的并且相互独立,处理请求的机会也是一样的。
我们可以通过给 master 进程发送信号量来控制 nginx 来进行启停操作。
那么如何获取 master 进程的 pid 呢?
- ps -ef | grep nginx
- 在 nginx.pid 文件存放着 master 进程的 pid
信号量(kill 信号量 pid)
信号量
- TERM,INF
nginx 立即关闭
- QUIT
master 进程控制所有的 worker 进程不在接受新的请求,等所有请求处理完成之后再关闭 nginx
- HUP
master进程会把控制旧的 work 进程不再接收新的请求,等处理完请求后将旧的 work 进程关闭掉,然后根据 nginx 的配置文件重新启动新的 work 进程
- USR1
告诉 Nginx 重新开启日志文
- USR2 (平滑的升级)
告诉 master 进程要平滑升级,这个时候,会重新开启对应的 master 进程和 work 进程,整个系统中将会有两个 master 进程,并且新的 master 进程的 PID 会被记录在/usr/local/nginx/logs /nginx.pid 而之前的旧的 master 进程 PID 会被记录在 /usr/local/nginx/logs/nginx.pid.oldbin 文件中,接着再次发送 QUIT 信号给旧的 master 进程,让其处理完请求后再进行关闭
- WINCH
(优雅关闭旧的进程)发送 WINCH 信号给 master 进程,让 master 进程控制不让所有的 work 进程在接收新的请求了,请求处理完后关闭 work 进程。注意 master 进程不会被关闭掉
4.2、nginx 应用程序命令
nginx -s reload # 重新加载配置文件,热重启 HUP
nginx -s reopen # 重启 Nginx USR1
nginx -s stop # 快速关闭 TERM、INT
nginx -s quit # 等待工作进程处理完成后关闭 QUIT
nginx -T # 查看当前 Nginx 最终的配置
nginx -t # 检查配置是否有问题
4.3、配置文件结构
将默认配置文件 nginx.conf 去掉注释
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置指令(key)、配置指令值(value)、配置指令语句、配置指令域({})、配置全局域
发现 默认配置文件中有三大块,全局块,events 块,http{ server { location}}
块。
main、events、http、upstream、server、location、stream、types、if
配置文件中的计量单位
1) 容量
k、K、m、M、g、G
2)时间
ms、s、m、h、d、w、M、y
4.4、全局块
user :用于配置运行 Nginx 服务器的 worker 进程的用户和用户组,用于设置 master 进程启动后,fork 出的 worker 进程运行在哪个用户和用户组下。当按照 “user username” 设置时,用户组名与用户名相同。
master_process on|off;
用来指定是否开启工作进程。
worker_process num/auto;
用于配置 Nginx 生成工作进程的数量,这个是 Nginx 服务器实现并发处理服务的关键所在。理论上来说
worker process 的值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要受到来自服务器自身的限制,建议将该值和服务器
CPU 的内核数保存一致
daemon
:设定 Nginx 是否以守护进程的方式启动。(独立于控制终端,不会随着终端关闭而停止)
pid
:用来配置 Nginx 当前 master 进程的进程号 ID 存储的文件路径。
error_log
:用来配置 Nginx 的错误日志存放路径
include
:用来引入其他配置文件,使 Nginx 的配置更加灵活
4.5、Events 块
accept_mutex
来设置 Nginx 网络连接序列化
multi_accept
:用来设置是否允许同时接收多个网络连接
worker_connections
:用来配置单个 worker 进程最大的连接
use
:用来设置 Nginx 服务器选择哪种事件驱动来处理网络消息。
4.6、http 块
default_type
:用来配置 Nginx 响应前 端请求默认的 MIME 类型
access.log
:用来记录用户所有的访问请求。
error.log
:记录 nginx 本身运行时的错误信息,不会记录用户的访问请求。
log_format
:用来指定日志的输出格式
sendfile
:用来设置 Nginx 服务器是否使用sendfile()传输文件,该属
性可以大大提高 Nginx 处理静态资源的性能
keepalive_timeout
:用来设置长连接的超时时间。
keepalive_requests
:用来设置一个keep-alive连接使用的次数。
4.7、Server 块
listen
:用来配置监听端口
server_name
指令:用来设置虚拟主机服务名称
域名匹配的四种写法:
- 精确匹配: server_name www.nginx.com ;
- 左侧通配: server_name *.nginx.com ;
- 右侧统配: server_name www.nginx.* ;
- 正则匹配: server_name ~^www.nginx.*$ ;
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配 > default_server
通配符不能出现在域名的中间,只能出现在首段或尾端。
~
作为正则表达式字符串开始标记。