C++后端开发(4.5.1)——Nginx反向代理与系统参数配置conf


小节提纲

1.Nginx静态文件的配置
2.Nginx动态接口代理配置
3.Nginx对Mqtt协议转发
4.Nginx对Rtmp推拉流
5.Openresty对Redis缓存数据代理
6.shmem的三种实现方式
7.原子操作
8.nginx Channel
9.信号
10.信号量

Nginx源码分析(25篇)

1 Nginx 简介

Nginx (“engine x”) 是一个高性能的 HTTP反向代理 服务器 ,也是一个 IMAP/POP3/SMTP 代理 服务器 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

2 Nginx特点

  1. 热部署:在master管理进程与worker工作进程的分离设计,使的Nginx具有热部署的功能,那么在7×24小时不间断服务的前提下,升级Nginx的可执行文件。也可以在不停止服务的情况下修改配置文件,更换日志文件等功能。
  2. 可以高并发连接:理论上,Nginx支持的并发连接上限取决于你的内存,10万远未封顶。
  3. 低的内存消耗:在一般的情况下,10000个非活跃的HTTP Keep-Alive 连接在Nginx中仅消耗2.5M的内存,这也是Nginx支持高并发连接的基础。
  4. 处理响应请求很快:在正常的情况下,单次请求会得到更快的响应。在高峰期,Nginx可以比其他的Web服务器更快的响应请求。
  5. 具有很高的可靠性:高可靠性来自其核心框架代码的优秀设计、模块设计的简单性;并且这些模块都非常的稳定。

3 Nginx 安装

Nginx环境搭建

4 Nginx架构

4.1 代码架构

nginx 工作(worker)码包括 核心功能模块。nginx 的核心是负责维护严格的运行循环,并在请求处理的每个阶段执行模块代码的适当部分。 模块构成了大部分的演示和应用层功能。 模块读取和写入网络和存储,转换内容,执行出站过滤,应用服务器端包含操作,并在代理启动时将请求传递给上游服务器。

nginx 的模块化架构通常允许开发人员扩展一组 Web 服务器功能,而无需修改 nginx 内核。 nginx 模块略有不同,即核心模块,事件模块,阶段处理程序,协议,可变处理程序,过滤器,上游和负载平衡器。 nginx 不支持动态加载的模块; 即在构建阶段将模块与核心一起编译。

在处理与接受,处理和管理网络连接和内容检索相关的各种操作时, nginx 在基于 Linux,Solaris 和 BSD 的操作系统中使用事件通知机制和一些磁盘 I/O 性能增强,如: kqueue, epoll,和事件端口。 目标是为操作系统提供尽可能多的提示,以便及时获取入站和出站流量,磁盘操作,读取或写入套接字,超时等异步反馈。 对于每个基于 Unix 的 nginx 运行的操作系统,大量优化了复用和高级 I/O 操作的不同方法的使用

在这里插入图片描述

4.2 工作模式

如前所述, nginx 不会为每个连接生成一个进程或线程。 相反,工作(worker)进程接受来自共享“listen” 套接字的新请求,并在每个工作(worker)内执行高效的运行循环,以处理每个工作(worker)中的数千个连接。 没有专门的仲裁或分配与 nginx 工作(worker)的联系; 这个工作(worker)是由操作系统内核机制完成的。 启动后,将创建一组初始侦听套接字。 然后,工作(worker)在处理 HTTP 请求和响应时不断接受,读取和写入套接字。

运行循环是 nginx 工作(worker)代码中最复杂的部分。 它包括全面的内部调用,并且在很大程度上依赖异步任务处理的想法。 异步操作通过模块化,事件通知,广泛使用回调函数和微调定时器来实现。 总体而言,关键原则是尽可能不阻塞。 nginx 仍然可以阻塞的唯一情况是工作(worker)进程没有足够的磁盘存储。

由于 nginx 不会连接一个进程或线程,所以在绝大多数情况下,内存使用非常保守,非常有效。 nginx 也节省 CPU 周期,因为进程或线程没有持续的创建 - 销毁模式。 nginx 的作用是 检查网络和存储的状态,初始化新连接,将其添加到运行循环中,并异步处理直到完成,此时连接被重新分配并从运行循环中删除。 结合仔细使用系统调用(syscall)和精确实现支持接口(如 pool 和 slab 内存分配器), nginx 通常可以在极端工作负载下实现中到低的CPU 使用。

在一些磁盘使用和 CPU 负载模式,应调整 nginx 工作(worker)的数量 。 在这里说一点基础规则:系统管理员应该为其工作负载尝试几个配置。 一般建议可能如下:如果负载模式是 CPU 密集型的,例如,处理大量 TCP/IP,执行 SSL 或压缩,则 nginx 工作(worker)的数量应与 CPU 内核数量相匹配; 如果负载大多是磁盘 I/O 绑定,例如,从存储或重代理服务不同的内容集合 - 工作(worker)的数量可能是核心数量的一到两倍。有些工程师会根据个人存储单元的数量选择工作(worker)的数量,但这种方法的效率取决于磁盘存储的类型和配置。

nginx 的开发人员将在即将推出的版本中解决的一个主要问题是如何避免磁盘 I/O 上的大多数阻塞。 目前,如果没有足够的存储性能来提供特定工作(worker)生成的磁盘操作,该工作(worker)可能仍然阻止从磁盘读取/写入。 存在许多机制和配置文件指令来减轻此类磁盘 I/O 阻塞情况。要注意的是,诸如: sendfile 和 AIO 之类的选项的组合通常会为磁盘性能带来很大的余量。 应该根据数据集,可用于 nginx 的内存量和底层存储架构来规划安装一个 nginx 服务器。

现有工作(worker)模式的另一个问题是与嵌入式脚本的有限支持有关。 一个使用标准的 nginx 分发,只支持嵌入 Perl 脚本。一个简单的解释:关键问题是嵌入式脚本阻止任何操作或意外退出的可能性。 这两种类型的行为将立即导致工作(worker)挂起的情况,同时影响到数千个连接。 更多的工作(worker)计划是使 nginx 的嵌入式脚本更简单,更可靠,适用于更广泛的应用。

5 快速入门

主要介绍 nginx 的基本配置和操作,并介绍了一些可以完成的简单任务。假设您已经学习过并已经安装好了 nginx 服务器。 如果没有,请参阅安装 nginx 页面。 本指南介绍如何启动和停止 nginx,并重新加载其配置,解释配置文件的结构,并介绍如何设置 nginx 以提供静态内容,如何配置 nginx 作为代理服务器,以及如何将其连接到 一个 FastCGI 应用程序。

nginx 有一个主进程和几个工作进程。 主进程的主要目的是读取和评估配置,并维护工作进程。 工作进程对请求进行实际处理。 nginx 采用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分配请求。 工作进程的数量可在配置文件中定义,并且可以针对给定的配置进行修改,或者自动调整到可用 CPU 内核的数量

在配置文件中确定 nginx 及其模块的工作方式。 默认情况下,配置文件名为 nginx.conf,并放在目录: /usr/local/nginx/conf, /etc/nginx, 或 /usr/local/etc/nginx 中。

在前面安装文章配置中,使用的安装配置目录是: /usr/local/nginx/conf 。所以可以在这个目录下找到这个配置文件。

5.1 启动、停止和重新加载Nginx 配置

要启动 nginx,请运行可执行文件。 当 nginx 启动后,可以通过使用-s 参数调用可执行文件来控制它。

  • 快速关闭服务
nginx -s stop
  • 正常关闭服务
nginx -s quit
  • 重新加载配置文件
nginx -s reload
  • 重新打开日志文件
nginx -s reopen
  • 要获取所有运行的 nginx 进程的列表,可以使用 ps 命令
ps -ax | grep nginx

5.2 配置文件的结构

Nginx 由配置文件中指定的指令控制的模块组成。 指令分为 简单指令块指令。 一个简单的指令由空格分隔的名称和参数组成,并以分号(;)结尾。块指令具有与简单指令相同的结构,但不是以分号结尾,而是以大括号({和})包围的一组附加指令结束。 如果块指令可以在大括号内部有其他指令,则称为 上下文(例如: events, http, server 和 location)。配置文件中放置在任何上下文之外的伪指令都被认为是主上下文。 events 和 http 指令驻留在主上下文中, server 在 http 中的,而 location 在 http 块中。#号之后的一行的部分被视为注释。

6 Nginx 主要应用场景与conf配置

6.1 静态HTTP服务器

Nginx是一个 HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。

  • 配置:
server {  
    listen 80; # 端口号  
    location / {  
        root /usr/local/nginx/html; # 静态文件路径  
    }  
}

6.2 反向代理

反向代理是客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。

  • 配置:
server {  
    listen 80;  
    location / {  
        proxy_pass http://192.168.198.128:8888; # 应用服务器HTTP地址  
    }  
}  

后面的负载均衡、虚拟主机等,都基于反向代理实现,当然反向代理的功能也不仅仅是这些。

6.3 负载均衡

负载均衡也是 Nginx 常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、 FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有 2 台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。

而 Nginx 目前支持自带 3 种负载均衡策略,还有 2 种常用的第三方策略。

6.3.1 RR(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

  • 配置:
upstream myapp {  
    server192.168.198.128:8080; # 应用服务器1  
    server192.168.198.128:8080; # 应用服务器2  
}  
server {  
    listen 80;  
    location / {  
        proxy_pass http://myapp;  
    }  
}

以上配置会将 请求轮询分配到应用服务器,也就是一个客户端的多次请求,有可能会由多台不同的服务器处理。

6.3.2 ip_hash

可以通过ip-hash的方式,根据客户端ip地址的hash值将请求分配给固定的某一个服务器处理。

  • 配置:
upstream myapp {  
    ip_hash; # 根据客户端IP地址Hash值将请求分配给固定的一个服务器处理  
    server 192.168.198.128:8080;  
    server 192.168.198.129:8080;  
}  
 
server {  
    listen 80;  
    location / {  
        proxy_pass http://myapp;  
    }  
} 

6.3.3 权重

另外,服务器的硬件配置可能有好有差,想把大部分请求分配给好的服务器,把少量请求分配给差的服务器,可以通过weight来控制。

  • 配置:
upstream myapp {  
    server 192.168.198.128:8080 weight=3; # 该服务器处理3/4请求  
    server 192.168.198.129:8080; # weight默认为1,该服务器处理1/4请求  
 
}  
server {  
    listen 80;  
    location / {  
        proxy_pass http://myapp;  
    }  
} 

6.4 虚拟主机

有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。

例如将www.aaa.com和www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。

  • 配置:

server {  
    listen 80 default_server;  
    server_name _;  
    return 444; # 过滤其他域名的请求,返回444状态码  
}  
 
server {  
    listen 80;  
    server_name www.aaa.com; # www.aaa.com域名  
    location / {  
        proxy_pass http://localhost:8080; # 对应端口号8080  
    }  
}  
 
server {  
    listen 80;  
    server_name www.bbb.com; # www.bbb.com域名  
    location / {  
        proxy_pass http://localhost:8081; # 对应端口号8081  
    }
} 

在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。

虚拟主机的原理是通过HTTP请求头中的Host是否匹配server_name来实现的,

另外,server_name配置还可以过滤有人恶意将某些域名指向你的主机服务器。

5.5 FastCGI

Nginx本身不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理(例如PHP、Python、Perl)。

server {  
    listen 80;  
    location ~ \.php$ {  
        include fastcgi _params;  
        fastcgi_param SCRIPT_FILENAME /PHP文件路径$fastcgi_script_name; # PHP文件路径  
        fastcgi_pass 127.0.0.1:9000; # PHP-FPM地址和端口号  
        # 另一种方式:fastcgi_pass unix:/var/run/php5-fpm.sock;  
    }  
}  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何蔚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值