文章目录
···
前言
在现代互联网架构中,Nginx 已经成为了许多网站和应用程序的首选服务器。无论是作为一个 Web 服务器、反向代理服务器、邮件代理服务器,还是负载均衡器,Nginx 都展现了其高效、稳定和灵活的特性。本文将详细介绍 Nginx 的核心概念、工作原理以及常见的使用场景,希望能为那些对 Nginx 感兴趣的开发者提供一个全面的参考。
一、什么是 Nginx?
Nginx(读作“Engine-X”)是由俄罗斯开发者 Igor Sysoev 在2004年首次发布的开源高性能 HTTP 服务器和反向代理服务器。Nginx 的设计目标是处理高并发连接的场景,同时保持较低的内存使用。由于其卓越的性能和稳定性,Nginx 很快成为了 Apache 的主要竞争对手。
Nginx 的主要特点包括:
高并发连接处理能力: Nginx 采用事件驱动(event-driven)的架构,这使得它能够高效地处理大量的并发连接,尤其在处理静态内容时表现出色。
反向代理和负载均衡: Nginx 能够充当反向代理服务器,将客户端的请求转发到后端服务器,同时支持多种负载均衡算法,例如轮询(Round Robin)、最少连接(Least Connections)等。
低内存占用: 与传统的进程或线程模型不同,Nginx 使用单线程处理多个请求的方式,大大降低了内存消耗。
模块化设计: Nginx 的核心功能可以通过模块扩展,这使得它能够适应多种使用场景。
简单配置: Nginx 的配置文件采用模块化的语法结构,清晰且易于管理。
二、Nginx 的架构和工作原理
Nginx 的架构设计与传统的 Web 服务器不同,它采用了异步非阻塞的事件驱动模型,这使得它能够同时处理成千上万的连接,而不会像其他基于进程或线程的服务器那样由于过多的上下文切换而导致性能下降。
1. 核心架构
Nginx 的核心架构主要包括以下几个组件:
主进程(Master Process): 负责加载配置文件并管理工作进程。主进程不处理实际的请求,而是负责分发信号给工作进程,处理日志等。
工作进程(Worker Processes): 实际处理客户端的请求。Nginx 的事件驱动模型使得每个工作进程可以高效地处理多个客户端请求。
事件驱动机制: Nginx 通过 epoll(Linux 下的高效 I/O 多路复用机制)来监控多个套接字,确保在任何套接字准备好读或写时,立即进行相应的操作。这种非阻塞的机制使得 Nginx 在处理大量并发连接时依然能够保持高性能。
2. 请求处理流程
Nginx 处理请求的过程可以分为以下几个步骤:
接收请求: 客户端发起请求,Nginx 主进程接收请求并将其分发给工作进程处理。
反向代理: 如果 Nginx 配置为反向代理服务器,它会将请求转发到后端的应用服务器,并在收到应用服务器的响应后,将其返回给客户端。
静态内容处理: 对于静态文件,如 HTML、CSS、JavaScript 和图片等,Nginx 可以直接从磁盘读取并返回给客户端,而无需经过应用服务器。
响应客户端: Nginx 将生成的响应通过网络返回给客户端,并关闭连接或保持连接以处理后续的请求。
三、Nginx 的常见使用场景
Nginx 的灵活性使得它能够在多种场景中使用。以下是一些常见的 Nginx 使用场景:
1. 作为 HTTP 服务器
Nginx 最常见的用途之一是作为静态内容的 HTTP 服务器。由于其高效的处理能力和低资源消耗,Nginx 在提供静态文件(如 HTML 页面、图片、视频等)时表现非常出色。很多大型网站,如 GitHub、WordPress、Netflix 等,都使用 Nginx 来处理静态内容的传输。
2. 反向代理服务器
Nginx 也经常被用作反向代理服务器,它能够将客户端的请求转发到一个或多个后端服务器,并根据配置的负载均衡算法选择合适的服务器来处理请求。这种架构能够提高网站的可扩展性和可靠性。
3. 负载均衡器
Nginx 支持多种负载均衡算法,可以在多个后端服务器之间分发请求,减轻单个服务器的负载压力,提高整体系统的可用性。此外,Nginx 还可以监控后端服务器的健康状态,自动将请求从不可用的服务器转移到可用的服务器上。
4. SSL/TLS 终结器
Nginx 可以处理 SSL/TLS 加密连接,充当 SSL/TLS 终结器。这意味着它能够在客户端与服务器之间建立加密连接,同时将解密后的请求转发到后端服务器。这样可以减轻后端服务器的负载,并简化 SSL 证书的管理。
5. 动态内容缓存
Nginx 还可以用作缓存服务器,将动态生成的内容缓存一段时间,减少后端服务器的负载,并加快用户的访问速度。这在需要高性能的应用场景中非常有用。
四、nginx源码包的获取
nginx官方下载地址
链接: nginx下载地址
进去后会看到如下页面
选择合适的版本直接点击下载即可
这里使用1.24版本的nginx
之后拖到xshell面板内即可
如果拖拽显示0000000
yum -y install lrzsz
五、安装过程
先安装依赖
yum -y install gcc gcc-c++ pcre-devel zlib-devel openssl-devel
解包
tar xf nginx-1.24.0.tar.gz
编译
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre --with-stream --with-stream_ssl_module
解释
./configure: 这是用于配置 Nginx 源代码编译选项的脚本。在编译 Nginx 之前,你需要运行这个脚本来选择要包含的模块、安装位置以及其他设置。
–prefix=/usr/local/nginx: 指定 Nginx 的安装目录。此选项将 Nginx 安装在 /usr/local/nginx 目录下。默认情况下,Nginx 安装在 /usr/local/nginx,但你可以使用此选项更改安装位置。
–user=nginx: 指定运行 Nginx 进程的用户。在这个例子中,Nginx 将以 nginx 用户身份运行。这个选项有助于提高安全性,防止 Nginx 进程以 root 用户的身份运行。
–group=nginx: 指定 Nginx 进程所属的用户组。在这个例子中,Nginx 进程将属于 nginx 组。这也有助于提高安全性。
–with-http_ssl_module: 启用 HTTP SSL 模块。这个模块允许 Nginx 使用 HTTPS(通过 SSL/TLS 协议)来加密 HTTP 流量,从而确保客户端和服务器之间的通信安全。
–with-http_v2_module: 启用 HTTP/2 模块。HTTP/2 是 HTTP 协议的最新版本,支持更高效的多路复用、压缩和优先级排序,显著提高了网络性能。
–with-http_realip_module: 启用 HTTP Real IP 模块。这个模块用于更正客户端 IP 地址,特别是在 Nginx 处于反向代理模式下时。它能够将请求的原始客户端 IP 地址从 HTTP 头中提取出来(例如 X-Forwarded-For),而不是使用代理服务器的 IP 地址。
–with-http_gzip_static_module: 启用 HTTP Gzip Static 模块。这个模块用于在发送响应前压缩静态文件,从而减少带宽使用和提高传输速度。该模块可以预压缩文件,然后直接提供压缩后的版本给客户端。
–with-http_stub_status_module: 启用 HTTP Stub Status 模块。这个模块提供了 Nginx 的状态信息,例如当前活动连接数、请求数等,有助于监控 Nginx 的运行状况和性能。
–with-pcre: 启用 PCRE(Perl Compatible Regular Expressions)库的支持。PCRE 用于正则表达式匹配操作,例如在 Nginx 配置中使用 location 块进行路径匹配时需要用到正则表达式。
–with-stream: 启用 TCP/UDP 流处理模块。该模块允许 Nginx 处理 TCP 和 UDP 流量,通常用于反向代理或负载均衡 TCP 和 UDP 流量,例如数据库连接、邮件服务器或其他基于 TCP/UDP 的服务。
–with-stream_ssl_module: 启用 Stream SSL 模块。这个模块允许 Nginx 对 TCP/UDP 流量进行 SSL/TLS 加密处理,通常与 --with-stream 一起使用,以确保在流量传输时提供安全加密。
安装
make && make install
添加环境变量(在root目录下)
vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
加载
source ~/.bash_profile
为什么要做这个配置?
方便我们使用nginx命令
比如说配置之前我们启用nginx
/usr/local/nginx/sbin/nginx
现在
nginx
可以做到简化命令
编辑配置文件
vim /usr/local/nginx/conf/nginx.conf
添加用户
useradd -s /sbin/nologin -M nginx
六、添加成为系统服务
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
加载
systemctl daemon-reload
这样我们就可以使用systemd命令了
比如
启动nginx
systemctl start nginx
重启nginx
systemctl restart nginx
关闭nginx
systemctl stop nginx