深入理解Nginx 阅读笔记(一)
众所周知,Apache、Lighttpd、Tomcat、 Jetty、IIS等都是著名的Web服务器(这里就不详细介绍这几个服务器了,有兴趣的可以自己查资料),那为什么我要特意学习Nginx呢?最重要的原因当然是——互联网公司(尤其是杭州的某个电商公司)面试的时候可以瞎xx吹一波,显得自己很叼(开玩笑的,最重要的原因还是其性能的优越性,我们下面细谈)
Nginx是一个跨平台的Web服务器,可运行在Linux、FreeBSD、Solaris、AIX、Mac OS、 Windows等操作系统上,并且它还可以使用当前操作系统特有的一些高效API来提高自己的性能。例如,对于高效处理大规模并发连接,它支持Linux上的epoll、Solaris上的event ports和FreeBSD上的kqueue等(我只了解epoll I/O复用技术,剩下的并不了解,有兴趣的可以一起探讨epoll的实现和使用之类的)。
nginx的性能优越性体现在几个方面(直接参照书):
(1) 更快
这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的并发请求), Nginx可以比其他Web服务器更快地响应请求。
(2) 高扩展性
Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。而且在HTTP模块中,还设计了HTTP过滤器模块:一个正常的HTTP模块在处理完请求后,会有一串HTTP过滤器模块对请求的结果进行再处理。这样,当我们开发一个新的HTTP模块时,不但可以使用诸如HTTP核心模块、events模块、log模块等不同层次或者不同类型的模块,还可以原封不动地复用大量已有的HTTP过滤器模块。这种低耦合度的优秀设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用Nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块一样具备极其优秀的性能,充分利用Nginx的高并发特性。
(3) 高可靠性
这个就不谈了
(4) 低内存消耗
一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这 是Nginx支持高并发连接的基础。
(5) 单机支持10万以上的并发连接
这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大公司、网站都需要应付海量并发请求,而Nginx作为一个能够在峰值期顶住10万以上并发请求的Server,你觉得你需不需要学习。
(6) 热部署
master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以 在7×24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。
(7) 最自由的BSD许可协议
这是Nginx可以快速发展的强大动力。BSD许可协议不只是允许用户免费使用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布。这吸引了无数开发者继 续为Nginx贡献自己的智慧。
既然Nginx这么优秀,我们便来准备一下Nginx的使用环境,然后开始Nginx的探索之旅吧。
首先我们需要一个内核为Linux 2.6及以上版本的操作系统,因为Linux 2.6及以上内核才 支持epoll,而在Linux上使用select或poll来解决事件的多路复用,是无法解决高并发压力问题的。
Linux中我们可以通过命令uname -a来查看我们系统的一些信息,包括内核版本,比如下面显示我使用的的阿里云服务器的内核版本为4.4.0
内核版本如果低于2.6,可以参考下面的链接中的方法进行更新(这里只给出ubuntu的)
如何在 Ubuntu 中升级到最新内核
此外,你还需要安装一些软件
(1) gcc和g++
这是编译Nginx模块源代码的必备工具,直接在命令行中输入gcc -v(gcc --version也行)或者g++ -v你就可以知道自己的系统中有没有安装gcc或者g++了(如下所示,表明已经安装)
如果没有安装gcc或者g++,那么一般直接
sudo apt-get install build-essential
sudo apt-get install gcc
sudo apt-get install g++
就好了,当然有时候有可能出问题,这时候你们自己解决吧。
(2) PCRE库
这东西如果用不到正则表达式的话是不用装的
安装命令如下:
sudo apt-get install libpcre3 libpcre3-dev 即可
(3)zlib库
zlib库用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf里配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量,那 么,在编译时就必须把zlib编译进Nginx。
安装命令如下:
sudo apt-get install zlib1g-dev
(4)openssl库
如果我们的服务器不只是要支持HTTP,还需要在更安全的SSL协议上传输HTTP(HTTPS,这个东西阿里和腾讯面试特别问),那么就需要拥有OpenSSL了。另外,如果我们想使用MD5、SHA1等散列函数,那么也需要安装它。
安装命令如下:
sudo apt-get install openssl libssl-dev
我们的环境先配置到这里,后面还需要配置磁盘并进行一些linux内核参数的优化,下一篇再讲。
深入理解Nginx 阅读笔记(一)相关推荐
- 《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记
<深入理解Java虚拟机>阅读笔记 本repository为<深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)>阅读笔记,因为第一章主要讲的是Java的发展历史, ...
- 《深入理解Nginx》阅读与实践(四):简单的HTTP过滤模块
一.Nginx的HTTP过滤模块特征 一个请求可以被任意个HTTP模块处理: 在普通HTTP模块处理请求完毕并调用ngx_http_send_header()发送HTTP头部或调用ngx_http_o ...
- 《深入理解Nginx》阅读与实践(一):Nginx安装配置与HelloWorld
最近在读陶辉的<深入理解Nginx:模块开发与架构解析>,一是想跟着大牛练练阅读和编写开源代码的能力,二是想学学Nginx优秀的架构设计,三是想找一个点深入下Linux下网络编程的细节.侯 ...
- 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(八)—— 模型训练-训练
系列目录: 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(一)--数据 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(二)-- 介绍及分词 菜鸟笔记-DuReader阅读理解基线模 ...
- 【异构图笔记,篇章3】GATNE论文阅读笔记与理解:General Attributed Multiplex HeTerogeneous Network Embedding
[异构图笔记,篇章3]GATNE论文阅读笔记与理解:General Attributed Multiplex HeTerogeneous Network Embedding 上期回顾 论文信息概览 论 ...
- 基于神经网络的机器阅读理解综述学习笔记
基于神经网络的机器阅读理解综述学习笔记 一.机器阅读理解的任务定义 1.问题描述 机器阅读理解任务可以形式化成一个有监督的学习问题:给出三元组形式的训练数据(C,Q,A),其中,C 表示段落,Q 表示 ...
- 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(九)—— 预测与校验
系列目录: 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(一)--数据 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(二)-- 介绍及分词 菜鸟笔记-DuReader阅读理解基线模 ...
- 【阅读笔记】Java游戏服务器架构实战
[阅读笔记]Java游戏服务器架构实战 书籍链接:Java游戏服务器架构实战 作者提供的源码链接:kebukeYi / book-code 这里对书籍中比较重要的知识点(精华部分)进行摘录(总结) 文 ...
- trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer
一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...
- nginx 修改html header,nginx 安全笔记 (修改nginx的header信息和错误显示版本号)
nginx 安全笔记 (修改nginx的header信息和错误显示版本号) 发布时间:2020-08-07 16:18:18 来源:51CTO 阅读:1189 作者:674591788 随笔记载,欢迎 ...
最新文章
- python autoreload
- Python-OpenCV 笔记3 -- 霍夫变换(Hough)
- [Java基础]反射练习之越过泛型检查,运行配置文件制定内容
- android studio 2.3 instant run,android studio 2.3 instant run not working
- MySQL笔记-group by和聚合函数的使用
- 西门子智能门锁设计_如何过度设计门锁
- 【MyBatis笔记】0-MyBatis简介
- python中的pickle解析
- linux测试libreoffice,LibreOffice 7.0 开放测试,最终版本将于8月初发布
- 网络通信基础——网络协议
- 利用Java编写自动关机程序(包括输入、输出、控制电脑自动关机)
- 高等数学-空间解析几何与向量代数
- 腾讯云学生服务器+wordpress搭建个人网站
- 免费开源51单片机个人课程设计--基于stc89c52及红外遥控的测温智能电风扇
- poj日记(3295)
- 利用android的通知Notification来实现msn的登录状态
- 超越CBAM,全新注意力GAM:不计成本提高精度
- 6.5 自定义报表方案
- 极验第四代滑块验证码破解(二):滑块缺口识别
- 记录一下sql两个表关联的查询使用方法