一、NGINX 进程工作原理
NGINX,作为一款高性能的开源 Web 服务器和反向代理服务器,其进程工作原理复杂而精妙。以下是对 NGINX 进程工作原理的详细阐述。
当 NGINX 服务启动时,首先会创建一个主进程,通常是 nginx 进程。这个主进程肩负着重要的使命,它犹如整个系统的指挥官,开始有条不紊地执行各项任务。
主进程启动后,会立即打开配置文件中指定的监听端口,全神贯注地开始监听来自客户端的连接请求。就像一个警惕的哨兵,时刻准备着迎接来自四面八方的信号。
紧接着,主进程会根据实际需求创建一定数量的工作进程,一般是 nginx worker 进程。这些工作进程是处理客户端请求的主力军,它们将承担起实际处理客户端请求的重任。
当主进程接收到客户端的连接请求时,它会迅速而准确地将连接分配给一个空闲的工作进程。这个过程就像是一个高效的调度中心,确保每个连接都能得到及时的处理。
工作进程接收到连接后,便立即开始处理客户端的请求。它会仔细地读取请求数据,精准地解析请求头,并根据请求的具体内容执行相应的操作。这可能包括直接返回静态文件,比如 HTML、CSS、JavaScript、图像等,无需转发请求给后端服务器;也可能是将请求转发给后端服务器进行处理,充当反向代理的角色。
NGINX 的工作进程采用了事件驱动的模型,这是其高效处理大量并发连接的关键所在。在一个进程中,它可以同时处理多个并发连接,而不是为每个连接创建一个线程或进程。这种非阻塞的处理方式极大地提高了系统的效率,使得 NGINX 能够在有限的资源下高效地处理大量的并发请求。
处理完客户端请求后,工作进程会生成相应的响应,并将响应迅速返回给客户端。随后,工作进程不会停歇,而是继续监听新的连接,以便处理更多的请求。
与此同时,主进程也没有闲着,它负责处理系统信号。例如,当需要重新加载配置文件或者进行平滑重启等操作时,主进程会接收并处理这些信号。通过发送信号给主进程,可以实现对 NGINX 的动态配置和管理,使系统更加灵活和易于维护。
NGINX 的进程模型采用了主进程和多个工作进程的设计,这种架构具有诸多优势。主进程负责管理工作进程、接收连接和处理信号,而工作进程则专注于实际的请求处理。这种分工明确的架构使得 NGINX 能够高效地处理并发请求,并具有良好的稳定性和可靠性。
二、NGINX 工作原理
NGINX 以其高性能和强大的功能而闻名于世。它的工作原理可以概括为以下几个关键步骤。
首先,NGINX 在服务器上监听一个或多个指定的端口,通常是 80(HTTP)和 443(HTTPS)。就像一个守在港口的灯塔,等待着船只的到来。
当客户端发送请求到 NGINX 的监听端口时,NGINX 会迅速接收到该请求。这个过程就像是一个敏锐的接收器,随时捕捉着来自外界的信号。
NGINX 根据预先配置的规则,对请求进行处理。这包括匹配请求的 URL、请求方法、请求头等信息。通过这些规则,NGINX 能够准确地确定如何处理每个请求。
如果请求的是静态文件,NGINX 可以直接返回这些文件给客户端,无需转发请求给后端应用服务器。它就像一个高效的文件管理员,能够快速地找到并提供所需的文件。
而如果请求需要经过反向代理,NGINX 则可以将请求转发给后端应用服务器处理。NGINX 作为反向代理服务器,可以根据负载均衡算法将请求分发给多个后端服务器,提高系统的性能和可靠性。这就像是一个智能的交通指挥员,合理地分配流量,确保系统的顺畅运行。
NGINX 接收到后端服务器的响应后,可以对响应进行处理,例如修改响应头、缓存响应内容等。经过处理后的响应更加符合客户端的需求,提高了用户体验。
最后,NGINX 将处理后的响应返回给客户端,完成整个请求处理过程。
NGINX 的高性能主要得益于其事件驱动的异步非阻塞架构。它能够使用少量的系统资源来处理大量的并发连接,具有出色的性能和可扩展性。此外,NGINX 还支持许多高级功能,如反向代理、负载均衡、SSL/TLS 加密、HTTP 缓存、动态模块等,使其成为一个强大而灵活的 Web 服务器和代理服务器。
三、关于配置文件
NGINX 的配置文件是其运行的关键。以下是对 NGINX 配置文件的一些介绍。
配置文件中的全局块包含了一些重要的设置。例如,“user www www;” 指定了启动用户。“worker_processes auto;” 表示工作进程数量默认自动设置。“error_log /www/wwwlogs/nginx_error.log crit;” 定义了错误日志的路径和级别。“pid /www/server/nginx/logs/nginx.pid;” 指定了 pid 进程文件的位置。“worker_rlimit_nofile 51200;” 设置了工作进程的文件描述符限制。
events 块中,“use epoll;” 指定了使用的事件模型。“worker_connections 51200;” 设置了最大连接数,并通过 “multi_accept on;” 开启了多连接接收。
http 块是配置文件的核心部分。它包含了文件处理规则、压缩设置等。“include mime.types;” 引入了文件类型处理规则。“gzip on;” 开启了压缩功能。
http 块内通常包含多个 server 块,每个 server 块对应一个站点的配置。例如,“server { listen 888; server_name phpmyadmin; index index.html index.htm index.php; root /www/server/phpmyadmin; location ~ /tmp/ { return 403;} access_log /www/wwwlogs/access.log; }” 配置了一个监听端口为 888 的站点,指定了服务名、默认页面、网站路径和日志文件。
配置文件还可以通过 “include /www/server/panel/vhost/nginx/*.conf;” 包含其他配置文件,方便进行模块化管理。
四、NGINX 常用命令
以下是一些常用的 NGINX 命令,它们可以帮助你管理 NGINX 服务。
启动 NGINX 服务可以使用 “sudo systemctl start nginx” 命令。这个命令会启动 NGINX,使其开始监听指定的端口,准备接收客户端的请求。
停止 NGINX 服务可以使用 “sudo systemctl stop nginx” 命令。当你需要停止 NGINX 服务时,这个命令会迅速停止 NGINX 的运行。
重新启动 NGINX 服务可以使用 “sudo systemctl restart nginx” 命令。这个命令在需要更新配置文件或者进行一些系统调整时非常有用,它会先停止 NGINX 服务,然后重新启动,确保新的配置生效。
检查 NGINX 配置文件语法是否正确可以使用 “sudo nginx -t” 命令。在修改配置文件后,使用这个命令可以确保配置文件没有语法错误,避免在启动 NGINX 时出现问题。
重新加载 NGINX 配置文件可以使用 “sudo systemctl reload nginx” 命令。当你需要对配置文件进行一些小的调整而不想完全停止和重新启动 NGINX 服务时,这个命令非常方便。它会使 NGINX 重新加载配置文件,应用新的设置。
查看 NGINX 服务状态可以使用 “sudo systemctl status nginx” 命令。这个命令可以让你了解 NGINX 服务的运行状态,包括是否正在运行、启动时间、日志信息等。
查看 NGINX 日志文件可以使用 “sudo tail -f /var/log/nginx/error.log” 查看错误日志,或者 “sudo tail -f /var/log/nginx/access.log” 查看访问日志。通过查看日志文件,你可以了解到 NGINX 的运行情况、错误信息以及客户端的请求情况。
测试 NGINX 是否在监听指定的端口可以使用 “sudo netstat -tuln | grep 80” 命令,将 80 替换为你想要检查的端口号。这个命令可以帮助你确认 NGINX 是否正在监听特定的端口,以便及时发现问题。
请注意,根据你的系统配置,可能需要使用 sudo 或以 root 用户身份执行这些命令。
五、NGINX 负载均衡
NGINX 的负载均衡功能是其强大之处之一。负载均衡配置可以写在 http 配置里面和 server 块里面。以下是一个示例。
在 http 块中,定义一个上游服务器模块,例如 “upstream backend { server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.1:8082;}”。这里自定义了组名 “backend”,并添加了三个服务器地址。
然后,在 server 块中,“listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }” 配置了监听端口为 80 的服务器,当请求到达这个服务器时,将请求转发到上游服务器模块 “backend” 进行负载均衡处理。
此外,还分别配置了三个监听不同端口的 server 块,分别对应不同的后端服务器。例如,“server { listen 8080; server_name 127.0.0.1; location / { root /www/fzjh1; index index.html;} }”、“server { listen 8081; server_name 127.0.0.1; location / { root /www/fzjh2; index index.html; } }” 和 “server { listen 8082; server_name 127.0.0.1; location / { root /www/fzjh3; index index.html; } }”。
六、NGINX 编译安装
安装依赖以及编译环境:
使用 “apt install gcc openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev” 命令安装所需的依赖和编译环境。这些依赖包括编译器、加密库、正则表达式库等,是编译 NGINX 所必需的。
生产编译文件,可添加模块:
使用 “./configure --prefix=/usr/local/nginx --with-stream” 命令生成编译文件。在这个命令中,可以根据需要添加各种模块,例如 “--with-stream” 用于支持流处理。
编译以及安装:
使用 “make & make install” 命令进行编译和安装。这个过程会将 NGINX 编译成可执行文件,并安装到指定的目录中。
NGINX 编译参数众多,以下是对一些主要参数的介绍:
–prefix= 指向安装目录,用于指定 NGINX 安装的位置。
–sbin-path 指向(执行)程序文件(nginx),确定 nginx 可执行文件的路径。
–conf-path= 指向配置文件(nginx.conf),指定配置文件的存放位置。
–error-log-path= 指向错误日志目录,用于设置错误日志的输出路径。
–pid-path= 指向 pid 文件(nginx.pid),确定进程 ID 文件的位置。
–lock-path= 指向 lock 文件(nginx.lock),安装文件锁定,防止安装文件被别人利用或自己误操作。
–user= 指定程序运行时的非特权用户,提高系统的安全性。
–group= 指定程序运行时的非特权用户组,与用户配合使用。
–builddir= 指向编译目录,指定编译过程中产生的文件存放的位置。
–with-rtsig_module 启用 rtsig 模块支持(实时信号),提高系统的响应能力。
–with-select_module 启用 select 模块支持(一种轮询模式,不推荐在高载环境下使用),禁用时使用 “–without-select_module”。
–with-poll_module 启用 poll 模块支持(功能与 select 相同,为一种轮询模式,不推荐在高载环境下使用)。
–with-file-aio 启用 file aio 支持(一种 APL 文件传输格式),提高文件传输的效率。
–with-ipv6 启用 ipv6 支持,使 NGINX 能够处理 IPv6 地址的请求。
–with-http_ssl_module 启用 ngx_http_ssl_module 支持(使支持 https 请求,需已安装 openssl),提供安全的 HTTPS 服务。
–with-http_realip_module 启用 ngx_http_realip_module 支持(这个模块允许从请求标头更改客户端的 IP 地址值,默认为关),在某些情况下可以更准确地获取客户端的真实 IP 地址。
–with-http_addition_module 启用 ngx_http_addition_module 支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求),增强响应的灵活性。
–with-http_xslt_module 启用 ngx_http_xslt_module 支持(过滤转换 XML 请求),对于处理 XML 数据的应用非常有用。
–with-http_image_filter_module 启用 ngx_http_image_filter_module 支持(传输 JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd 库要用到),提高图片处理的效率。
–with-http_geoip_module 启用 ngx_http_geoip_module 支持(该模块创建基于与 MaxMind GeoIP 二进制文件相配的客户端 IP 地址的 ngx_http_geoip_module 变量),可以根据客户端的地理位置进行不同
推荐信息技术
关于NGINX原理、配置与编译安装命令
本文来自投稿,不代表本站立场,如若转载,请注明出处: