nginx功能介绍和基本安装

1、简介

  nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP三、SMTP代理服务器;nginx能够做为一个HTTP服务器进行网站的发布处理,另外nginx能够做为反向代理进行负载均衡的实现。php

2、功能介绍

2.一、nginx负载均衡

  负载均衡创建在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增长吞吐量、增强网络数据处理能力、提升网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操做单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工做任务。--百度百科css

  nginx提供的负载均衡能力主要包括Http负载均衡,和UDP和TCP负载均衡;html

2.1.一、负载均衡算法

一、Round Robin:请求在服务器之间均匀分布,并考虑服务器权重(默认算法)java

upstream backend {
   server backend1.example.com;
   server backend2.example.com;
}

二、Least Connections:在考虑服务器权重的同时,向活动链接数最少的服务器发送请求nginx

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}

三、IP Hash:向其发送请求的服务器由客户端IP地址肯定。在这种状况下,要么使用IPv4地址的前三个八位字节,要么使用整个IPv6地址来计算哈希值。该方法保证来自同一地址的请求能够到达同一服务器,除非该服务器不可用c++

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}

若是其中一个服务器须要从负载均衡组中暂时移除,能够用down参数标记它,以保持当前客户端IP地址的散列。将由此服务器处理的请求自动发送到组中的下一个服务器。web

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
}

四、Generic Hash:向其发送请求的服务器由用户定义的键肯定,该键能够是文本字符串、变量或组合。例如,密钥能够是成对的源IP地址和端口,或者是URI。正则表达式

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

五、Least Time(NGINX Plus独有):对于每一个请求,NGINX Plus选择平均延迟最低且活动链接数最少的服务器,其中最低平均延迟是根据包含到最短期指令的如下哪些参数计算:
header :从服务器接收第一个字节的时间
last_byte:从服务器接收完整响应的时间
last_byte inflight:从服务器接收完整响应的时间,考虑到不完整的请求redis

upstream backend {
    least_time header;
    server backend1.example.com;
    server backend2.example.com;
}

六、Random:每一个请求都将被传递到随机选择的服务器。若是指定了两个参数,NGINX首先考虑服务器权重随机选择两个服务器,而后使用指定的方法选择其中一个服务器
least_conn:活动链接数最少
least_time=header(NGINX Plus):从服务器接收响应头的最小平均时间($upstream_header_time)
least_time=last_byte(NGINX Plus):从服务器接收完整响应的最小平均时间($upstream_response_time)算法

upstream backend {
    random two least_time=last_byte;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}

注意:在配置Round Robin之外的任何方法时,将相应的指令(hash、ip_hash、least_conn、least_time或random)放在upstream {}块中服务器指令列表的上方

其余设置:
Server Weights:默认状况下,NGINX使用Round-Robin方法根据请求的权重在组中的服务器之间分发请求。server指令的weight参数设置服务器的权重;默认值为1:

upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com;
    server 192.0.0.1 backup;
}

2.1.二、第三方算法

第三方的负载均衡策略的实现须要安装第三方插件

一、fair:按照服务器端的响应时间来分配请求,响应时间短的优先分配

#动态服务器组
upstream dynamic_zuoyu {
    server localhost:8080;  
    server localhost:8081;  
    server localhost:8082;  
    fair;    #实现响应时间短的优先分配
}

二、url_hash:按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源屡次请求,可能会到达不一样的服务器上,致使没必要要的屡次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就能够从缓存中读取。

#动态服务器组
upstream dynamic_zuoyu {
    hash $request_uri;    #实现每一个url定向到同一个后端服务器
    server localhost:8080;  
    server localhost:8081;  
    server localhost:8082; 
}

2.二、缓存

  缓存(cache),原始意义是指访问速度比通常随机存取存储器(RAM)快的一种高速存储器,一般它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是全部现代计算机系统发挥高性能的重要因素之一。--百度百科

通常一个请求有:客户端缓存,代理端缓存(nginx),服务器缓存(redis、Memcache等)

  1. 客户端第一次向Nginx请求数据a;
  2. 当Nginx发现缓存中没有数据a时,会向服务端请求数据a;
  3. 服务端接收到Nginx发来的请求,则返回数据a到Nginx,而且缓存在Nginx;
  4. Nginx返回数据a给客户端应用;
  5. 客户端第二次向Nginx请求数据a;
  6. 当Nginx发现缓存中存在数据a时,则不会请求服务端;
  7. Nginx把缓存中的数据a返回给客户端应用

2.二、web服务器

  Web服务器通常指网站服务器,是指驻留于因特网上某种类型计算机的程序,能够向浏览器等Web客户端提供文档,也能够放置网站文件,让全世界浏览;能够放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache、 Nginx 、IIS。-- 百度百科

nginx做为web服务器的优势:

  1. 轻量级,一样起web 服务,比apache占用更少的内存及资源 ,支持更多的并发链接,体现更高的效率,这点使 Nginx 尤为受到虚拟主机提供商的欢迎。在高链接并发的状况下,Nginx是Apache服务器不错的替代品: Nginx在美国是作虚拟主机生意的老板们常常选择的软件平台之一. 可以支持高达 50,000 个并发链接数的响应, 这归功于Nginx为咱们选择了 epoll and kqueue 做为开发模型.
  2. 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  3. 高度模块化的设计,编写模块相对简单
  4. 社区活跃,各类高性能模块出品迅速啊
  5. Nginx自己就是一个反向代理服务器
  6. 负载均衡能力突出,Nginx 既能够在内部直接支持 Rails 和 PHP 程序对外进行服务, 也能够支持做为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不管是系统资源开销仍是CPU使用效率都比 Perlbal 要好不少

  apache是同步多进程模型,一个链接对应一个进程;nginx是异步的,多个链接(万级别)能够对应一个进程,通常来讲,须要性能的web 服务,用nginx 。若是不须要性能只求稳定,那就apache 吧。

  当使用nginx做为web服务器时,其必须经过fastcgi协议结合php-fpm使用,而不能像apache那样直接将php做为自身的一个模块来处理请求。

  当请求交给php-fpm处理以后,当前这个链接是不能断开的,nginx怎么处理这个链接?链接始终是存在,nginx要维持一段内存空间,保存链接的相关信息(客户端信息,请求报文等),称为接收缓冲区,而当nginx准备好数据以后,是经过发送缓存区响应请求给客户端,因此维持一个请求或者说是一段会话是须要空间的。

  若是客户端能理解fastcgi报文,nginx直接将php-fpm数据处理好的经过fastcgi协议传送过来的响应报文给到客户端,拿到一位数据就放到发送缓冲区中,客户端直接拿到,这个过程就是同步的,nginx就是作了透明转发。可是上述的过程是不行的,客户端是没法理解的,php-fpm处理以后的fastcgi协议报文彻底送给nginx以后,nginx须要处理成客户端能识别的http报文才行,因此存储fastcgi协议报文也是须要空间的,因此这种方式下是异步的

 

 

   多个请求多是相同的资源,因此咱们能够再nginx中加缓存,当请求过来时,先查看缓存是否存在且没有过时,有的话,nginx取出缓存数据封装响应报文给到客户端,没有缓存再向动态服务器php-fpm请求数据,php-fpm返回数据后,nginx先缓存起来,再响应给客户端,这样就大大减小了动态服务器的压力。

2.三、反向代理

  正向代理:若是把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则须要经过代理服务器来访问,这种代理服务就称为正向代理。

  反向代理:其实客户端对代理是无感知的,由于客户端不须要任何配置就能够访问,咱们只须要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。

2.四、动静分离

  动静分离:为了提升网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源好比图片,js,css等文件,咱们能够在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就能够直接处理,而不用将请求转发给后端服务器。用户请求的动态文件好比servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的做用。

  动静分离主要是经过nginx+tomcat来实现,其中nginx处理图片、html、JS、CSS等静态文件,tomcat处理jsp、servlet等动态请求。因此能够利用nginx做为文件服务器,在公司的内网搭建文件服务器,提供下载功能,挺方便。

  动静分离从目前实现角度来说大体分为两种:一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另一种方法就是动态跟静态文件混合在一块儿发布,经过 nginx 来分开。

2.五、压缩和解压缩

  压缩响应一般显著的减小传输数据的大小。然而,压缩发生在运行时,它也会增长至关大的处理开销对性能有负面的影响。Nginx在发送响应到客户端时执行压缩,但不对已经压缩的响应“二次压缩”。

  默认状况下,NGINX仅压缩MIME类型的响应text/html。要压缩其余MIME类型的响应,请包含gzip_types指令并列出其余类型。

2.六、高可用性

  高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它一般是指,经过设计减小系统不能提供服务的时间。若是一个系统可以一直提供服务,那么这个可用性则是百分之百,可是天有不测风云。因此咱们只能尽量的去减小服务的故障

  Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了能够实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。所以,Keepalived除了可以管理LVS软件外,还能够做为其余服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件
Keepalived高可用服务之间的故障切换转移,是经过VRRP 来实现的。

  在 Keepalived服务正常工做时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点本身还活着,当主 Master节点发生故障时,就没法发送心跳消息,备节点也就所以没法继续检测到来自主 Master节点的心跳了,因而调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色

2.七、邮件代理

  NGINX能够将IMAP,POP3和SMTP协议代理到承载邮件账户的上游邮件服务器之一,所以能够用做电子邮件客户端的单个端点。这可能带来许多好处,例如:

  1. 轻松扩展邮件服务器的数量
  2. 根据不一样的规则选择邮件服务器,例如,根据客户的IP地址选择最近的服务器
  3. 在邮件服务器之间分配负载

  使用--with-mail用于电子邮件代理功能的--with-mail_ssl_module参数和用于SSL / TLS支持的参数编译了Mail模块

3、编译安装

3.一、安装依赖

yum -y install gcc automake autoconf libtool make gcc-c++

#安装pcre
cd /usr/local/src
wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz 
tar -zxvf pcre-8.44.tar.gz
cd pcre-8.44
./configure
make
make install

#安装zlib
cd /usr/local/src
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make
make install

#安装openssl
cd /usr/local/src
wget http://www.openssl.org/source/openssl-1.1.1d.tar.gz
tar -zxf openssl-1.1.1d.tar.gz
cd openssl-1.1.1d
./Configure darwin64-x86_64-cc --prefix=/usr
make
make install

3.二、安装nginx

官网:https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#sources

cd /usr/local/src
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0

./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-file-aio \
--with-http_realip_module \
--with-http_ssl_module \
--with-stream \
--with-mail=dynamic \
--with-pcre=/usr/local/src/pcre-8.44 \
--with-zlib=/usr/local/src/zlib-1.2.11 \
--with-openssl=/usr/local/src/openssl-1.1.1d

make 
make install

3.三、编译参数

make是用来编译的,它从Makefile中读取指令,而后编译。

make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被容许使用的链接处理的方法,好比它会检测你是否是有CC或GCC,并非须要CC或GCC,它是个shell脚本,执行结束时,它会建立一个Makefile文件。nginx的configure命令支持如下参数: 

--prefix=path #定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录。默认使用 /usr/local/nginx。

--sbin-path=path #设置nginx的可执行文件的路径,默认为 prefix/sbin/nginx.

--conf-path=path #设置在nginx.conf配置文件的路径。nginx容许使用不一样的配置文件启动,经过命令行中的-c选项。默认为prefix/conf/nginx.conf.

--pid-path=path #设置nginx.pid文件,将存储的主进程的进程号。安装完成后,能够随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认状况下,文件名 为prefix/logs/nginx.pid.

--error-log-path=path #设置主错误,警告,和诊断文件的名称。安装完成后,能够随时改变的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默认状况下,文件名 为prefix/logs/error.log.

--http-log-path=path #设置主请求的HTTP服务器的日志文件的名称。安装完成后,能够随时改变的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默认状况下,文件名 为prefix/logs/access.log.

--user=name #设置nginx工做进程的用户。安装完成后,能够随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的用户名是nobody。

--group=name #设置nginx工做进程的用户组。安装完成后,能够随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的为非特权用户。

--with-select_module --without-select_module #启用或禁用构建一个模块来容许服务器使用select()方法。该模块将自动创建,若是平台不支持的kqueue,epoll,rtsig或/dev/poll。

--with-poll_module --without-poll_module #启用或禁用构建一个模块来容许服务器使用poll()方法。该模块将自动创建,若是平台不支持的kqueue,epoll,rtsig或/dev/poll。

--without-http_gzip_module #不编译压缩的HTTP服务器的响应模块。编译并运行此模块须要zlib库。

--without-http_rewrite_module #不编译重写模块。编译并运行此模块须要PCRE库支持。

--without-http_proxy_module #不编译http_proxy模块。

--with-http_ssl_module #使用https协议模块。默认状况下,该模块没有被构建。创建并运行此模块的OpenSSL库是必需的。

--with-pcre=path #设置PCRE库的源码路径。PCRE库的源码(版本4.4 - 8.30)须要从PCRE网站下载并解压。其他的工做是Nginx的./ configure和make来完成。正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。

--with-pcre-jit #编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。

--with-zlib=path #设置的zlib库的源码路径。要下载从 zlib(版本1.1.3 - 1.2.5)的并解压。其他的工做是Nginx的./ configure和make完成。ngx_http_gzip_module模块须要使用zlib 。

--with-cc-opt=parameters #设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时须要使用:--with-cc-opt="-I /usr/local/include。.如须要须要增长 select()支持的文件数量:--with-cc-opt="-D FD_SETSIZE=2048".

--with-ld-opt=parameters #设置附加的参数,将用于在连接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L /usr/local/lib".

--add-module=<PATH> #静态加载第三方模块

--add-dynamic-module=<PATH> #动态加载第三方模块

4、nginx经常使用命令

 ./nginx   #启动nginx

[root@lgh1 nginx]# ./nginx -h
nginx version: nginx/1.18.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
-?,-h : this help
-v : show version and exit #显示 nginx 的版本
-V : show version and configure options then exit #显示 nginx 的版本,编译器版本和配置参数
-t : test configuration and exit #测试配置参数并退出
-T : test configuration, dump it and exit# 测试配置参数,dump出并退出
-q : suppress non-error messages during configuration testing #在配置测试期间禁止显示非错误消息
-s signal : send signal to a master process: stop, quit, reopen, reload #发送信号给主进程;包括stop(中止), quit(退出),reopen(从新打开日志文件), reload(从新加载配置文件)
-p prefix : set prefix path (default: /usr/local/nginx/) #设置nginx的路径
-c filename : set configuration file (default: /usr/local/nginx/nginx.conf) # 为Nginx指定一个配置文件
-g directives : set global directives out of configuration file #从配置文件中设置全局指令

5、配置文件格式说明

...              #全局块
events {         #events块
   ...
}
http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

  

一、全局块:配置影响nginx全局的指令。通常有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,容许生成worker process数等。
二、events块:配置影响nginx服务器或与用户的网络链接。有每一个进程的最大链接数,选取哪一种事件驱动模型处理链接请求,是否容许同时接受多个网路链接,开启多个网络链接序列化等。
三、http块:能够嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,链接超时时间,单链接请求数等。
四、server块:配置虚拟主机的相关参数,一个http中能够有多个server。
五、location块:配置请求的路由,以及各类页面的处理状况

 

参考

 https://www.cnblogs.com/1214804270hacker/p/9325150.html

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/

https://zhuanlan.zhihu.com/p/91296785

https://www.cnblogs.com/fuzhongfaya/p/8944951.html

https://www.cnblogs.com/crazymagic/p/11029487.html

https://www.nginx.cn/install

http://www.javashuo.com/article/p-xkijqyyb-hr.html

相关文章
相关标签/搜索