nginx

本文详细介绍了Nginx的功能特性,包括其作为高性能HTTP服务器、反向代理和邮件服务器的能力,以及支持的各种功能如FastCGI、SSL、VirtualHost等。深入探讨了Nginx的配置、原理和进程模型,涵盖了基本概念、常用功能、模块分类和配置文件结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本概念

1. Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务

2. Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。

3. 官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数

二、Nginx常用功能

1. Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理
1)Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能

2)Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩

3)并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器
2. 负载均衡
1)Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。

2)Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题
3. web缓存
1)Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理

三、nginx原理

在这里插入图片描述

1. 概述
1)Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者

2)通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理

3)用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大
2. Nginx的模块分类
1)从结构上

	(1)核心模块:HTTP模块、EVENT模块和MAIL模块

	(2)基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块

	(3)第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块

2)从功能上

	(1)Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个	

	(2)Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出

	(3)Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能
3. Nginx进程模型

在这里插入图片描述

1)概述

	(1)Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程

	(2)其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能

	(3)worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求

2)流程

	(1)在创建master进程时,先建立需要监听的socket(listenfd),然后从master进程中fork()出多个worker进程,如此一来每个worker进程多可以监听用户请求的socket	

	(2)一般来说,当一个连接进来后,所有在Worker都会收到通知,但是只有一个进程可以接受这个连接请求,其它的都失败,这是所谓的惊群现象

	(3)nginx提供了一个accept_mutex(互斥锁),有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了

	(4)先打开accept_mutex选项,只有获得了accept_mutex的进程才会去添加accept事件。nginx使用一个叫ngx_accept_disabled的变量来控制是否去竞争accept_mutex锁。ngx_accept_disabled = nginx单进程的所有连接总数 / 8 -空闲连接数量,当ngx_accept_disabled大于0时,不会去尝试获取accept_mutex锁,ngx_accept_disable越大,于是让出的机会就越多,这样其它进程获取锁的机会也就越大。不去accept,每个worker进程的连接数就控制下来了,其它进程的连接池就会得到利用,这样,nginx就控制了多进程间连接的平衡

	(5)每个worker进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组

	(6)并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面。一个nginx能建立的最大连接数,应该是worker_connections * worker_processes

	(7)当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接

四、配置文件

nginx服务器的配置信息主要集中在nginx.conf这个配置文件中,并且所有的可配置选项大致分为以下几个部分

main                                # 全局配置

events {                            # nginx工作模式配置

}

http {                                # http设置
    ....

    server {                        # 服务器主机配置
        ....
        location {                    # 路由配置
            ....
        }

        location path {
            ....
        }

        location otherpath {
            ....
        }
    }

    server {
        ....

        location {
            ....
        }
    }

    upstream name {                    # 负载均衡配置
        ....
    }
}
1. main模块 —— 全局配置
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;

1)user					用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行

2)worker_processes		指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍

3)error_log			定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】

4)pid					用来指定进程id的存储文件的位置

5)worker_rlimit_nofile	用于指定一个进程可以打开最多文件数量的描述
2. event 模块 —— 针对nginx服务器的工作模式的一些操作配置
event {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}	

1)worker_connections 	指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的

2)multi_accept 		配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接

3)use epoll 			配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
3. http模块 —— 作为web服务器,http模块是nginx最核心的一个模块
1)基础配置

	(1)keepalive_timeout 10:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好

	(2)send_timeout 10:指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接

	(3)include /etc/nginx/mime.types:指定在当前文件中包含另一个文件的指令

	(4)default_type application/octet-stream:指定默认处理的文件类型可以是二进制

2)日志配置	

	(1)access_log logs/access.log:设置存储访问记录的日志

	(2)error_log logs/error.log:设置存储记录错误发生的日志

3)压缩配置

	(1)gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量	
4. server模块 —— srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息
server {
    listen        80;
    server_name localhost    192.168.1.100;
    root        /nginx/www;
    index        index.php index.html index.html;
    charset        utf-8;
    access_log    logs/access.log;
    error_log    logs/error.log;
    ......
}

1)server				一个虚拟主机的配置,一个http中可以配置多个server

2)server_name			指定ip地址或者域名,多个配置之间用空格分隔

3)root					表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录

4)index				用户访问web网站时的全局首页

5)charset				用于设置www/路径中配置的网页的默认编码格式

6)access_log 			用于指定该虚拟主机服务器中的访问记录日志存放路径

7)error_log			用于指定该虚拟主机服务器中访问错误日志的存放路径
5. location模块 —— location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息
location / {
    root    /nginx/www;
    index    index.php index.html index.htm;

}

反向代理配置方式:

location / {
    proxy_pass  upstreamName;    #(代理配置)请求转向upstreamName定义的服务器列表
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header Host $http_host;
}

1)location /:			表示匹配访问根目录

2)root					用于指定访问根目录时,访问虚拟主机的web目录

3)index				在不指定访问具体资源时,默认展示的资源文件列表
6. upstream模块 —— 主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
upstream name {
    ip_hash;
    server 192.168.1.100:8000;
    server 192.168.1.100:8001 down;
    server 192.168.1.100:8002 max_fails=3;
    server 192.168.1.100:8003 fail_timeout=20s;
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}

1)ip_hash				指定请求调度算法,默认是weight权重轮询调度,可以指定

2)server host:port:	分发服务器的列表配置

3)-- down:			表示该主机暂停服务

4)-- max_fails:		表示失败最大次数,超过失败最大次数暂停服务

5)-- fail_timeout:	表示如果请求受理失败,暂停指定的时间之后重新发起请求

参考网址

Nginx配置详解

Nginx详解(正向代理、反向代理、负载均衡原理)

Nginx 工作原理

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值