Nginx

前言,本想着一篇文章写完Nginx所有相关知识点,但是写着写着发现太多了,破不得以拆分为多篇文章。我会尽量保证文章不是很散,利于查找,与此同时,我也会提供一个目录对文章进行归类。

什么是nginx

Nginx是一个开源、高性能、可靠的HTTP中间件、代理服务。

关于正向代理与反向代理

正向代理代理的客户端,而反向代理代理的则是服务端。比如,如果挂vpn代理访问google就是正向代理。

常见的web服务器

Apache、Nginx、Lighttpd、Tomcat、Jetty、Weblogic、IIS、Jboss、Netty、Glassfish、Resin、Websphere

Apache、Nginx、Lighttpd服务器,都是静态web服务器,在Nginx之前,绝大部分企业,都采用Apache使用Apache,Lighttpd则比较轻量级。Jetty、Tomcat则是动态的Http服务器。

nginx的优势

IO多路复用 epoll

什么是IO多路复用

知乎-罗志宇 IO 多路复用是什么意思?

I/O就是指的我们网络I/O,多路指多个TCP连接(或多个Channel),复用指复用一个或少量线程。串起来理解就是很多个网络I/O复用一个或少量的线程来处理这些连接。如下图:

I/O复用 解决的是并发性请求的问题。处理多个并发请求,要产生多个I/O流来进行系统内核数据的读取。常用的两种处理方式是串行,前一个阻塞,后面无法继续进行处理、并行处理请求-实现最大并发和吞吐。

多路复用的三种方式:select 、poll、epoll

内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

轻量级

  • 初始功能模块少,可手动添加移除模块

  • 代码模块化,便于代码拓展

CPU亲和

现在的CPU大多都是多核的,而Nginx由多个worker进程同时工作,每个worker进程都与固定的一个CPU核心绑定,减少切换CPU的cache miss(缓存未命中,查找地址不在Cache中),从而获取更好的性能。

CPU Cache

  • Cpu Cache是一个快速缓存,访问速度比内存块很多,但是空间小,只能缓存部分内存数据

  • 按照功能划分,可以分为:指令缓存(code cache)、数据缓存(data cache)、TLB缓存(translation lookaside buffer,加速虚拟地址转物理地址)

  • 按照速度划分,大部分主流CPU都有二级甚至三级缓存:L1、L2、L3

sendfile文件处理机制

Nginx采用sendfile处理机制,所以静态文件的处理相当快。

Sendfile(零拷贝):

普通的静态资源处理方式需要将文件加载到内核空间(Kernel Space)中,再拷贝到用户空间(User Space)中,这个过程发生了多次切换

而静态文件无需用户空间,所以使用sendfile零拷贝的方式更为合适:

安装nginx

nginx的版本

  • Mainline version 开发版

  • Stable version 稳定版

  • Legacy version 历史版本

下载地址

下载地址:http://nginx.org/en/download.html

在此页面上共有如下几个可以下载的选项:

  • Mainline version

  • Stable version

  • Legacy versions

  • Source Code 源代码

  • Pre-Built Packages

除此之外,还有如下几个选项:

使用yum安装

具体请参考官方文档:http://nginx.org/en/linux_packages.html

配置完成后,可以通过yum list | grep nginx查看可安装的包。使用如下命令安装nginx:

Ubuntu下安装

编译安装

确认gcc、g++开发类库是否装好:

安装PCRE正则表达式库:

安装openssl依赖:

安装zlib依赖:

安装nginx:

编译参数

路径可参考nginx目录结构一节

在编译nginx时,即执行./configure命令时,可以指定一些参数为对nginx进行定制,比如指定nginx模块的位置:

如果你已经安装了nginx,可以通过命令nginx -V查看支持的参数:

nginx的目录结构

如果是yum 安装,安装后的文件分散于各个目录,可以使用命令rpm -ql nginx查看所有安装后的文件

安装nginx后目录结构如下:

启动停止重启nginx

关于Nginx模块

nginx的模块分为两种:

  • nginx官方模块

  • 第三方模块

查看nginx编译时自带的模块:

最后更新于

这有帮助吗?