前言
- 学习视频:尚硅谷Nginx教程(亿级流量nginx架构设计)
- 本内容仅用于个人学习笔记,如有侵扰,联系删
- 学习文档:
1、简介
1.1、背景介绍
Nginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004 年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx1.0.4发布。
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
1.2、名词解释
-
WEB服务器:
WEB服务器也叫网页服务器,英文名叫Web Server,主要功能是为用户提供网上信息浏览服务。 -
HTTP:
HTTP是超文本传输协议的缩写,是用于从WEB服务器传输超文本到本地浏览器的传输协议,也是互联网上应用最为广泛的一种网络协议。HTTP是一个客户端和服务器端请求和应答的标准,客户端是终端用户,服务端是网站,通过使用Web浏览器、网络爬虫或者其他工具,客户端发起一个到服务器上指定端口的HTTP请求。 -
POP3/SMTP/IMAP:
POP3(Post Offic Protocol 3)邮局协议的第三个版本,
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议,
IMAP(Internet Mail Access Protocol)交互式邮件存取协议,
通过上述名词的解释,我们可以了解到Nginx也可以作为电子邮件代理服务器。 -
反向代理
正向代理
反向代理
1.3、Nginx的优点
- 速度更快、并发更高
单次请求或者高并发请求的环境下,Nginx都会比其他Web服务器响应的速度更快。一方面在正常情况下,单次请求会得到更快的响应,另一方面,在高峰期(如有数以万计的并发请求),Nginx比其他Web服务器更快的响应请求。Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。 - 配置简单,扩展性强
Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方提供的模块,如果需要完全可以开发服务自己业务特性的定制模块。 - 高可靠性
Nginx采用的是多进程模式运行,其中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去"拉起"新的worker进程提供服务。 - 热部署
现在互联网项目都要求以7*24小时进行服务的提供,针对于这一要求,Nginx也提供了热部署功能,即可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。 - 成本低、BSD许可证
BSD是一个开源的许可证,世界上的开源许可证有很多,现在比较流行的有六种分别是GPL、BSD、MIT、Mozilla、Apache、LGPL。这六种的区别是什么,我们可以通过下面一张图来解释下:
Nginx本身是开源的,我们不仅可以免费的将Nginx应用在商业领域,而且还可以在项目中直接修改Nginx的源码来定制自己的特殊要求。这些点也都是Nginx为什么能吸引无数开发者继续为Nginx来贡献自己的智慧和青春。OpenRestry [Nginx+Lua] Tengine[淘宝]
1.4、Nginx的功能特性及常用功能
Nginx提供的基本功能服务从大体上归纳为"基本HTTP服务"、“高级HTTP服务”和"邮件服务"等三大类。
- 基本HTTP服务
Nginx可以提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等。- 处理静态文件、处理索引文件以及支持自动索引;
- 提供反向代理服务器,并可以使用缓存加上反向代理,同时完成负载均衡和容错;
- 提供对FastCGI、memcached等服务的缓存机制,,同时完成负载均衡和容错;
- 使用Nginx的模块化特性提供过滤器功能。Nginx基本过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI以及图像缩放等。其中针对包含多个SSI的页面,经由FastCGI或反向代理,SSI过滤器可以并行处理。
- 支持HTTP下的安全套接层安全协议SSL.
- 支持基于加权和依赖的优先权的HTTP/2
- 高级HTTP服务
- 支持基于名字和IP的虚拟主机设置
- 支持HTTP/1.0中的KEEP-Alive模式和管线(PipeLined)模型连接
- 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转。
- 提供3xx~5xx错误代码重定向功能
- 支持重写(Rewrite)模块扩展
- 支持重新加载配置以及在线升级时无需中断正在处理的请求
- 支持网络监控
- 支持FLV和MP4流媒体传输
- 邮件服务
Nginx提供邮件代理服务也是其基本开发需求之一,主要包含以下特性:
- 支持IMPA/POP3代理服务功能
- 支持内部SMTP代理服务功能
1.5、Nginx常用的功能模块
- 静态资源部署
- Rewrite地址重写
正则表达式 - 反向代理
- 负载均衡
- 轮询、加权轮询、ip_hash、url_hash、fair
- Web缓存
- 环境部署
- 高可用的环境
- 用户认证模块…
1.6、Nginx的核心组成
- nginx二进制可执行文件
- nginx.conf配置文件
- error.log错误的日志记录
- access.log访问日志记录
2、Nginx的安装
2.1、Nginx环境准备
-
虚拟机系统安装
虚拟机环境安装准备
1. VMware WorkStation
2. Centos7
3. MobaXterm
4. 网络VMware中安装CentOS7请参考文档:在VMware中安装CentOS7(超详细的图文教程)
-
确认centos的内核
准备一个内核为2.6及以上版本的操作系统,因为linux2.6及以上内核才支持epoll,而Nginx需要解决高并发压力问题是需要用到epoll,所以我们需要有这样的版本要求。
我们可以使用uname -a
命令来查询linux的内核版本。[root@VM-16-14-centos ~]# uname -a Linux VM-16-14-centos 3.10.0-1160.88.1.el7.x86_64 #1 SMP Tue Mar 7 15:41:52 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
-
确保centos能联网
[root@VM-16-14-centos ~]# ping www.baidu.com PING www.a.shifen.com (180.101.50.188) 56(84) bytes of data. 64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=1 ttl=49 time=11.5 ms 64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=2 ttl=49 time=11.5 ms 64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=3 ttl=49 time=11.6 ms 64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=4 ttl=49 time=11.6 ms
-
确认关闭防火墙
这一项的要求仅针对于那些对linux系统的防火墙设置规则不太清楚的,建议大家把防火墙都关闭掉,因为我们此次课程主要的内容是对Nginx的学习,把防火墙关闭掉,可以省掉后续Nginx学习过程中遇到的诸多问题。
关闭的方式有如下两种:# 1、关闭运行的防火墙,系统重新启动后,防火墙将重新打开 systemctl stop firewalld # 2、永久关闭防火墙,,系统重新启动后,防火墙依然关闭 systemctl disable firewalld # 3、查看防火墙状态 systemctl status firewalld
-
确认停用selinux
selinux(security-enhanced linux),美国安全局对于强制访问控制的实现,在linux2.6内核以后的版本中,selinux已经成功内核中的一部分。可以说selinux是linux史上最杰出的新安全子系统之一。虽然有了selinux,我们的系统会更安全,但是对于我们的学习Nginx的历程中,会多很多设置,所以这块建议大家将selinux进行关闭。
sestatus
查看状态[root@VM-16-14-centos ~]# sestatus SELinux status: disabled
如果查看不是disabled状态,我们可以通过修改配置文件来进行设置,修改SELINUX=disabled,然后重启下系统即可生效。
vim /etc/selinux/config
2.2、Nginx的发行版本
常用版本分为四大阵营:
-
Nginx 开源版 | https://nginx.org/:赤裸裸的Web服务器、反向代理、负载均衡(功能少,开发难度大)
-
Nginx Plus 商业版 | https://www.nginx.com/:什么都有全家桶(付费版本)
-
OpenResty | https://openresty.org/cn/:是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。
-
Tengine | https://tengine.taobao.org/:淘宝二开的Nginx。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
2.3、编译安装Nginx(开源版)
-
下载地址:nginx: download | https://nginx.org/en/download.html
-
配置编译安装环境
tar zxvf nginx-1.20.2.tar.gz
[root@localhost ~]# cd nginx-1.20.2 [root@localhost nginx-1.20.2]# ll 总用量 788 drwxr-xr-x 6 1001 1001 326 8月 14 10:53 auto -rw-r--r-- 1 1001 1001 312251 11月 16 2021 CHANGES -rw-r--r-- 1 1001 1001 476577 11月 16 2021 CHANGES.ru drwxr-xr-x 2 1001 1001 168 8月 14 10:53 conf -rwxr-xr-x 1 1001 1001 2590 11月 16 2021 configure drwxr-xr-x 4 1001 1001 72 8月 14 10:53 contrib drwxr-xr-x 2 1001 1001 40 8月 14 10:53 html -rw-r--r-- 1 1001 1001 1397 11月 16 2021 LICENSE drwxr-xr-x 2 1001 1001 21 8月 14 10:53 man -rw-r--r-- 1 1001 1001 49 11月 16 2021 README drwxr-xr-x 9 1001 1001 91 8月 14 10:53 src
根据编译安装报错,可以判断需要什么环境依赖
以下是关于编译安装的基础知识:
configure文件:这个文件是一个Shell脚本,用于检测系统环境、配置编译选项以及生成相应的Makefile文件。
Makefile文件是软件工程中的一种自动化构建工具文件,主要用于Unix-like操作系统(如Linux、BSD等)和一些集成开发环境(IDEs),用于管理和自动化编译、链接程序的过程。在Makefile中,开发者定义了一系列规则来指导make工具如何编译和链接源代码文件,以生成最终的目标文件(通常是可执行文件或库文件)。
Makefile的核心功能包括:
依赖关系:声明源代码文件之间的依赖关系,当某个源文件或其依赖的头文件发生变化时,仅重新编译受影响的部分而不是整个项目。
规则:定义如何从源文件生成目标文件的规则,包括编译器选项、编译命令、链接命令等。
自动化:通过比较文件的修改时间和目标文件的存在与否,make能自动判断哪些目标需要更新,并执行相应的命令。
目标:可以定义多种目标,如编译调试版、发布版,或者执行测试、清理等任务。
变量和函数:Makefile支持变量和函数,可以用来简化命令行参数和路径名的管理。
模式规则:允许定义通用的转换规则,适用于多个源文件到目标文件的转换情况。
在实际使用中,程序员通过编写Makefile来组织和控制整个项目的构建流程,只需简单地运行make命令,make工具就会读取Makefile文件,分析依赖关系,并执行必要的编译和链接步骤来生成最终的产品。第一次报错+排查(注意看代码注释)
安装gcc[root@localhost nginx-1.20.2]# ./configure --prefix=/usr/local/nginx checking for OS + Linux 3.10.0-862.el7.x86_64 x86_64 checking for C compiler ... not found # 缺少C语言编译器 ./configure: error: C compiler cc is not found # 配置Yum curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum install -y epel-release # gcc是c语言编译器的一种 yum install -y gcc
第二次报错+排查(注意看代码注释)
安装perl库[root@localhost nginx-1.20.2]# ./configure --prefix=/usr/local/nginx ... ... checking for PCRE library in /usr/pkg/ ... not found checking for PCRE library in /opt/local/ ... not found ./configure: error: the HTTP rewrite module requires the PCRE library. # 缺少pcpe库 You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre=<path> option. # 安装 pcre yum install -y pcre pcre-devel
第三次报错+排查(注意看代码注释)
安装zlib库# 再次执行编译安装 [root@localhost nginx-1.20.2]# ./configure --prefix=/usr/local/nginx checking for zlib library ... not found ./configure: error: the HTTP gzip module requires the zlib library. # 确实zlib库 You can either disable the module by using --without-http_gzip_module option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using --with-zlib=<path> option. [root@localhost nginx-1.20.2]# yum install -y zlib zlib-devel # 再次执行,成功安装完成,并可以看到当前目录下生成了Makefile文件 [root@localhost nginx-1.20.2]# ./configure --prefix=/usr/local/nginx creating objs/Makefile Configuration summary + using system PCRE library + OpenSSL library is not used + using system zlib library nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx/conf" nginx configuration file: "/usr/local/nginx/conf/nginx.conf" nginx pid file: "/usr/local/nginx/logs/nginx.pid" nginx error log file: "/usr/local/nginx/logs/error.log" nginx http access log file: "/usr/local/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp"
-
编译安装
# make命令的功能是编译内核或源码文件。 make # 安装已经编译好的程序。复制文件树中到文件到指定的位置 make install # 卸载已经编译好的程序。暂不执行 make uninstall
2.4、操作与配置
-
启动Nginx
进入安装好的目录/usr/local/nginx/sbin
./nginx 启动 ./nginx -s stop 快速停止 ./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求 ./nginx -s reload 重新加载配置 ./nginx -t 测试配置文件语法是否正确
nginx -s reload
命令看似只是重新加载配置。其实是创建了新线程Work来替换的老的线程Work。[root@localhost sbin]# ./nginx [root@localhost sbin]# ps -aux| grep nginx root 12189 0.0 0.0 20572 616 ? Ss 13:22 0:00 nginx: master process ./nginx nobody 12190 0.0 0.0 21016 1312 ? S 13:22 0:00 nginx: worker process root 12192 0.0 0.0 112824 984 pts/0 S+ 13:22 0:00 grep --color=auto nginx
浏览器如果访问不到,请关闭防火墙
-
关于防火墙
防火墙内网可以不开。一般IP需要暴露在外网才开。如果需要防范内部人员也可开启。# 关闭防火墙 systemct1 stop firewalld.service # 禁止防火墙开机启动 systemct1 disable firewalld.service # 放行端口 firewa11-cmd --zone=public --add-port=80/tcp --permanent # 重启防火墙 firewa11-cmd --reload
-
安装成系统服务
- 创建服务脚本
# 编辑Nginx系统服务文件 vi /usr/lib/systemd/system/nginx.service
- 服务脚本内容
[Unit] Description=nginx - web server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=multi-user.target
- 重新加载系统服务
systemctl daemon-reload
- 启动Nginx
注意:使用systemctl
命令启动Nginx前,请使用./nginx -s stop
命令将原方式启动的Nginx关闭./nginx -s stop
systemctl start nginx
- 设置开机启动
systemctl enable nginx
- 查看nginx状态
systemctl status nginx
- 创建服务脚本
3、Nginx 基础使用
3.1、目录结构
进入Nginx的主目录我们可以看到这些文件夹
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
-
临时文件
其中目录带有temp的字段是临时文件,是Nginx运行之后产生的,主要用来存放运行过程中的临时文件client_body_temp fastcgi_temp proxy_temp scgi_temp
带有
temp
目录的项在Nginx的目录结构中主要用于存储临时文件,这些目录与Nginx处理不同类型的请求时产生的临时数据相关。每个temp
目录对应于Nginx处理特定类型请求时的临时存储需求,具体说明如下:client_body_temp
: 存储客户端请求体的临时文件。当客户端发送POST请求,且请求体较大时,Nginx会先将请求体写入到这个目录下的临时文件中,然后再由Nginx处理或转发给后端服务器。fastcgi_temp
: 用于FastCGI请求的临时文件存储。当Nginx作为前端服务器,与后端FastCGI应用服务器(如PHP-FPM)交互时,可能会需要存储一些临时数据,比如上传的文件或者大请求体。proxy_temp
: 服务于HTTP代理和反向代理请求的临时文件。当Nginx作为代理服务器转发请求到后端,并且需要暂存请求或响应的内容时,会用到这个目录。scgi_temp
和uwsgi_temp
: 分别用于SCGI(Simple Common Gateway Interface)和uWSGI(Universal Web Server Gateway Interface)协议相关的临时文件存储。这两种协议类似于FastCGI,用于与不同的后端应用程序服务器通信。
这些临时文件夹的存在,使得Nginx能够高效处理各种类型的请求,尤其是在处理大数据量传输时,避免了直接在内存中存储大量数据,从而降低了系统内存的压力。需要注意的是,这些目录通常由Nginx服务运行的用户(如上面显示的nobody)拥有权限,以确保安全性和隔离性。在生产环境中,定期清理这些临时文件是非常重要的维护操作,以避免磁盘空间被无用的临时文件耗尽。
-
conf
用来存放配置文件相关[root@localhost nginx]# ll conf/ 总用量 68 -rw-r--r-- 1 root root 1077 8月 14 11:10 fastcgi.conf -rw-r--r-- 1 root root 1077 8月 14 11:10 fastcgi.conf.default -rw-r--r-- 1 root root 1007 8月 14 11:10 fastcgi_params -rw-r--r-- 1 root root 1007 8月 14 11:10 fastcgi_params.default -rw-r--r-- 1 root root 2837 8月 14 11:10 koi-utf -rw-r--r-- 1 root root 2223 8月 14 11:10 koi-win -rw-r--r-- 1 root root 5231 8月 14 11:10 mime.types -rw-r--r-- 1 root root 5231 8月 14 11:10 mime.types.default -rw-r--r-- 1 root root 2656 8月 14 11:10 nginx.conf # 主要配置文件,该文件可以引用其它配置文件 -rw-r--r-- 1 root root 2656 8月 14 11:10 nginx.conf.default -rw-r--r-- 1 root root 636 8月 14 11:10 scgi_params -rw-r--r-- 1 root root 636 8月 14 11:10 scgi_params.default -rw-r--r-- 1 root root 664 8月 14 11:10 uwsgi_params -rw-r--r-- 1 root root 664 8月 14 11:10 uwsgi_params.default -rw-r--r-- 1 root root 3610 8月 14 11:10 win-utf
-
html
用来存放静态文件的默认目录 html、css等[root@localhost nginx]# ll html/ 总用量 8 -rw-r--r-- 1 root root 494 8月 14 11:10 50x.html # Nginx访问出现错误时的提示页面 -rw-r--r-- 1 root root 612 8月 14 11:10 index.html # Nginx默认访问的文件
-
log
用来日志文件[root@localhost nginx]# ll logs/ 总用量 12 -rw-r--r-- 1 root root 417 8月 14 11:17 access.log # Nginx用户访问日志文件,所以访问都将记录在该文件中 -rw-r--r-- 1 root root 324 8月 14 11:19 error.log # Nginx访问报错时记录日志文件 -rw-r--r-- 1 root root 5 8月 14 11:19 nginx.pid # 记录Nginx的主进程的Pid的文件
验证nginx.pid文件是否保存的主进程Pid
可以看到nginx.pid文件内容,和nginx: master主进程ID一致。该文件为更具nginx: master主进程PID变化[root@localhost nginx]# cat logs/nginx.pid 12189 [root@localhost nginx]# ps -aux | grep nginx root 12189 0.0 0.0 20572 616 ? Ss 13:22 0:00 nginx: master process ./nginx nobody 12190 0.0 0.0 21016 1312 ? S 13:22 0:00 nginx: worker process root 12207 0.0 0.0 112824 988 pts/0 S+ 13:24 0:00 grep --color=auto nginx
-
sbin
nginx的主程序[root@localhost nginx]# ll sbin/ 总用量 3796 -rwxr-xr-x 1 root root 3883616 8月 14 11:10 nginx # Nginx程序启动文件
3.2、基本运行原理
主进程(Master Process)与工作进程(Worker Processes):
Master Process
:Nginx 启动时,首先会生成一个主进程。主进程主要负责管理子进程、加载和验证配置文件、维护工作进程池,以及响应信号(如重新加载配置、优雅关闭等)。主进程不直接参与处理客户端请求。Worker Processes
:主进程会根据配置文件中指定的数量创建多个工作进程。每个工作进程都能够独立处理客户端的请求,包括接收请求、处理请求、返回响应等。工作进程数量通常与服务器的CPU核心数相匹配,以充分利用硬件资源。
重新加载配置(reload操作):nginx.conf配置文件更改了,Master会将Worker进程Kill掉,Kill之前会留有一段时间让当前的Worker进程处理完手上的请求,不再接收新的请求了。Kill掉之后创建一个新的Worker进程,配置文件读取的也是最新的。
[root@localhost nginx]# ps -aux | grep nginx
root 12189 0.0 0.0 20572 616 ? Ss 13:22 0:00 nginx: master process ./nginx
nobody 12190 0.0 0.0 21016 1312 ? S 13:22 0:00 nginx: worker process
root 12207 0.0 0.0 112824 988 pts/0 S+ 13:24 0:00 grep --color=auto nginx
4、Nginx配置与应用场景
4.1、最小配置
4.1.1、初始配置文件(示例)
[root@localhost conf]# cat nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';