Nginx从理论到实践超详细笔记(上)

简介: Nginx从理论到实践超详细笔记(上)

最近花了一些时间来总结nginx常用的技能知识点,通过一些常用的实际案例来将nginx的众多小知识点串联起来。


首先是进入nginx目录进行脚本启动,准备初始化环境:


[root@idea-centos nginx]# cd ./sbin/
[root@idea-centos sbin]# ll
total 3528
-rwxr-xr-x. 1 root root 3611160 Dec 26 16:43 nginx
[root@idea-centos sbin]# ps -ef|grep nginx
root       7270   7194  0 10:42 pts/1    00:00:00 grep --color=auto nginx
[root@idea-centos sbin]# ./nginx 
[root@idea-centos sbin]# ps -ef|grep nginx
root       7272      1  0 10:42 ?        00:00:00 nginx: master process ./nginx
nobody     7273   7272  0 10:42 ?        00:00:00 nginx: master process ./nginx
root       7275   7194  0 10:42 pts/1    00:00:00 grep --color=auto nginx


启动成功之后,通过curl可以进行访问测试


首先通过 ip add来查看地址信息(本人使用的是虚拟机):


[root@idea-centos sbin]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ea:63:63 brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.235/24 brd 192.168.43.255 scope global noprefixroute dynamic ens33
       valid_lft 2922sec preferred_lft 2922sec
    inet6 2409:8955:3048:50d5:e7e8:636d:bdf1:7033/64 scope global noprefixroute dynamic 
       valid_lft 2964sec preferred_lft 2964sec
    inet6 fe80::8a65:608b:505e:fe4/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever


然后通过curl在本虚拟机上边进行测试:


[root@idea-centos sbin]# curl http://192.168.43.235/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>


如果访问失败,请先查看防火墙是否开启,如果开启了,可以先进行关闭,方便展开后续的demo练习:


[root@idea-centos sbin]# firewall-cmd --state
running
[root@idea-centos sbin]# systemctl stop firewalld.service
[root@idea-centos sbin]# firewall-cmd --state
not running


访问成功之后,会看到nginx的首页:


image.png


nginx常用的基础命令总结


#默认方式启动:
./sbin/nginx 
#指定配置文件启动 
./sbing/nginx -c /tmp/nginx.conf 
#指定nginx程序目录启动
./sbin/nginx -p /usr/local/nginx/
#快速停止
./sbin/nginx -s stop
#优雅停止 (会等当前的请求先处理完再杀死)
./sbin/nginx -s quit
# 热装载配置文件 
./sbin/nginx -s reload
# 重新打开日志文件
./sbin/nginx -s reopen
# 检测配置是否正确
./sbin/nginx -t


启动nginx之后,可以通过日志来查看进程的相关信息


[root@idea-centos nginx]# ./sbin/nginx
[root@idea-centos nginx]# ps -ef|grep nginx
root      11059      1  0 16:34 ?        00:00:00 nginx: master process ./sbin/nginx
nobody    11060  11059  0 16:34 ?        00:00:00 nginx: worker process
root      11062   8193  0 16:34 pts/1    00:00:00 grep --color=auto nginx


master process 主要是负责日志的更新,热装载 主进程


worker process 工作进程 处理客户端的连接,处理请求


nginx的日志


在nginx的log文件夹底下,我们在重新访问服务器之后,相应的access日志就会增加新的属性内容。


这里面的日志寻找,实际上是根据对象句柄来进行查找指定的文件。


关于nginx处理机制的理解


nginx里的高性能主要归咎于其相应特有的io多路复用。每当有请求发送过来的时候,请求的都会被放入到一个select队列里面,专门存储客户端的http链接信息,然后通过一个专门的选择器来处理轮询,监听客户端是否有发送请求的数据(一直轮询,直到有数据发送过来的时候才会发生堵塞),一旦当接收到发送的数据时,selector就会做出指定的处理。


image.png


当我们启动了nginx之后,会有两类型进程出现,分别是master进程和worker进程,而客户端发送的请求通常只是和master进程进行通信,master进程负责接收这些请求,然后分发给不同的worker进程进行处理。


其实本质上,worker进程是从master进程这边fork出来的,在master的进程里面,需要先建立好被监听的socket之后,再fork出多个worker进程,多个worker进程(多核cpu环境下)会争抢accept_mutex互斥锁,抢锁成功的进程就会注册相应的事件对任务进行处理。这种独立进程处理事件的好处在于避免了原本的加锁开销,同时当进程中出现了bug异常的时候,不会影响其他的进程,降低了风险。


nginx处理高并发的方式又是如何的呢?当采用多个worker来处理请求的时候,每个worker里面都只有一个主线程,但是这样处理并发数非常有限,那当并发数量大的时候,是否又需要创建成千上万的线程来实现请求的处理呢?


nginx的设计高明之处就在于了这一点上了,它的机制有点类似于linux里面的epoll这样的系统调度。处理的响应线程(暂命名为A)只有一个,当请求过来的事件处理完毕的时候,会主动通知A , 不会对堵塞的请求等待操作。这样的设计避免了A主动去轮询和等待事件处理的所带来的事件消耗。


相比于传统的apache服务器,每一个连接,apache就会创建一个进程,每个进程内单线程,apache最多能创建256个进程。对于一个负载相对较高的网站来说,256的进程,也就是256个线程,因为线程处理请求时,是同步阻塞模式,接收请求之后,会一直等待该请求读取程序文件(IO)(同步),执行业务逻辑,返回客户端,所有操作完成之后才能处理下一个请求(阻塞)如果服务器已经达到256的极限,那么接下去的访问就需要排队这也就是为什么某些服务器负载不高的原因了。


小结


  1. 每个worker进程都是单线程的模式
  2. 每个io链接都是基于异步非堵塞的模型建立的。
  3. worker进程的数目结合服务器的cpu数量来进行设置,可以达到调优的效果


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器,它在网络编程技术领域中被广泛应用。本文将详细介绍Nginx的概念和实践,包括其核心原理、功能特点、优势和应用场景等方面。同时,还将深入探讨如何使用Nginx进行高性能网络编程,结合实际案例进行分析。
|
3月前
|
存储 缓存 负载均衡
Nginx入门笔记
Nginx入门笔记
111 0
|
7月前
|
缓存 运维 负载均衡
华为大佬秘密撰写的Nginx运维笔记遭人恶意开源,整整638页全泄露
众所周知,Nginx是当下最流行的Web服务器,它具有很强的负载均衡,反向代理,邮件代理以及静态缓存的功能。在提供这些功能的同时,Nginx的性能也极其优秀,可以轻松支持百万、千万级的并发连接,能够为Tomcat、Django等性能不佳的Web应用抗住绝大部分外部流量。那么,Nginx是如何实现高速并发处理呢? 今天小轩就在这里给大家介绍一份“Nginx”的实战笔记,整整638页。话不多说,直击主题。让我们一起来看看这份有着“百万点击播放量”的Nginx笔记吧。 由于篇幅受限,部分内容只能以截图的方式展示出来。需要完整版点击此处获取。 Nginx应用与运维实战 目录
|
1月前
|
弹性计算 算法 应用服务中间件
倚天使用|Nginx性能高27%,性价比1.5倍,基于阿里云倚天ECS的Web server实践
倚天710构建的ECS产品,基于云原生独立物理核、大cache,结合CIPU新架构,倚天ECS在Nginx场景下,具备强大的性能优势。相对典型x86,Http长连接场景性能收益27%,开启gzip压缩时性能收益达到74%。 同时阿里云G8y实例售价比G7实例低23%,是Web Server最佳选择。
|
3月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
在当今互联网时代,高性能网络编程技术越来越受到重视。Nginx 作为一款高性能、高可靠性的 Web 服务器,拥有广泛的应用和优异的性能表现。本文将介绍 Nginx 的基本概念、架构以及实践技巧,帮助读者更好地理解和使用这一工具。
|
4月前
|
负载均衡 前端开发 应用服务中间件
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
133 1
|
4月前
|
Java 应用服务中间件 API
Nginx使用实践总结
Nginx使用实践总结
35 0
|
4月前
|
负载均衡 网络协议 应用服务中间件
当当网266买来的1399页Nginx笔记,原来我入门都不算
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
当当网266买来的1399页Nginx笔记,原来我入门都不算
|
5月前
|
负载均衡 应用服务中间件 nginx
nginx配置和热部署实践
nginx配置和热部署实践
90 0
|
6月前
|
应用服务中间件 nginx
nginx详细笔记
nginx详细笔记