Nginx详解

Nginx是一个高性能的HTTP和反向代理服务器,以其高并发连接、内存消耗少和稳定性高著称。本文详细介绍了Nginx的功能,包括静态资源服务、动态服务、反向代理和负载均衡。接着,讲解了Nginx的模块,如HTTP、EVENT和MAIL模块,以及其工作原理,包括处理器模块、过滤器模块和代理器模块。此外,还深入探讨了Nginx的配置文件结构和配置参数,如全局段、events段、http段和location段的配置。最后,提到了Nginx的安装与配置过程。
摘要由CSDN通过智能技术生成


1. 概述


什么是Nginx?

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强
  • Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
  • Nginx将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx有什么特性?

  • 在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
  • 使用epoll and kqueue作为开发模型
  • nginx作为负载均衡服务器:nginx既可在内部直接支持和PHP程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
  • nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多

Nginx有哪些优点?

  • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
  • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
  • 配置文件非常简单:风格跟程序一样通俗易懂
  • 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
  • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
  • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
  • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
  • 稳定性高:用于反向代理,宕机的概率微乎其微
  • 模块化设计:模块可以动态编译
  • 外围支持好:文档全,二次开发和模块较多
  • 支持热部署:可以不停机重载配置文件
  • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

Nginx的应用场景:

  • 静态服务器。(图片,视频服务)另一个lighttpd。并发几万,html,js,css,flv,jpg,gif等。
  • 动态服务,nginx——fastcgi 的方式运行PHP,jsp。(PHP并发在500-1500,MySQL 并发在300-1500)。
  • 反向代理,负载均衡。日pv2000W以下,都可以直接用nginx做代理。
  • 缓存服务。类似 SQUID,VARNISH。

2. Nginx的功能介绍


基本功能:

  • 静态资源的web服务器,能缓存打开的文件描述符
  • http、smtp、pop3协议的反向代理服务器
  • 缓存加速、负载均衡
  • 支持FastCGI(fpm,LNMP),uWSGI(Python)等
  • 模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
  • 支持SSL

拓展功能:

  • 基于名称和IP的虚拟主机
  • 支持keepalive(长连接)
  • 支持平滑升级
  • 定制访问日志、支持使用日志缓冲区提高日志存储性能
  • 支持URL重写
  • 支持路径别名
  • 支持基于IP及用户的访问控制
  • 支持速率限制,支持并发数限制

3. Nginx的模块介绍


nginx的模块从结构上分为核心模块、基础模块和第三方模块

  • HTTP模块、EVENT模块和MAIL模块等属于核心模块
  • HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
  • HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块

用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大


nginx模块从功能上分为三类:

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
  • Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
  • Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能

nginx基本模块:

基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:

  • 核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部
  • 事件模块:在Nginx内配置网络使用的能力。常见的events(事件)模块指令,大部分是放置在配置文件的顶部
  • 配置模块:提供包含机制

具体模块介绍可参考 Nginx官方文档


4. Nginx的工作原理


Nginx 由内核和模块组成,启动 Nginx 后,Nginx 的模块被自动加载,与 Apache 不一样,首先将模块编译为一个 so 文件,然后在配置文件中指定是否进行加载

在解析配置文件时,Nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成

Nginx 本身做的工作实际很少,当它接到一个 HTTP 请求时,它仅仅是通过查找配置文件将此次请求映射到一个 location block,而此 location 中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做 Nginx 真正的劳动工作者。通常一个 location 中的指令会涉及一个 handler 模块和多个 filter 模块(当然,多个 location 可以复用同一个模块)。handler 模块负责处理请求,完成响应内容的生成,而 filter 模块对响应内容进行处理。


Nginx进程模型

在这里插入图片描述

启动 nginx 时,会启动一个 master 进程,在创建 master 进程时,先建立需要监听的 socket(listenfd),然后从 master 进程中 fork() 出多个 worker 进程,如此一来每个 worker 进程多可以监听用户请求的 socket 。一般来说,当一个连接进来后,所有在 worker 都会收到通知,但是只有一个进程可以接受这个连接请求,其它的都失败,这是所谓的惊群现象。nginx 提供了一个 accept_mutex(互斥锁),有了这把锁之后,同一时刻,就只会有一个进程在 accpet 连接,这样就不会有惊群问题了


5. Nginx安装与配置


安装依赖包

[root@node2 ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ wget
[root@node2 ~]# yum -y groups mark install 'Development Tools'

创建nginx主和组,并创建日志存放目录

[root@node2 ~]# useradd -r -M -s /sbin/nologin nginx
[root@node2 ~]# mkdir -p /var/log/nginx
[root@node2 ~]# chown -R nginx.nginx /var/log/nginx

下载nginx源码包,并安装

[root@node2 ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@node2 ~]# tar xf nginx-1.18.0.tar.gz
[root@node2 ~]# cd nginx-1.18.0
[root@node2 nginx-1.18.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
[root@node2 nginx-1.18.0]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install

配置nginx

[root@node2 ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@node2 ~]# source /etc/profile.d/nginx.sh 
[root@node2 ~]# nginx 
[root@node2 ~]# ss -antl |grep 80
LISTEN     0      128          *:80                       *:*   

访问验证
在这里插入图片描述
能够看到此页面说明nginx安装成功


nginx命令常用选项:

-t  //检查配置文件语法
-v  //输出nginx的版本
-c  //指定配置文件的路径
-s  //发送服务控制信号,可选值有{
   stop|quit|reopen|reload}

6. Nginx的配置文件


nginx主配置文件:/usr/local/nginx/conf/nginx.conf

  • 默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
  • 可以在启动nginx时通过-c选项来指定要读取的配置文件

nginx常见的配置文件:

配置文件 作用
nginx.conf nginx的基本配置文件
mime.types MIME类型关联的扩展文件
fastcgi.conf 与fastcgi相关的配置
proxy.conf 与proxy相关的配置
sites.conf 配置nginx提供的网站,包括虚拟主机

6.1 nginx.conf配置文件详解

文件结构图:
在这里插入图片描述
nginx.conf的内容分为以下几段:

  • main配置段:配置影响nginx全局的指令
    • 配置运行Nginx服务器用户(组)
    • worker process数
    • Nginx进程
    • PID存放路径错误日志的存放路径
    • 配置文件的引入
  • events配置段:配置影响nginx服务器或与用户的网络连接
    • 设置网络连接的序列化
    • 是否允许同时接收多个网络连接
    • 事件驱动模型的选择
    • 最大连接数的配置
  • http配置段:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
    • 定义MIMI-Type
    • 自定义服务日志
    • 允许sendfile方式传输文件
    • 连接超时时间
    • 单连接请求数上限
  • server段:配置虚拟主机的相关参数,一个http中可以有多个server
    • 配置网络监听
    • 基于名称的虚拟主机配置
    • 基于IP的虚拟主机配置
  • location段:配置请求的路由,以及各种页面的处理情况
    • location配置
    • 请求根目录配置更改
    • location的URI
    • 网站默认首页配置

每个配置指令要以分号结尾

语法:derective value1 [value2 ...];

配置文件支持使用变量

内置变量:模块会提供内建变量定义
自定义变量:set var_name value

6.2 全局段配置参数

配置运行Nginx服务器用户(组)

指令格式:user user [group];
	user:指定可以运行Nginx服务器的用户
	group:可选项,可以运行Nginx服务器的用户组

如果user指令不配置或者配置为user nobody nobody,则默认所有用户都可以启动Nginx进程

是否以守护进程方式运行nginx

指令格式:daemon {
   on|off};

是否以守护进程方式运行nginx,调试时应设置为off

是否以master/worker模型来运行nginx

指令格式:master_process {
   on|off};    

是否以master/worker模型来运行nginx,调试时可以设置为off

worker process数配置

Nginx服务器实现并发处理服务的关键

指令格式:worker_processes number | auto;
	number:Nginx进程最多可以产生的worker process数
	auto:Nginx进程将自动检测

为了避免上下文切换,通常number值设置为cpu总核心数-1或等于总核心数

将进程绑定到某cpu中,避免频繁刷新缓存

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值