1、Nginx简介

1.1 什么是Nginx

  • Nginx(发音同engine x)是一款由俄罗斯程序员lgor Ssoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。起初是供俄国大型的门户网站及搜索引Rambler(俄语: Pamnep)使用。此软件BSD-like协议下发以在UNIX、GNU/Linux、BSD、Mac osX、Solaris,以及Microsoft Windows等操作系统中运行。

  • Nginx 因具有高并发(特别是静态资源)、 占用系统资源少等特性,目功能丰富而逐渐流行起来。在功能应用方面,Nginx 不但是一个优秀的 Web 服务软件,还具有反向代理负载均衡功能和缓存服务功能。

  • Nginx 的官方介绍见 nginx news

image-20240416153953702

1.2 Nginx 相比 Apache 有以下优势

  • 高并发处理能力: Nginx 是自称为高性能的 Web 服务器,能够处理大量并发连接。在高并发的情况下,Nginx 比 Apache 更加稳定和高效。

  • 更少的资源占用: Nginx 的内存占用更少,可以在低内存的环境下运行,而 Apache 则需要更多的内存资源。

  • 更强大的反向代理和负载均衡功能: Nginx 作为反向代理和负载均衡服务器的功能更强大,特别是在高并发的情况下表现得更好。

  • 配置简单、易上手: Nginx 的配置文件相对来说比较简单,易于维护和管理,而 Apache 的配置文件则相对来说比较复杂。

1.3 Nginx关键特性

  • 支持高并发:单机Nginx可支持十万级的并发连接,经过优化后可最高支持百万级并发连接。

  • 内存资源消耗低:在同级web服务器中,Nginx占用的内存最少,一万非活跃的httpkeep-alive连接仅消耗2.5M内存。

  • 高扩展性:和Apache一样,Nginx采用模块化设计,并支持非常丰富的第三方模块。

  • 高可靠性:Nginx采用master-worker模式,如果worker出现故障,master可以快速开启一个新的worker来提供服务。

1.4 Nginx的模块与工作原理

  • Nginx的模块可以分为核心模块、基础模块和第三方模块。核心模块包括HTTP模块、EVENT模块和MAIL模块,它们负责构建Nginx的基础服务和管理其他模块。基础模块如HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块等,提供了处理HTTP请求的基本功能。第三方模块则是用户根据自己的需求开发的模块,例如HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块等。

  • Nginx的工作原理涉及几个关键步骤。首先,当客户端发起请求时,Master进程负责监听端口并接受连接请求4。接着,Master进程会根据一定的策略选择一个空闲的Worker进程来处理该请求4。Worker进程接收到请求后,会根据配置文件中定义的规则,将请求传递给相应的处理模块5。这些处理模块可能是处理器模块(Handlers),直接处理请求并生成响应;或者是过滤器模块(Filters),对其他模块输出的内容进行修改;又或者是代理类模块(Proxies),与后端服务如FastCGI等进行交互,实现服务代理和负载均衡等功能。

  • 在处理完请求后,Nginx会生成响应并将其发送回客户端。一旦请求完成,可以根据配置保持连接活动状态以便复用,或者关闭连接以释放资源4。Nginx的这种事件驱动架构和异步非阻塞的事件处理模型,使其能够高效地处理大量并发连接,同时保持低资源消耗。

1.4.1 Nginx的模块从功能上分为如下三类

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改 headers 信息等操作Handlers处理器模块一般只能有一个口

  • Filters(过滤器模块)。主要作用是对已经由处理器模块(Handlers)输出的内容进行进一步的处理和修改。这些处理包括但不限于内容压缩、缓存、日志记录、请求和响应的修改等。

  • Proxies(代理类模块)。此类模块是 Nginx的HTTP Upstream之类的模块,这些模块Proxies主要与后端一些服务比如 FastCGI 等进行交互,实现服务代理和负载均衡等功能。

image-20240416154534561

1.5 Nginx的反向代理功能

  • Nginx反向代理的工作流程:

    • 客户端向Nginx发送请求

    • Nginx在收到客户端发送的请求后,将请求转发到后端服务器

    • 后端服务器将客户端请求的资源回复给Nginx

    • Nginx将资源返回给客户端

  • Nginx反向代理通过位于location中的proxy_pass实现

  • 在反向代理的工作流程中,客户端向代理请求资源时使用的端口,可以和服务器提供服务的端口不一致

image-20240416154733480

1.5.1 正向代理和反向代理的区别

1.5.1.1 正向代理(Forward Proxy)
  • 客户端视角:正向代理位于客户端和目标服务器之间,客户端必须配置代理服务器的信息才能访问外部网络。客户端通过正向代理发送请求,代理服务器接收请求并转发给目标服务器。

  • 隐藏客户端身份:正向代理的主要目的是隐藏客户端的真实IP地址,保护客户端的隐私和安全。

  • 访问控制:企业或组织通常使用正向代理来控制内部网络用户对外部互联网的访问,实现访问策略、内容过滤和带宽管理等功能。

  • 直接性:正向代理的客户端知道代理服务器的存在,因为它们需要配置代理服务器的信息才能访问外部资源。

1.5.1.2 反向代理(Reverse Proxy)
  • 服务器视角:反向代理位于服务器的前端,客户端并不直接与目标服务器通信,而是将请求发送给反向代理服务器,由反向代理服务器将请求转发给目标服务器。

  • 负载均衡:反向代理通常用于负载均衡,它可以将客户端的请求分发到多个后端服务器上,提高系统的可用性和扩展性。

  • 安全性和匿名性:反向代理可以隐藏后端服务器的真实IP地址,提供额外的安全层。此外,它还可以对请求进行加密和SSL终端。

  • 缓存静态内容:反向代理可以缓存后端服务器的静态内容,减少后端服务器的负载,提高响应速度。

  • 间接性:客户端通常不知道反向代理的存在,因为它们直接与反向代理通信,就像与实际的服务器通信一样。

1.5.1.3 示例图

image-20240416154921837

1.6 Nginx的负载均衡功能

  • Nginx可以提供四层和七层的负载均衡

  • Nginx的负载均衡功能通过位于http中的upstream实现

  • Nginx提供了多种负载均衡算法,如轮询、权重等

  • 轮询算法下,Nginx会轮流将请求发送给不同的服务器,使每个服务器都均等的提供服务

  • 权重算法下,Nginx会按照配置的权重比例,将请求发送给服务器。性能较好的服务器将提供更多的服务,性能较好的服务器将提供较少的服务

image-20240416155246210

2、Nginx安装部署

系统:Rocky Linux 8

2.1 RPM包安装

[root@Rocky8-node1 ~]# wget -c https://nginx.org/packages/rhel/8/x86_64/RPMS/nginx-1.24.0-1.el8.ngx.x86_64.rpm
[root@Rocky8-node1 ~]# yum install nginx-1.24.0-1.el8.ngx.x86_64.rpm -y
[root@Rocky8-node1 ~]# nginx -v
nginx version: nginx/1.24.0

2.2 源码(二进制)安装

2.2.1 下载并解压安装包

[root@Rocky8-node1 ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz
[root@Rocky8-node1 ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/

2.2.2 安装依赖

[root@Rocky8-node1 ~]# yum install gcc gcc-c++ make pcre-devel openssl-devel -y

2.2.3 编译前环境配置

[root@Rocky8-node1 ~]# mkdir -p /var/log/nginx  #创建配置目录
[root@Rocky8-node1 ~]# cd /usr/local/src/nginx-1.24.0/
[root@Rocky8-node1 nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
> --sbin-path=/usr/sbin/nginx \
> --http-log-path=/var/log/nginx/access.log \
> --error-log-path=/var/log/nginx/error.log \
> --pid-path=/run/nginx.pid
  • --prefix=/usr/local/nginx:设置Nginx的安装路径为/usr/local/nginx。

  • --sbin-path=/usr/sbin/nginx:设置Nginx二进制文件的路径为/usr/sbin/nginx。

  • --http-log-path=/var/log/nginx/access.log:设置HTTP请求日志文件的路径为/var/log/nginx/access.log。

  • --error-log-path=/var/log/nginx/error.log:设置错误日志文件的路径为/var/log/nginx/error.log。

  • --pid-path=/run/nginx.pid:设置Nginx主进程ID文件的路径为/run/nginx.pid。

注意:获取这些内容可以在测试环境使用RPM安装Nginx,通过nginx -V命令获取

2.2.4 编译并安装

[root@Rocky8-node1 nginx-1.24.0]# make && make install
[root@Rocky8-node1 nginx-1.24.0]# nginx -v
nginx version: nginx/1.24.0

2.2.5 配置系统服务脚本

[root@Rocky8-node1 nginx-1.24.0]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
​
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID                                                                                           
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
​
[Install]
WantedBy=multi-user.target
​
[root@Rocky8-node1 nginx-1.24.0]# systemctl daemon-reload   #重新加载systemd管理器的配置

2.2.6 启动停止测试

[root@Rocky8-node1 nginx-1.24.0]# systemctl start nginx  #正常启动
[root@Rocky8-node1 nginx-1.24.0]# systemctl is-active nginx.service 
active
[root@Rocky8-node1 nginx-1.24.0]# ps -ef | grep nginx
root       10947       1  0 16:25 ?        00:00:00 nginx: master process /usr/sbin/nginx
nobody     10948   10947  0 16:25 ?        00:00:00 nginx: worker process
root       10950    1613  0 16:25 pts/0    00:00:00 grep --color=auto nginx
​
[root@Rocky8-node1 nginx-1.24.0]# systemctl stop nginx.service 
[root@Rocky8-node1 nginx-1.24.0]# systemctl is-active nginx.service 
inactive
[root@Rocky8-node1 nginx-1.24.0]# ps -ef | grep nginx
root       10977    1613  0 16:25 pts/0    00:00:00 grep --color=auto nginx

2.3 Nginx配置文件

[root@Rocky8-node1 ~]# rpm -qc nginx
/etc/logrotate.d/nginx
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
  • /etc/logrotate.d/nginx:Nginx 的日志轮转配置文件,用于管理 Nginx 日志的轮转和压缩。

  • etc/nginx/conf.d/default.conf :Nginx 默认的服务器配置文件,可以在此文件中进行网站和虚拟主机的配置。

  • /etc/nginx/fastcgi_params :Nginx FastCGI 配置文件,包含了一些 FastCGI 的参数设置。

  • /etc/nginx/mime.types :Nginx MIME 类型配置文件,定义了文件扩展名与 MIME 类型的映射关系。

  • /etc/nginx/nginx.conf :Nginx 主配置文件,包含了全局的 Nginx 配置项和指令。

  • /etc/nginx/scgi_params :Nginx SCGI 配置文件,定义了一些 SCGI 的参数设置。

  • /etc/nginx/uwsgi_params:Nginx uWSGI 配置文件,定义了一些 uWSGI 的参数设置。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐