第1章 安装Nginx及第三方模块

标签: 精通Nginx

精通Nginx – 个人笔记
Nginx中文文档
阅读 开源软件架构:Nginx


  • 第1章 安装Nginx及第三方模块

    • C10K问题
    • 使用包管理器安装Nginx
    • 从源代码安装Nginx
    • 配置Web或者mail服务器
    • 使用各种模块
    • 查找并安装第三方模块
    • 组合在一起

C10K问题

韩天峰(Rango)的博客 关于C10K、异步回调、协程、同步阻塞

最近到处在争论这些话题,发现很多人对一些基础的常识并不了解,在此发表一文做一下解释。此文未必能解答所有问题,各位能有一个大致的了解就好。

  • C10K的由来
    大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合。互联网还不够普及,用户也不多。一台服务器同时在线100个用户估计在当时已经算是大型应用了。所以并不存在什么C10K的难题。互联网的爆发期应该是在www网站,浏览器,雅虎出现后。最早的互联网称之为Web1.0,互联网大部分的使用场景是下载一个Html页面,用户在浏览器中查看网页上的信息。这个时期也不存在C10K问题。

Web2.0时代到来后就不同了,1方面是普及率大大提高了,用户群体几何倍增长。2是互联网不再是单纯的浏览万维网网页,逐渐开始进行交互,而且应用程序的逻辑也变的更复杂,从简单的表单提交,到即时通信和在线实时互动。C10K的问题才体现出来了。每一个用户都必须与服务器保持TCP连接才能进行实时的数据交互。Facebook这样的网站同一时间的并发TCP连接可能会过亿。

腾讯QQ也是有C10K问题的,只不过他们是用了UDP这种原始的包交换协议来实现的,绕开了这个难题。当然过程肯定是痛苦的。如果当时有epoll技术,他们肯定会用TCP。后来的手机QQ,微信都采用TCP协议。
这时候问题就来了,最初的服务器都是基于进程/线程模型的,新到来一个TCP连接,就需要分配1个进程(或者线程)。而进程又是操作系统最昂贵的资源,一台机器无法创建很多进程。如果是C10K就要创建1万个进程,那么操作系统是无法承受的。如果是采用分布式系统,维持1亿用户在线需要10万台服务器,成本巨大,也只有Facebook,Google,雅虎才有财力购买如此多的服务器。这就是C10K问题的本质。

实际上当时也有异步模式,如:select/poll模型,这些技术都有一定的缺点,如selelct最大不能超过1024,poll没有限制,但每次收到数据需要遍历每一个连接查看哪个连接有数据请求。

  • Epoll异步非阻塞
    既然有了C10K问题,程序员们就开始行动去解决它。于是FreeBSD推出了kqueue,Linux推出了epoll,Windows推出了IOCP。这些操作系统提供的功能就是为了解决C10K问题。因为Linux是互联网企业中使用率最高的操作系统,Epoll就成为C10K killer、高并发、高性能、异步非阻塞这些技术的代名词了。

epoll技术的编程模型就是异步非阻塞回调,也可以叫做Reactor,事件驱动,事件轮循(EventLoop)。Epoll就是为了解决C10K问题而生。使用Epoll技术,使得小公司也可以玩高并发。不需要购买很多服务器,有几台服务器就可以服务大量用户。Nginx,libevent,node.js这些就是Epoll时代的产物。

  • C100K,C1M,C10M,C100M …
    C10K问题解决后,程序员又提出了更高的挑战,也就是最近在火热争论的C100K,C1M等。Epoll既然能解决C10K,解决什么C100K,C1M也是可以的。只不过这个已经没有意义了。一个公司有1亿用户难道他买不起1万台服务器嘛。WhatsApp有2亿用户,卖了150亿美元。1万台服务器最多花费5000万美元。

看到阿里技术保障部的人也在谈C10K话题,我要补充一下,搞路由器、交换机、网关、防火墙之类基础网络设备的人,就不要参与C10K话题了。我们说的是应用层程序。

  • 协程,coroutine
    当程序员还沉浸在解决C10K问题带来的成就感时,一个新的问题被抛出了。异步嵌套回调太TM难写了。尤其是Node.js层层回调,缩进了几十层,要把程序员逼疯了。于是一个新的技术被提出来了,那就是协程(coroutine)。这个技术本质上也是异步非阻塞技术,它是将事件回调进行了包装,让程序员看不到里面的事件循环。程序员就像写阻塞代码一样简单。比如调用 client->recv() 等待接收数据时,就像阻塞代码一样写。实际上是底层库在执行recv时悄悄保存了一个状态,比如代码行数,局部变量的值。然后就跳回到EventLoop中了。什么时候真的数据到来时,它再把刚才保存的代码行数,局部变量值取出来,又开始继续执行。

这个就像时间禁止的游戏一样,国王对巫师说“我必须马上得到宝物,不然就砍了你的脑袋”,巫师念了一句时间停止的咒语,直到过了1年后勇士们才把宝物送来。这时候巫师解开咒语,把宝物交给国王。这里国王就可以理解成协程,他根本没感觉到时间停止,在他停止到醒来期间发生了什么他不知道,也不关心。

这就是协程的本质。协程是异步非阻塞的另外一种展现形式。Golang,Erlang,Lua协程都是这个模型。

  • 同步阻塞
    再回到同步阻塞这个话题,不知道大家看完协程是否感觉得到,实际上协程和同步阻塞是一样的。答案是的。所以协程也叫做用户态进/用户态线程。区别就在于进程/线程是操作系统充当了EventLoop调度,而协程是自己用Epoll进行调度。

协程的优点是它比系统线程开销小,缺点是如果其中一个协程中有密集计算,其他的协程就不运行了。操作系统进程的缺点是开销大,优点是无论代码怎么写,所有进程都可以并发运行。

Erlang解决了协程密集计算的问题,它基于自行开发VM,并不执行机器码。即使存在密集计算的场景,VM发现某个协程执行时间过长,也可以进行中止切换。Golang由于是直接执行机器码的,所以无法解决此问题。所以Golang要求用户必须在密集计算的代码中,自行Yield。
实际上同步阻塞程序的性能并不差,它的效率很高,不会浪费资源。当进程发生阻塞后,操作系统会将它挂起,不会分配CPU。直到数据到达才会分配CPU。多进程只是开多了之后副作用太大,因为进程多了互相切换有开销。所以如果一个服务器程序只有1000左右的并发连接,同步阻塞模式是最好的。

  • 异步回调和协程哪个性能好
    协程虽然是用户态调度,实际上还是需要调度的,既然调度就会存在上下文切换。所以协程虽然比操作系统进程性能要好,但总还是有额外消耗的。而异步回调是没有切换开销的,它等同于顺序执行代码。所以异步回调程序的性能是要优于协程模型的。

这里是指Nginx这种多进程异步非阻塞程序。Node.js/Redis此类程序如果不开多个进程,由于无法利用多核计算优势,所以性能并不好。在Node.js中可以使用childprocess/cluster等扩展开启多进程以解决此问题。


本章重点内容:
+ 使用包管理器安装Nginx
+ 通过源代码安装Nginx
+ 配置Nginx为Web或者Mail服务器
+ 使用各种模块
+ 查找并安装第三方模块
+ 组合在一起


使用包管理器安装Nginx

sudo apt-get install nginx
或
sudo yum install nginx

貌似这种方式安装会缺少某些模块,我自己试过,所以推荐采用源码安装的方式

从源代码安装Nginx

  • 官网下载页面: http://nginx.org/en/download.html
  • 官网源码安装指南: Building nginx from Sources
./configure
make && sudo make install
  • .configure参数见文档

详细的安装指南参考: Ubuntu16.04.1 安装Nginx

# ubuntu16.04 , 我的Nginx安装在 /usr/local/nginx下
# 建立软连接
sudo ln -s /usr/local/nginx/sbin/nginx  /sbin/nginx
# 这样就可以操作nginx了
# 启动
sudo nginx
# 停止
sudo nginx -s stop
# 检查配置文件语法
sudo nginx -t   [-c 配置文件路径 ]
# 重启
sudo nginx -s reload

配置Web或者mail服务器

使用各种模块

  • 在Nginx发布的版本中,除了http和mail模块外,还有一些其他模块。这些模块默认没有安装,但是可以在编译安装时适当地在配置选项–with-_module中来启用相应的选项

  • 一些模块:

    1. http_charset:字符集转换
    2. http_gzip:压缩过滤器
    3. http_ssi:ssi过滤器
    4. http_auth_basic:基本身份验证限制访问
    5. http_rewrite:rewrite模块,可重写uri
    6. http_uwsgi:将请求传递到uWSGI服务器
    7. ………………

参考 蝈蝈俊的技术心得: nginx 的模块及处理流程

  • Nginx模块主要有4种角色:
    (1) core(核心模块):构建nginx基础服务、管理其他模块。
    (2) handlers(处理模块): 用于处理HTTP请求,然后产生输出。
    (3) filters(过滤模块): 过滤handler产生的输出。
    (4) load-balancers(负载均衡模块):当有多于一台的后端备选服务器时,选择一台转发HTTP请求。

  • Nginx模块处理流程


  • 一些参考文档:

    参考 Nginx基本使用方法及各模块基本功能
    参考 最全面 Nginx 入门教程 + 常用配置解析

查找并安装第三方模块

  • Nginx的第三方模块可以为Nginx提供额外的功能
  • 步骤:

    1. 查找定位第三方模块的项目位置
    2. 下载
    3. 阅读README文件
    4. 根据指示安装
  • 注意:很多第三方模块是实验性质的,安装前最好测试或确认再进行安装

组合在一起

第1章 安装Nginx及第三方模块相关推荐

  1. Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)

    Ubuntu20.04中fastdfs,nginx的安装和配置 环境准备: 编译环境: Ubuntu20.04 使用的系统软件: fastdfs-6.07 fastdfs-nginx-module-1 ...

  2. linux+nginx添加rtmp,编译安装nginx添加rtmp模块

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 摘要:nginx源码编译添加rtmp模块实现视频推流服务器 环境:deepin linux 15.10.1(基于debi ...

  3. 环境变量设置及第三方模块安装

    python环境变量设置 '''环境设置1.环境搭建 下载安装pythoh2.7.python3+(两者有语法的区别) 配置环境变量:我的电脑=>属性=>高级=>环境变量=>将 ...

  4. 已安装nginx动态添加模块

    说明: 已经安装好的nginx,需要添加一个未被编译安装的模块,需要怎么弄呢? 具体: 这里以安装第三方ngx_http_google_filter_module模块为例 nginx的模块是需要重新编 ...

  5. 为已经安装nginx添加php模块,安装成功的nginx如何添加未编译安装模块

    原已经安装好的nginx,现在需要添加一个未被编译安装的模块: nginx -V 可以查看原来编译时都带了哪些参数 原来的参数: --prefix=/app/nginx 添加的参数: --with-h ...

  6. (转)windows下安装python及第三方库numpy、scipy、matplotlib终极版

    https://blog.csdn.net/qikaihuting/article/details/56833258

  7. 如何安装nginx第三方模块--add-module

    nginx文件非常小但是性能非常的高效,这方面完胜apache,nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. 在安装 ...

  8. python的安装及第三方包

    如何安装python及第三方包 作者:郜庆科 1 Python简介 Python 是一门非常强大的语言,我们可以使用它完成许多相当高级的内容. Python为我们提供了非常完善的基础代码库,覆盖了网络 ...

  9. Nginx 附录C 模块编译,调试与测试

    Nginx 附录C 模块编译,调试与测试 C.1 编译与安装 环境要求 操作系统:目前Nginx各版本在以下操作系统和平台测试通过: FreeBSD 3 - 10 / i386; FreeBSD 5 ...

最新文章

  1. [LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串...
  2. 异步IO一定更好吗?
  3. ARP***原理与解决方法《一》
  4. C# PictureBox加载图片并显示进度条
  5. mac上使用zsh配置环境变量
  6. C# 哈希表(Hashtable)用法笔记
  7. 从基于Maven的Web应用程序获取版本字符串
  8. linux---基础01
  9. jenkins 集成java搅拌_如何将Gauge与Jenkins集成
  10. 辐流式重力浓缩池计算_注册考试重点!平流式、竖流式、辐流式、斜板式4大沉淀池构型...
  11. 【报告分享】2020城市大脑规划建设与应用研究报告.pdf(附下载链接)
  12. LeetCode(506)——相对名次(JavaScript)
  13. 单片机蜂鸣器编程音乐_单片机系统硬件调试方法
  14. Linux下C语言编程资料
  15. k8s 部署spring cloud项目
  16. 显卡mx150和230哪个好_MX130与MX150差距对比分析
  17. 二进制转化为十进制Java实现
  18. Mac安装软件时提示“文件已损坏,您应该将它移到废纸篓”解决办法(亲测有效)
  19. 最流行的微服务应用框架有哪些
  20. 基于三维GIS的场数据模型研究与实践

热门文章

  1. COMSOL中接触面积计算
  2. ssh-keygen和openssl的区别和基本用法
  3. 邵阳计算机学校2020年军训,2021年邵阳学院大一新生军训安排和新生军训项目和时间...
  4. java swing label_Swing JLabel类
  5. 入坑机器学习:六,逻辑回归
  6. 歌曲matlab代码,MATLAB程序编写歌曲《世上只有妈妈好》
  7. oracle脚本刷错了怎么办,dbstartdbshut脚本中的错误
  8. 《游戏机制——高级游戏设计技术》一1.4 原型制作技术
  9. 游戏开发中的物理之运动角色(2D)
  10. 双通道内存有什么优点和缺点?