Nginx快速入门及案例
Ngnix介绍
Nginx(发音为“engine X”)是一款高性能、开源的轻量级 Web 服务器和反向代理服务器,同时也支持邮件代理和负载均衡等功能。它由俄罗斯程序员伊戈尔·西索夫(Igor Sysoev)于 2002 年开始开发,并于 2004 年首次公开发布。
Nginx 的主要特点
高性能
高并发处理能力:Nginx 使用异步非阻塞的事件驱动架构,能够高效地处理大量并发连接,相比传统的 Apache 等服务器在高并发场景下表现更为出色。例如,在处理静态资源请求时,Nginx 可以同时处理数万个并发连接,而不会出现明显的性能瓶颈。
低资源消耗:它占用的系统资源较少,即使在高负载情况下也能保持较低的内存和 CPU 使用率。这使得它非常适合运行在资源有限的服务器上。
强大的反向代理功能
负载均衡:
Nginx 可以将客户端的请求分发到多个后端服务器,支持轮询、最少连接、IP 哈希等多种负载均衡算法。例如,一个网站的后端由多个应用服务器组成,Nginx 可以根据配置的算法将用户的请求合理地分配到这些服务器上,从而提高系统的整体可用性和性能。
缓存功能:
它可以缓存后端服务器的响应内容,减少对后端服务器的请求次数,提高响应速度。对于一些不经常变化的动态内容,如新闻网站的新闻页面,Nginx 可以缓存这些页面的 HTML 内容,当用户再次请求时直接返回缓存的内容,大大减轻后端服务器的负担。
灵活的配置
模块化设计:Nginx 提供了丰富的模块支持,用户可以根据需要加载或卸载模块,以实现不同的功能。比如,通过加载 SSL 模块可以支持 HTTPS 协议,通过加载 gzip 模块可以对响应内容进行压缩,从而提高传输效率。
配置文件简洁明了:它的配置文件采用层次化的结构,易于理解和修改。用户可以通过简单的指令来配置服务器的行为,如定义虚拟主机、设置访问控制、配置反向代理等。
高可用性
热部署:Nginx 支持热部署,可以在不中断服务的情况下更新配置文件或升级软件版本。这使得系统维护更加方便,不会对用户的正常访问造成影响。
故障转移:在反向代理的场景下,如果某个后端服务器出现故障,Nginx 可以自动将请求转发到其他可用的服务器,从而保证服务的高可用性。
Nginx 的应用场景
Web 服务器
Nginx 可以作为静态资源服务器,高效地提供 HTML、CSS、JavaScript、图片等静态文件的访问服务。例如,一个大型的电商网站,其大量的商品图片和前端页面文件可以通过 Nginx 快速地提供给用户。
它也可以与后端应用服务器(如 PHP-FPM、Tomcat 等)配合,通过反向代理的方式处理动态请求。当用户请求动态内容时,Nginx 将请求转发给后端应用服务器,然后将处理后的结果返回给用户。
反向代理服务器
在分布式系统中,Nginx 常被用作反向代理服务器,将客户端的请求分发到多个后端服务节点,实现负载均衡。例如,在一个微服务架构的应用中,Nginx 可以作为网关,将用户的请求路由到不同的微服务实例。
它还可以作为 CDN(内容分发网络)的边缘节点,缓存热点内容,提高内容的分发效率,降低源站的负载。
邮件代理服务器
Nginx 支持邮件协议(如 IMAP、POP3 等),可以作为邮件代理服务器,对邮件流量进行转发和处理。它可以提高邮件系统的性能和安全性,例如通过缓存邮件内容来减少对邮件服务器的访问压力,或者对邮件流量进行加密传输。
Nginx 的工作原理
事件驱动架构
Nginx 采用基于事件驱动的架构,通过监听网络事件(如客户端的连接请求、数据读写等)来处理请求。当一个事件发生时,Nginx 会触发相应的处理函数来完成任务。这种架构使得 Nginx 能够高效地处理大量并发连接,因为它不需要为每个连接创建一个单独的线程或进程,从而避免了线程切换和进程创建的开销。
工作进程模型
Nginx 通常运行在多核服务器上,它会启动多个工作进程(worker process),每个工作进程负责处理一部分请求。这些工作进程之间通过共享内存、文件描述符等方式进行通信和协作。Nginx 的主进程(master process)负责管理这些工作进程,例如启动、停止、监控工作进程的状态等。
请求处理流程
当客户端发送请求到 Nginx 时,首先会被主进程接收,然后根据配置的规则将请求分配给某个工作进程。工作进程会解析请求头,根据请求的类型(如静态资源请求、动态请求等)进行相应的处理。如果是静态资源请求,工作进程会直接从文件系统中读取文件内容并返回给客户端;如果是动态请求,工作进程会将请求转发到后端应用服务器,等待后端服务器的响应,然后将响应内容返回给客户端。
Ngnix快速入门
安装Ngnix
1.配置Nginx yum存储库
vim /etc/yum.repos.d/nginx.repo
将下面的内容写入
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
2.安装Nginx
执行命令
yum -y install nginx
3.启动Nginx
执行启动命令
systemctl start nginx
查看状态 显示active(running)就是启动成功了
systemctl status nginx
设置开机自动启动
systemctl enable nginx
3.访问Nginx服务默认首页
如果能成功出现下面的页面说明Nginx运行时正常的
重要的目录和文件
在 Nginx 系统中,有几个关键的目录和文件扮演着重要的角色。以下是对这些核心内容的详细介绍:
1.配置文件
• /etc/nginx/
:这是 Nginx 主要配置文件存放的目录。
• /etc/nginx/nginx.conf
:这是 Nginx 的主配置文件,其中包含了服务器的全局配置信息。
2.日志文件
• /var/log/nginx/
:这个目录包含了 Nginx 的所有日志文件,包括访问日志和错误日志。
• /var/log/nginx/access.log
:这是访问日志文件,记录了所有访问服务器的请求信息。
• /var/log/nginx/error.log
:这是错误日志文件,用于记录服务器在处理请求过程中出现的错误信息。
Nginx案例
静态资源服务器案例
1.上传静态资源到服务器
通过网盘分享的文件:hello-nginx.zip
链接: https://pan.baidu.com/s/18N1ny8x2bm0K0kBzlY9I0w?pwd=kk5d 提取码: kk5d
2.解压hello-nginx.zip
到/usr/share/nginx/html
中
unzip hello-nginx.zip -d /usr/share/nginx/html
项目路径如下:
/usr
└── share└── nginx└── html└── hello-nginx├── css│ └── style.css├── images│ └── img.png└── index.html
3.配置Nginx虚拟主机
vim /etc/nginx/conf.d/hello-nginx.conf
添加如下内容:
server {listen 8080;server_name 主机名;location /hello-nginx {root /usr/share/nginx/html;index index.html;}
}
以下是对配置文件的介绍
Nginx 处理请求的逻辑
通过以下示例,我们可以了解 Nginx 是如何处理进入的 HTTP 请求的。
1.匹配 Server
由于 Nginx 可以为多个虚拟主机配置不同的server
块,因此当 Nginx 接收到一个请求时,它首先需要确定将请求交给哪个虚拟主机处理。这一过程主要依据server_name
和listen
指令进行判断。
server {listen 8080;server_name 192.168.10.102;# 其他配置...
}
当有请求发往http://192.168.10.102:8080/hello-nginx
时,Nginx 会将请求匹配到上述的server
块进行处理。
2.匹配 Location
在完成server
块的匹配后,Nginx 还需要在该server
块内部匹配具体的location
块。location
的匹配是基于请求的 URI 进行的。
例如,以下配置中的location
块会处理所有以/hello-nginx
开头的请求:
location /hello-nginx {# 配置指令...
}
当请求http://192.168.10.102:8080/hello-nginx
时,Nginx 会匹配到这个location
块。
3.定位文件
一旦匹配到location
块,Nginx 会使用该location
块中指定的root
指令作为根目录,然后在该目录下查找请求的资源。
例如,以下配置:
location /hello-nginx {root /usr/share/nginx/html;index index.html;
}
当请求http://192.168.10.102:8080/hello-nginx
时,Nginx 会在/usr/share/nginx/html/hello-nginx
路径下查找资源。由于该路径是一个目录,Nginx 会在该目录下寻找index.html
文件,然后将该文件的内容返回给客户端。
注意:上述提到的server
和location
匹配有多种模式,如精确匹配、前缀匹配等,此处不再展开。
重新加载配置文件
systemctl reload nginx
浏览器搜索http://192.168.10.102:8080/hello-nginx/
如果可以看到以下页面说明配置成功了
反向代理案例
1.配置虚拟主机
创建配置文件
vim /etc/nginx/conf.d/hello-proxy.conf
写入以下内容
server {listen 9090;server_name 192.168.10.102;location / {proxy_pass http://www.baidu.com;}
}
2.重新加载Nginx配置文件
systemctl reload nginx
3.观察代理效果
访问http://192.168.10.102:9090
观察结果