官方说明
理解说明
Nginx是一个高性能的Web服务器和反向代理服务器,其设计思想和执行机制可以概括如下:
异步事件驱动:Nginx采用基于事件驱动的异步I/O模型,这意味着它能够处理大量并发连接而不会消耗太多的系统资源。
单线程模型:Nginx采用单线程模型来处理请求,这样可以避免线程切换带来的开销。同时,Nginx的事件机制也使得单线程能够管理多个并发连接。
高效的内存管理:Nginx使用内存池来管理内存分配和释放,从而避免了频繁的malloc/free操作,提高了性能。
模块化架构:Nginx具有灵活的模块化架构,可以通过编写自定义模块来扩展其功能。
反向代理和负载均衡:Nginx作为反向代理服务器,可以将客户端请求转发到多个后端服务器,并实现负载均衡。
静态文件服务:Nginx可以直接提供静态文件服务,无需调用脚本语言或其他应用程序。
NGINX IO
处理客户端请求时:当客户端发送请求到nginx服务器时,nginx会从网络套接字中读取请求,并将响应发送回客户端。
这种情况下的I/O操作涉及到网络I/O,包括读取和写入数据。
代理到后端服务器时:当nginx作为反向代理服务器时,它需要将请求转发到后端服务器并将响应返回给客户端。
这种情况下的I/O操作涉及到网络I/O以及可能的磁盘I/O(例如,在使用磁盘缓存时)。
写入日志文件时:nginx可以将访问日志和错误日志写入磁盘文件中,这种情况下的I/O操作是磁盘I/O。
读取静态文件时:当nginx通过HTTP请求提供静态文件时,它需要从磁盘中读取文件并将其发送给客户端,这种情况下的I/O操作是磁盘I/O。
缓存能力说明
Nginx缓存能力的落盘逻辑通常是通过将缓存数据保存到磁盘上实现的。Nginx可以使用proxy_cache_path指令来配置缓存路径和相关参数。
当请求到达Nginx时,它会检查是否有匹配的缓存项可用。如果有,则Nginx将直接从缓存中返回响应,而不需要将请求发送到后端服务器。如果没有,则Nginx将请求发送到后端服务器,并将响应保存到缓存中,以便下一次同样的请求可以直接从缓存中获取响应。
为了避免缓存数据占用过多内存,Nginx可以将缓存数据写入磁盘。具体来说,它可以使用proxy_cache_path指令中的keys_zone参数来指定一个共享内存区域来存储缓存键和元数据信息,然后使用disk指令来将缓存数据写入磁盘。
当Nginx将一个缓存项写入磁盘时,它会在缓存目录下创建一个与缓存键相关联的文件夹,然后将缓存文件保存在这个文件夹中。同时,Nginx还会将缓存项的元数据信息保存到缓存键对应的共享内存区域中,以便以后可以快速地检索和访问这个缓存项。
缓存配置说明
要在Nginx中设置Web缓存,可以使用proxy_cache指令。下面是一个示例配置:
http {
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_valid 200 5m;
proxy_cache_valid 404 1m;
}
}
}
这个配置启用了一个名为"my_cache"的缓存区,并将其设置在"/path/to/cache"路径中。这里还设置了缓存过期时间,对于状态码200的响应,缓存保留5分钟;对于404的响应,缓存保留1分钟。此外,使用proxy_pass指令将请求转发到后端服务器。
需要注意以下几点:
在使用缓存之前,需要确保你的应用程序正确地设置了HTTP缓存头部,否则缓存可能不会生效。
应该根据实际情况调整缓存的过期策略,避免缓存的数据太旧或者占用过多的磁盘空间。
如果网站上有动态内容(如用户登录信息),则应该禁用缓存,以确保每个用户都能看到他们自己的数据。
在更新网站内容时,要记得清除缓存,否则用户可能会看到旧版本的页面。
TCP 代理
要在nginx中配置TCP代理,可以使用ngx_stream_core_module模块。下面是一个简单的例子:
stream {
server {
listen 12345;
proxy_pass backend_server:12345;
}
}
这个例子将监听本地端口12345,并将来自客户端的TCP连接代理到名为backend_server的后端服务器的12345端口。请记住,在使用TCP代理时,不能像HTTP代理一样修改请求或响应头。