一. Nginx是什么?
1. Nginx概述
- 高性能、轻量级Web服务软件
- 系统资源消耗低
- 对HTTP并发连接的处理能力高
- 单台物理服务器可支持30,000~50,000个并发请求
- Nginx(发音同 “engine x”)是一个高性能的反向代理和Web服务器软件,由俄罗斯人Igor Sysoev开发。第一个版本发布于2004年,源代码基于双条款BSD许可证发布。Nginx在互联网企业中因其资源消耗低、运行稳定且高性能的并发处理能力而广泛应用。
- Nginx是互联网上最受欢迎的开源Web服务器之一,不仅提供了一整套开发和交付的应用技术,还是应用交付领域的开源领导者。
- 2019年3月,F5宣布收购Nginx,将其作为F5的一部分。F5表示,将加强对开源和Nginx应用平台的投资,致力于Nginx开源技术、开发人员和社区的发展。
2. Nginx模块与作用
- main模块:全局配置模块,配置运行nginx服务器的用户(组)、worker_process数(进程)、nginx进程PID存放路径、错误日志存放路径、配置文件的引入等。
- stream服务模块:实现反向代理功能,包括TCP协议代理。
- 邮件服务模块:支持Nginx的邮件服务,对POP3、IMAP和SMTP协议的支持。
- 第三方模块:二次开发扩展Nginx服务器应用,完成开发者自定义功能(如Json支持、Lua支持)。
- events模块:影响nginx服务器与用户的网络连接。
events { worker_connections 65536; use epoll; accept_mutex on; multi_accept on; }
- http模块:跟web服务相关,扩展标准的HTTP功能,处理一些特殊服务,包含自定义服务日志、sendfile传输文件、连接超时时间、单连接请求数上限、Flash多媒体传输、解析GeoIP请求、网络传输压缩、安全协议SSL支持等。
- location模块:uri网址定位。
- server模块:服务模块,配置80端口监听、虚拟主机、DNS域名解析等。
- auth_basic模块:对网页设置用户名密码。
- gzip模块:压缩。
- proxy模块:设置后端IP地址、端口号及http和加密的https。
- ssl模块:https加密。
3. Nginx三大作用:反向代理、负载均衡、动静分离
- 反向代理:在服务端配置,客户端访问服务器A,服务器A为代理服务器,将客户请求转发到服务器B。
- 作用:缓存服务器响应,减少服务器压力;负载均衡,将用户请求分配给多个服务器;访问控制。
- 正向代理:在客户端配置,代理服务器代理客户端与目标服务器进行交互。
- 作用:提高访问速度;隐藏客户端真实IP地址。
- 负载均衡:分摊到多个操作单元(如Web服务器、FTP服务器等)上进行执行,从而共同完成工作任务。
- Nginx七层负载均衡调度算法:
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器。
upstream backendserver { server 192.168.10.14:80 max_fails=2 fail_timeout=10s; server 192.168.10.15:80 max_fails=2 fail_timeout=10s; }
- 加权轮询:指定轮询几率,weight值和访问比例成正比。
upstream backendserver { server 192.168.10.14:80 weight=5 max_fails=2 fail_timeout=10s; server 192.168.10.15:80 weight=10 max_fails=2 fail_timeout=10s; }
- IP哈希:每个请求按访问IP的hash结果分配,解决session会话保持问题。
upstream backendserver { ip_hash; server 192.168.10.14:80 max_fails=2 fail_timeout=10s; server 192.168.10.15:80 max_fails=2 fail_timeout=10s; }
- 最少连接数:按Nginx反向代理与后端服务器之间的连接数分配,连接数最少的优先分配。
upstream backendserver { least_conn; server 192.168.0.14:80 max_fails=2 fail_timeout=10s; server 192.168.0.15:80 max_fails=2 fail_timeout=10s; }
- 响应时间(需编译安装第三方模块):按后端服务器的响应时间分配请求,响应时间短的优先分配。
upstream backendserver { fair; server 192.168.10.14:80 max_fails=2 fail_timeout=10s; server 192.168.10.15:80 max_fails=2 fail_timeout=10s; }
- URL哈希(需编译安装第三方模块):按访问URL的hash结果分配请求,使同一个URL访问到同一个后端服务器。
upstream backendserver { server 192.168.10.14:80 max_fails=2 fail_timeout=10s; server 192.168.10.15:80 max_fails=2 fail_timeout=10s; hash $request_uri; }
- 动静分离:通过代理方式,在server{}段中加入带正则匹配的location来指定匹配项。静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。
二. Nginx和Apache的差异
Apache
- 同步多进程模型:一个连接对应一个进程,具有高稳定性。
- 优势:
- rewrite功能强大(实现URL跳转)。
- 模块多,基本可找到所需的模块。
- 稳定性高,bug少。
- PHP支持简单。
- 处理动态请求更有优势。
Nginx
- 异步非阻塞模型:多个连接(万级别)对应一个进程,具有高性能。
- 优势:
- 轻量级,采用C编写,占用更少的内存与资源。
- 抗并发/高并发,负载能力高。
- 处理静态文件性能比Apache高三倍以上。
- 设计高度模块化,编写模块简单。
- 配置简洁,正则配置更简单,可用-t测试配置。
- 作为负载均衡服务器,支持七层负载均衡,有效防止DDoS攻击。
- 可作为反向代理服务器和邮件代理服务器使用。
- 支持热部署,在线升级。
通过这些对比,可以根据具体需求选择使用Nginx或Apache。
三、Nginx的应用场景
Web服务器:
- Nginx可以作为一个独立的HTTP服务器,提供HTTP服务。它能够高效地处理静态资源(如HTML、CSS、JavaScript和图片文件)的请求,成为一个高性能的静态服务器。
虚拟主机:
- Nginx可以在一台物理服务器上配置多个虚拟主机,分别对应不同的网站。这可以通过不同的IP地址、端口号或域名来实现。这种功能对托管多个网站非常有用,节省了硬件成本。
反向代理服务器与负载均衡:
- 当网站的访问量增大时,单台服务器可能无法满足所有用户的请求。Nginx可以作为反向代理服务器,将请求分发到后端的多台服务器,实现负载均衡。通过这种方式,可以确保每台服务器的负载均衡,不会有某台服务器过载或闲置。Nginx还支持多种负载均衡策略,如轮询、IP hash等。
安全管理:
- Nginx可以配置安全管理功能,例如搭建API接口网关。通过这种方式,Nginx能够对每个接口服务进行拦截和安全检查,防止恶意攻击和未授权访问,提高系统的安全性。
缓存服务器:
- Nginx可以作为缓存服务器,将经常访问的资源缓存到内存中,加快资源的访问速度,减少服务器的压力,提高整体性能。
四、Nginx为什么能支持高并发
Nginx支持高并发的核心原因在于其采用了异步非阻塞的架构,利用了Linux的
epoll
机制,并且可以进行配置细节优化。
- 异步非阻塞架构:
- 如果每个请求都由一个独立的进程或线程处理,那么系统资源消耗会非常高,特别是在等待网络传输时,这种方式非常低效。而Nginx采用异步非阻塞的运行方式,可以有效地避免这一问题。
- Nginx有一个主调度进程和多个工作进程,每当有请求到达时,主进程会将请求分配给工作进程进行处理。由于大部分请求处理时间都耗费在网络传输上,实际在服务器上占用的时间并不多,Nginx通过少量进程就能高效处理大量并发请求。
五、为什么Nginx不使用多线程
Nginx采用单线程来异步非阻塞处理请求,并且管理员可以配置Nginx主进程的工作进程数量。主要原因包括:
资源节约:
- Nginx不会为每个请求单独分配CPU和内存资源,这节省了大量的系统资源。
减少CPU上下文切换:
- 使用单线程避免了频繁的上下文切换,提高了系统效率。
这种设计使得Nginx能够支持更高的并发量,处理更多的请求。
六、Nginx的两种进程分别有什么作用
Nginx主要有两种进程:master进程和worker进程。
master进程:
- 负责管理worker进程,读取和加载Nginx的配置文件,控制Nginx的启动、重启和关闭等操作。
worker进程:
- 处理实际的连接请求。每个worker进程都可以处理多个连接,并通过异步非阻塞的方式进行高效处理。
七、编译安装nginx
cd /opt/ tar zxvf nginx-1.22.0.tar.gz -C /opt/ cd nginx-1.22.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module make -j16&& make install bash setup-local-yum-repo.sh yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel make -j16&& make install make -j16 && make install ls rm setup-local-yum-repo.sh cd nginx-1.22.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module make -j16 && make install ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ tee /lib/systemd/system/nginx.service <<eof [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 -1 $MAINPID ExecStop=/bin/kill -3 $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target eof chmod 777 /lib/systemd/system/nginx.service sudo useradd -r -d /var/www -s /sbin/nologin nginx systemctl daemon-reload systemctl start nginx
yum安装
Centos7 需要安装epel源
cd /etc/yum.repos.d
vim epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
gpgcheck=0
yum install -y epel-release
yum install nginx -y