Nginx 是一个开源且高性能、可靠的 HTTP 中间件,代理服务。Nginx(发音同 engine x)是一个 Web 服务器,也可以用作反向代理,负载平衡器和 HTTP 缓存。该软件由 Igor Sysoev 创建,并于 2004 年首次公开发布。同名公司成立于 2011 年,以提供支持。
首先要明白,Nginx 采用的是多进程(单线程) + 多路 IO 复用模型。使用了 I/O 多路复用技术的 Nginx,就成了 并发事件驱动 的服务器。
master
进程和多个相互独立的 worker
进程。工作进程以非特权用户运行。master
进程主要用来管理 worker
进程,包含:接收来自外界的信号,向各 worker
进程发送信号,监控 worker
进程的运行状态,当 worker
进程退出后(异常情况下),会自动重新启动新的 worker
进程。worker
进程则是处理基本的网络事件。多个 worker
进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker
进程中处理,一个 worker
进程,不可能处理其它进程的请求。工作线程处理实际的请求。Nginx 使用基于事件的模型和依赖操作系统的机制来有效地在工作进程之间分发请求。
worker 进程数,一般会设置成机器 CPU 核数。因为更多的 worker 数,只会导致进程相互竞争 CPU,从而带来不必要的上下文切换。 使用多进程模式,不仅能提高并法率,而且进程之间相互独立,一个 worker 进程挂了不会影响其他 worker 进程。
socket()
来创建一个 sock 文件描述符用来监听,然后 fork
生成子进程(workers 进程),子进程将继承父进程的 sockfd
(socket 文件描述符),之后子进程 accept()
后将创建已连接描述符(connected descriptor)),然后通过已连接描述符来与客户端通信。sockfd
,那么当连接进来时,所有子进程都将收到通知并 争着 与它建立连接,这就叫 惊群现象。大量的进程被激活又挂起,只有一个进程可以 accept()
到这个连接,这当然会消耗系统资源。多个描述符的 I/O 操作都能在一个线程内并发交替地顺序完成,这就教 I/O 多路复用,这里的 复用 指的是复用同一个线程。I/O 多路复用的实现方式为:select
、poll
、epoll
。
Nginx 采用的 I/O 多路复用模型 epoll
。
CPU 亲和是一种 CPU 核心和 Nginx 工作进程绑定方式,把每个 worker 进程固定在一个 CPU 上执行,减少切换 CPU 的 cache miss
,获得更好的性能。
说白了就是减少 CPU 切换所损耗的性能。
列出 Nginx 服务的安装目录:
rpm -ql nginx
路径 | 类型 | 作用 |
---|---|---|
/etc/logrotate.d/nginx | 配置文件 | nginx 日志轮转,用于 logrotate 服务的日志切割 |
/etc/nginx/ /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /etc/nginx/nginx.conf | 目录、配置文件 | nginx 主配置文件 |
/etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params | 配置文件 | cgi 配置相关,fastcgi 配置 |
/etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf | 配置文件 | 编码映射转化文件 |
/etc/nginx/mime.types | 配置文件 | 设置 HTTP 协议的 Content-Type 与扩展名对应关系 |
/etc/sysconfig/nginx /etc/sysconfig/nginx-debug /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service | 配置文件 | 用于配置出系统守护进程管理器管理方式 |
/etc/nginx/modules /usr/lib64/nginx/modules | 目录 | nginx 模块目录 |
/usr/sbin/nginx /usr/sbin/nginx-debug | 命令 | nginx 服务的可执行程序文件(终端命令) |
/usr/share/doc/nginx-1.12.2 /usr/share/doc/nginx-1.12.2/COPYRIGHT /usr/share/man/man8/nginx.8.gz | 文件目录 | nginx 的手册和帮助文件 |
/var/cache/nginx | 目录 | nginx 的缓存目录 |
/var/log/nginx | 目录 | nginx 的日志目录 |
/usr/share/nginx/html/404.html /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html | 文件 | nginx 默认的静态资源目录 |
Nginx 及其模块的工作方式由配置文件确定。 默认情况下,配置文件名为 nginx.conf
,放在 /etc/nginx/conf.d
、/usr/local/nginx/conf
或者 /usr/local/etc/nginx
文件夹中。
列出编译参数的命令:
nginx -V
路径 | 类型 |
---|---|
--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock | 安装目录 |
--http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp | 执行对应模块时,Nginx 所保留的临时性文件 |
--user=nginx --group=nginx | 设定 Nginx 进程启动的用户和组用户 |
--with-cc-opt=parameters | 设置额外的参数将添加到 CFLAGS 变量 |
--with-ld-opt=parameters | 设置附加的参数,连接系统库 |
参考资料: