文章目录
nginx概述
什么是nginx
nginx是一种轻量级/高性能的反向代理web服务器,可实现高效的反向代理、负载均衡,支持处理2-3万的并发连接数,是目前国内主流的web服务器。
nginx的优势
- 配置简单,内存消耗少,源代码可移植,支持跨平台
- 使用epoll模型(epoll是 Linux 中用于处理大量文件描述符(通常是套接字)的 I/O 复用机制。是一种高效的事件通知机制,常用于实现高性能的网络服务器。)
- 支持高并发连接,能处理2-3万并发连接数
- 具有丰富的模块和插件生态系统,允许用户根据需求扩展其功能,包括缓存、安全性、日志记录等
nginx与Apache的区别
- 架构和性能:
- Nginx: 采用异步、事件驱动的架构,适用于处理大量并发连接。它通常在高负载和高并发环境下表现出色,具有低内存消耗。
- Apache: 采用多进程和多线程的架构,适用于处理并发连接较少的场景。Apache在高并发情况下可能会消耗更多的内存。
- 处理连接的方式:
- Nginx: 采用单线程模型,但能够处理大量并发连接,非阻塞方式。
- Apache: 使用多进程或多线程来处理连接,每个连接使用一个独立的进程或线程。这可能导致资源消耗较高,特别是在大量并发连接的情况下。
- 静态和动态内容处理:
- Nginx: 擅长处理静态内容,但也可以处理动态内容。对于动态内容,通常需要与后端应用服务器(如FastCGI、uWSGI、或反向代理到应用服务器)配合使用。
- Apache: 传统上更擅长处理动态内容,具有丰富的模块和支持,可以直接解析和执行多种脚本语言(如PHP、Perl、Python)。
- 配置语法和易用性:
- Nginx: 配置文件简洁、清晰,语法相对简单,易于理解和维护。配置更灵活,可以轻松实现反向代理、负载均衡等。
- Apache: 配置文件相对复杂,语法略显繁琐。但通过.htaccess文件,用户可以在特定目录下覆盖主配置,提高了灵活性。
nginx为什么能支持高并发
- 异步、事件驱动架构: Nginx采用了异步、事件驱动的处理模型,与传统的多进程/多线程模型不同。在这种模型中,Nginx使用单一的主线程来处理多个并发连接,通过非阻塞的方式处理I/O操作。这使得Nginx能够更高效地处理大量并发连接,而无需为每个连接创建一个新的线程或进程。
- 单线程处理多个连接: Nginx的单线程模型允许它同时处理数千个并发连接,而不会因为线程或进程的创建而消耗过多的系统资源。这降低了系统的开销,使得Nginx在高并发场景下更为高效。
- 事件驱动、非阻塞的 I/O 操作: Nginx使用事件驱动的方式处理连接,它在等待I/O操作的同时可以处理其他任务,而不会阻塞整个进程。这种非阻塞的I/O操作使得Nginx能够在相同的硬件上处理更多的并发连接。
- 优化的内存管理: Nginx对内存的使用进行了优化,内存分配和释放相对较为高效。它使用少量的内存来维护每个连接的状态,避免了过多的内存开销。
- 事件驱动的定时器: Nginx使用事件驱动的定时器,能够高效地处理超时事件,而不需要轮询所有连接。这使得Nginx在高并发场景下能够及时地处理连接的超时和关闭。
- 高效的网络模块: Nginx的网络模块经过精心设计和优化,包括对TCP连接的高效处理、快速的数据传输等。这些特性使得Nginx在网络层面上能够更好地应对高并发情况。
nginx的两种进程
- 主进程(master process):
- 启动和管理工作进程: 主进程负责启动和管理所有的工作进程。在启动时,主进程会读取配置文件,然后创建工作进程,并将控制权交给它们。
- 监听端口: 主进程负责监听配置中指定的端口,处理新的连接请求。当有新的连接进来时,主进程会将其分配给其中的一个工作进程处理。
- 监控工作进程状态: 主进程定期检查工作进程的状态,并在需要时重新启动或关闭工作进程。这有助于确保Nginx的稳定性和可靠性。
- 工作进程(worker process):
- 处理客户端请求: 每个工作进程都负责处理客户端的请求。它们接收来自主进程的连接,并在请求到达时执行相应的操作,如读取静态文件、代理请求到后端服务器等。
- 并发处理: 工作进程采用异步、事件驱动的方式处理请求,使得它们能够高效地处理大量并发连接。每个工作进程都是相对独立的,它们之间不共享内存,通过进程间通信(IPC)与主进程通信。
- 负载均衡: 如果配置了多个工作进程,它们可以共同处理来自客户端的请求,实现简单的负载均衡。主进程会将新的连接均匀地分配给各个工作进程。
nginx的应用场景
-
Web服务器:
- Nginx作为高性能的Web服务器,用于提供静态内容服务。它能够高效地处理大量并发连接,适用于快速响应大规模用户请求的情境。
-
反向代理服务器:
- Nginx可以用作反向代理,将客户端的请求转发到后端的应用服务器。这种方式可以提高应用的安全性、性能和可伸缩性,同时隐藏后端服务器的真实IP地址。
-
负载均衡器:
- Nginx充当负载均衡器时,可以将客户端请求分发到多个后端服务器,实现负载均衡。这有助于分担服务器负载,提高整体性能和可用性。
-
静态文件服务器:
- Nginx在处理静态文件(如图片、CSS、JavaScript等)上表现出色,适用于作为静态文件服务器。它能够高效地提供静态内容,降低了后端服务器的负担。
-
缓存服务器:
- Nginx可以配置为缓存服务器,将经常请求的内容缓存起来,减轻后端服务器的负载。这对于提高响应速度和降低服务器压力很有帮助。
编译安装nginx
-
从官网下载安装包并上传到/opt目录
https://nginx.org/en/download.html -
关闭防火墙和安全机制
systemctl stop firewalld systemctl disable firewalld setenforce 0
-
安装依赖包
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
-
创建nginx用户
useradd -M -s /sbin/nologin nginx
-
编译安装nginx
cd /opt tar xf nginx-1.24.0.tar.gz #解压安装包 cd nginx-1.24.0/ ./configure \ #设置编译参数 --prefix=/usr/local/nginx \ #指定nginx的安装路径 --user=nginx \ #指定用户名 --group=nginx \ #指定组名 --with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计 make && make install #编译并安装 ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统识别nginx的操作命令
-
检查、启动、重启、停止 nginx服务
nginx -t #检查配置文件是否配置正确 /usr/local/nginx/sbin/nginx #使用绝对路径启动nginx ss -natp|grep nginx #nginx默认端口号80 ps aux|grep nginx #nginx的两个进程 cat /usr/local/nginx/logs/nginx.pid #先查看nginx的PID号 kill `cat /usr/local/nginx/logs/nginx.pid` #用kill发信号来停止nginx
日志分割,重新打开日志文件
cd /usr/local/nginx/log #nginx的日志文件目录
[root@localhost logs]# ls
access.log error.log nginx.pid #nginx的访问日志、错误日志和pid
mv *.log /tmp #移走日志,ls查看只剩下nginx.pid这个文件
[root@localhost logs]# ls
nginx.pid
[root@localhost logs]# kill -1 `cat nginx.pid` #kill -1 重载或者 kill -USR1 PID
[root@localhost logs]# ls
access.log error.log nginx.pid #日志文件恢复
nginx平滑升级
[root@localhost logs]# nginx -v #查看nginx版本
nginx version: nginx/1.24.0
- 官网下载新版本安装包并上传解压
- 进入解压安装包并设置编译参数,可使用nginx-V 显示 Nginx 编译时的配置参数和模块信息
- 使用 make和make upgrade 进行平滑升级(或使用 kill -USR2 <PID号>进行平滑升级)
具体操作如下
[root@localhost opt]# cd nginx-1.25.3/
[root@localhost nginx-1.25.3]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@localhost nginx-1.25.3]# nginx -V
nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@localhost nginx-1.25.3]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@localhost nginx-1.25.3]# make
[root@localhost nginx-1.25.3]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
#设置备份文件
[root@localhost nginx-1.25.3]# cp objs/nginx /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.25.3]# kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
[root@localhost nginx-1.25.3]# nginx -v
nginx version: nginx/1.25.3
使用systemd管理nginx
-
编写systemd单元文件
vim /lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target ------------------------------------------------------------------------------------- [Unit]:服务的说明 Description:描述服务 After:依赖,当依赖的服务启动之后再启动自定义的服务 [Service]服务运行参数的设置 Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。 ExecStart为服务的具体运行命令 ExecReload为重启命令 ExecStop为停止命令 PrivateTmp=True表示给服务分配独立的临时空间 注意:启动、重启、停止命令全部要求使用绝对路径 [Install]服务安装的相关设置,可设置为多用户
-
关闭之前启动的nginx服务
killall nginx
-
启动nginx并设置开机自启
systemctl start nginx.service systemctl enable nginx.service
-
检查服务是否启动成功
systemctl status nginx.service ps aux|grep nginx