nginx学习总结

Nginx介绍

Nginx 采用了事件驱动和异步架构,此设计使 Nginx 成为可扩展、高性能的服务器。它是一个开源、轻量级和高性能的 Web 服务器,也用作 HTTP、HTTPS、SMTP、IMAP、POP3 协议的反向代理服务器,另一方面,它也用作 IMAP、POP3 和 IMAP 的 HTTP 负载均衡器、HTTP 缓存和电子邮件代理。简而言之,我们可以说 Nginx 是一种用于处理并发请求的软件。

Nginx 最重要的功能是反向代理负载均衡,反向代理将允许我们在端口 80 上托管多个域名,同时使用不同的语言编写后端服务,负载均衡可以把多个提供相同功能的后端服务配置成彼此冗余。

Nginx 负责访问日志、黑名单、负载平衡和提供静态文件访问,后台 Web 服务则可专注于业务逻辑处理,Nginx 是动静分离架构的入口程序。

Nginx 支持高并发,内存占用小。

Nginx 支持配置文件动态修改。

工作原理

nginx 在启动后,会以 daemon 的方式在后台运行,后台进程包含一个 master 进程和多个 worker 进程,worker 进程以非 root 用户运行,可以在配置文件中配置运行 worker 进程的用户。

master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。

worker 进程则是处理基本的网络事件。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。

总结其主要功能分别如下:

主进程(master process)的功能:

读取 Nginx 配置文件并验证其有效性和正确性

按照配置启动、管理和关闭工作进程

接受外界指令,比如重启、升级及关闭服务器等指令

不中断服务,实现平滑升级,重启服务并应用新的配置

开启日志文件

工作进程(woker process)的功能:

接收处理客户端的请求

将请求以此送入各个功能模块进行处理

IO 调用,获取响应数据

与后端服务器通信,接收后端服务器的处理结果

缓存数据,访问缓存索引,查询和调用缓存数据

发送请求结果,响应客户端的请求

接收主程序指令,比如重启、升级和退出等

模块结构

Nginx 的各种功能和操作都由模块来实现。Nginx 由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。Nginx 的模块从结构上分为核心模块、基础模块和第三方模块。 

核心模块: HTTP 模块、EVENT 模块和 MAIL 模块 

基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块 

第三方模块: HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块及用户自己开发的模块。

目录结构

常用命令

cd/usr/local/nginx/sbin/    ——使用命令需切换到此目录下

./nginx                  ——启动

./nginx -s stop            ——停止

./nginx -s quit            ——安全退出

./nginx -s reload          ——重新加载配置文件

ps aux|grep nginx         ——查看nginx进程

./nginx -v                ——查看版本号

Nginx配置文件

Nginx 主配置文件 /local/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织,通常每一个区块以一对大括号{}来表示开始与结束。

Main 位于 nginx.conf 配置文件的最高层;

Main 层下可以有 Event、HTTP 层;

Http 层下面允许有多个 Server 层,用于对不同的网站做不同的配置;

Server 层下面允许有多个 Location,用于对不同的路径进行不同模块的配置。

全局配置部分用来配置对整个 server 都有效的参数。主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。

user  nginx;                    #进程用户

worker_processes  1;            #工作进程,配合和CPU个数保持一致
error_log  /var/log/nginx/error.log warn;         #错误日志路径及级别
pid        /var/run/nginx.pid;                    #Nginx服务启动的pid

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 worker process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 worker process 可以同时支持的最大连接数等。

events {

      worker_connections  1024;    #每个worker进程支持的最大连接数
      use epoll;                   #内核模型,select、poll、epoll

  }

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

http {

    include       /etc/nginx/mime.types;     #指定在当前文件中包含另一个文件的指令
    default_type  application/octet-stream;  #指定默认处理的文件类型可以是二进制


    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'; #日志格式

    access_log  /var/log/nginx/access.log  main;      #访问日志

    sendfile        on;                               #优化静态资源

    #tcp_nopush     on;                         #nginx不要缓存数据,而是一段一段发送



    keepalive_timeout  65;        #给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。


#gzip  on; #压缩
include /etc/nginx/conf.d/*.conf;
}

Server 块也被叫做“虚拟主机”部分,它描述的是一组根据不同 server_name 指令逻辑分割的资源,这些虚拟服务器响应 HTTP 请求,因此都包含在 http 部分。最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。一个 server 块可以配置多个 location 块。

server {
        listen       80;           #监听端口,默认80
        server_name  localhost;    #提供服务的域名或主机名
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location / { #控制网站访问路径
            root   /usr/share/nginx/html;         #存放网站的路径
            index  index.html index.htm;          #默认访问的首页
        }
        #error_page  404              /404.html;  #错误页面
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;  #定义请求错误,指定错误代码
        location = /50x.html {       #错误代码重定向到新的location
            root   html;
        }

Nginx反向代理

反向代理服务器和目标服务器对外是一个服务器,暴露的是代理服务器的地址和端口,隐藏了真实服务器的地址和端口。用户只需要将请求发送到代理服务器,代理服务器会将请求分发给目标服务器,目标服务器返回数据后,数据通过代理服务器返回给客户端,这种方式就叫做反向代理。

当 NGINX 服务器代理请求时,它将请求发送到指定的服务器,获取响应,并将其发送回客户端。可以使用指定的协议向 HTTP 服务器或非 HTTP 服务器发送代理请求。支持的协议包括 FastCGI、uwsgi、SCGI 和 Memcached。要将请求传递到 HTTP 代理服务器,使用 proxy_pass 指令。

location /some/path/ {  

    proxy_pass http://www.example.com/link/;  

}  

要将请求传递到非 HTTP 代理服务器,请使用适当的 **_pass 指令:

fastcgi_pass:将请求传递给 fastCGI 服务器。

uwsgi_pass:将请求传递给 uwsgi 服务器。

scgi_pass:将请求传递给 SCGI 服务器。

memcached_pa​​ss:将请求传递给 memcached 服务器。

Nginx负载均衡

负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。

Nginx 以高并发、低消耗而闻名,这个特点使其很适合作为一个负载均衡器 (Load Balancer),有策略地分发请求给不同的后端服务器。避免单点故障之余,亦增强整个系统的可用性,简单说不容易宕机。负载均衡是反代的其中一个用途。本文介绍 Nginx 常用的几个负载均衡策略。

http{

...    #以下方法指定一种

    upstrem myserver {     #不指定方法则默认轮循

        Ip_hash; (ip_hash方法) #每个请求按访问ip的hash分配结果

        server 192.168.106.128:8080; weight=1( weight方法) #权重越高分配的请求越多;

        server 192.168.106.128:8081; weight=2

        Fair;(第三方) #根据后台服务器的响应时间来分配请求,响应时间短的优先分配

    }

}

Nginx动静分离

为了加快网站的解析速度,可以将动态页面和静态页面分别部署到两台服务器上,有不用的服务器来解析,加快解析速度,降低单服务器的压力,这种方式就是动静分离。Nginx动静分离简单来说就是将动态请求和静态请求分开,不仅仅是单纯的将动态页面和静态页面分开。

location /image/ {
    root /data/;     #静态文件夹名
    autoindex on;    # 当配置该项时,访问文件后会显示文件夹的内容
}

Nginx高可用(主从配置)

一般情况下,客户端访问的是主代理服务器,有主代理服务器将请求分发到目标服务器上;当主代理服务器出现异常而导致无法访问时,客户端会去访问备份代理服务器,有备份代理服务器将请求分发到目标服务器上,这种方式就是高可用。

在这个模式下,代理服务器会对外暴露一个虚拟ip,同时每个代理服务器均需配置KeepAlived,由KeepAlived控制虚拟ip实际访问的是哪台代理服务器;而客户端访问的是代理服务器暴露的虚拟ip。

global_defs {                         #全局配置
      notification_email {            # 邮件通知信息

     # 收件人
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   # 发件人
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1    # SMTP服务器地址
   smtp_connect_timeout 30      # SMTP 超时时间

   # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
   router_id LVS_DEVEL          #访问到服务器的名字
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_http_port{     #检测脚本配置
script “/usr/local/src/nginx_check.sh”
Interval 2;                    #检测脚本执行时间间隔
weight -20;                    #权重;  脚本权重改变
}

# 一个vrrp_instance就是定义一个虚拟路由器的实例名称
vrrp_instance VI_1 {
    state BACKUP             #定义类型,MASTER(主服务器)或BACKUP(备份服务器)
    interface ens33          # 接口,网卡名
    virtual_router_id 51     # 虚拟路由ID,取值范围为0-255  主备机需相同
    priority 90           # 优先级,值越高优先程度越高,主服务器需比备份服务器要高
    advert_int 1             # 频率,单位为秒   检测心跳

    # 通信认证机制
    authentication {
        auth_type PASS       # 认证方式,可以是PASS或AH
        auth_pass 1111       # 认证密码,最大8位数

    }
    virtual_ipaddress {      # 虚拟IP地址
        192.168.106.16
    }
}

特点总结

处理基本的网络事件;

worker之间是平等的;

以竞争的方式来争抢来自客户端的请求;

用户与worker之间的交互的接口;

管理worker进程,实现服务重启、平滑升级、更换日志文件,更新配置文件等功能;

默认采用多进程工作方式;

Nginx启动后,会运行一个master进程和多个worker进程;

一个master多个worker的好处:

1)可以使用nginx -s reload进行热部署,利用nginx进行热部署操作;

2)每个worker都是独立的进程,如果其中一个worker出现问题,也不会影响其他的worker,其他会进行对请求进行争抢,实现请求过程,不会造成服务中断;

需要设置多少个worker:

每个worker的线程都可以将一个cpu的性能发挥到极致,因此==worker数和服务器的cpu数一致==是最适宜的。

连接数worker_connection:

普通的静态访问最大并发数是:worker_connections * worker_processes / 2;

HTTP作为反向代理的最大并发数是:work_connections * worker_processes / 4;

以上,如果nginx有一个master,4个worker,每个worker支持的最大连接数是1024,那么支持的最大连接数是:

发送请求,占用了2个或者4个连接数;

支持的最大并发数:

1024 * 4 / 2 = 2048;  # 静态

1024 * 4 / 4 = 1024;  # HTTP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值