Nginx学习笔记

  • Nginx ("engine x")是一个高性能的HTTP反向代理web服务器,特点是占有内存少,并发能力强。
  • 正向代理:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
  • 反向代理:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后再返回给客户端,暴露的是代理服务器地址,隐藏了真实服务器的IP地址。
  • 负载均衡:将原先请求集中到单个服务器上的流量改为分发到多个服务器上。
  • 动静分离:把动态页面和静态页面分别由不同的服务器来解析,以加快网站的解析速度,降低原来单个服务器的压力。
  • 查看Nginx版本号:./nginx -v
  • 查看Nginx安装路径:whereis nginx/usr/local/nginx
  • 启动Nginx./nginx
  • 停止Nginx./nginx -s stop
  • 重新加载Nginx./nginx -s reload
  • 查看Nginx进程状态:ps -ef | grep nginx
  • docker 拉取 Nginx 镜像并运行一个容器实例:

docker search nginx
docker pull nginx
docker images nginx
docker run -d --name mynginx -p 80:80 nginx
docker ps
docker exec -it mynginx /bin/bash

  • 配置文件:nginx.conf/usr/local/nginx/conf/nginx.conf,其内容包含3部分:

全局块:从首行到events块之间的内容,主要设置一些影响 nginx 服务器整体运行的配置指令,包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
events块:主要影响 Nginx 服务器与用户的网络连接。常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
http块:包括http全局块server块。每个http 块可以包括多个server 块,而每个server 块就相当于一个虚拟主机
(3.1)、http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
(3.2)、server块:这块和虚拟主机有密切关系,从用户的角度看,虚拟主机相当于一台独立的硬件主机,该技术的产生是为了节省互联网服务器硬件成本。每个server块分为全局server块和多个location块
(3.2.1)、全局server块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
(3.2.2)、location块:一个server块可以配置多个location块。基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

  • 修改Nginx 配置文件:nginx.conf
# ================ 1、全局块开始 ==================
#user  nobody;
# worker_processes 值越大,可以支持的并发处理量也就越多,但会受到硬件、软件等设备的制约
worker_processes  1; 

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

# ================ 1、全局块结束 ==================

# ================ 2、events 块开始 ===============

events {
    # 每个 work process 支持的最大连接数为 1024
    worker_connections 1024;
}

# ================ 2、events 块结束 ===============

# ================ 3、http 块开始 =================

http {
    # ================ 3.1、http 全局块开始 =================
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # ================ 3.1、http 全局块结束 =================

    # ================ 3.2、server 块开始 ===================

    # 负载均衡服务列表配置,服务名为 myserver,weight 为权重
    upstream myserver {
        server 192.168.211.143:8080;
        server 192.168.211.143:8081;
    }
    
    server {
        # ================ 3.2.1、server 全局块开始 ===================
        listen       80;
        server_name  192.168.211.143;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;

        # ================ 3.2.2、server 全局块结束 ===================

        # ================ 3.2.3、location 块开始 =====================

        location / {
            proxy_pass  http://myserver;
            root   html;
            index  index.html index.htm;
        }

        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}

        # ================ 3.2.3、location 块结束 =====================
    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    # 配置虚拟主机访问映射规则
    server {
        listen       9001;
        server_name  192.168.211.143;

        location ~ /edu/ {
            proxy_pass http://127.0.0.1:8080;
        }
        location ~ /vod/ { 
            proxy_pass http://127.0.0.1:8081;
        }
    }

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    # ================ 3.2、server 块结束 ===================
}
# ================ 3、http 块结束 =================
  • location指令说明:用于匹配URL
location [ = | ~ | ~* | ^~] uri {

}

1、=:用于不含正则表达式的URI前,要求请求字符串与URI严格匹配,若匹配成功,则停止继续向下搜索并立即处理该请求。
2、~:用于表示URI包含正则表达式,且区分大小写
3、~*:用于表示URI包含正则表达式,且不区分大小写
4、^~:用于不含正则表达式的URI前,要求Nginx服务器找到标识URI和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。

  • 注意: 若uri包含正则表达式,则必须要有~或者~*标识。
  • Nginx分配服务器策略:

1、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,若后端服务器宕机,则会自动剔除。
2、权重weight):代表权重默认为1,权重越高被分配的客户端越多。

# 负载均衡服务列表配置,服务名为 myserver,weight 为权重
upstream myserver {
    server 192.168.211.143:8080 weight=5;
    server 192.168.211.143:8081 weight=10;
}

3、ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题。

upstream myserver {
    ip_hash;
    server 192.168.211.143:8080;
    server 192.168.211.143:8081;
}
  • 动静分离:把动态跟静态请求分开,可以理解成使用 Nginx处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:一种是纯粹把静态文件放在独立的服务器上,也是目前主流推崇的方案;另外一种就是动态跟静态文件混合在一起发布,通过 nginx 来分开。具体实现:通过 location 指定不同的后缀名实现不同的请求转发:

通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体expires定义:给一个资源设定一个过期时间,无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。若是经常更新的文件,则不建议使用expires来缓存。假设设置某个url的expires值为3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,就不会从服务器抓取,返回状态码304;若有修改,则直接从服务器重新下载,返回状态码200。(304状态码:当你发出一个GET请求时服务器会从缓存中调用你要访问的内容,这个时候服务器就可以判断这个页面是不是更新过了,如果未更新过那么它会给你返回一个304状态码。)

# 访问 url:ip/www/index.html
location /www/ {
    root /data/;
    index  index.html index.htm;
}
# 访问 url:ip/image/01.jpg
location /image/ {
    root /data/;
    # 列出当前文件夹下的所有文件及文件夹
    autoindex on;
}
动静分离1
动静分离2.1
动静分离2.2
  • Nginx高可用:两台业务系统启动着相同的服务,若有一台出现故障,则另一台自动接管。通过keekpalived软件来实现。作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作。当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
Nginx高可用配置
  • 安装命令:yum install keepalived。查看是否安装成功:rpm -q -a keepalived
  • keepalived软件主要是通过VRRP协议实现高可用的功能。VRRPVirtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,其目的为了解决静态路由出现的单点故障问题,能够保证当个别节点宕机时,整个网络可以不间断地运行。
keepalived安装成功
keepalived安装成功后生成目录及其配置文件
  • 修改keepalived的配置文件:keepalived.conf
# 全局定义
global_defs { 
    # 设置报警邮件地址,可以设置多个,每行一个,需要开启 sendmail服务
    notification_email {
      [email protected]
      [email protected]
      [email protected]
    }
    # 设置邮件的发送地址
    notification_email_from [email protected]
    # 设置 SMTP Server 地址
    smtp_ server 192.168.17.129
    # 设置 SMTP Server 超时时间
    smtp_connect_timeout 30
    # 表示运行 keeplived 服务器的一个标识,发邮件时显示大邮件主题中的信息
    # LVS_DEVEL这字段在/etc/hosts文件中设置;通过它访问到主机:127.0.0.1 LVS_DEVEL
    router_id LVS_DEVEL 
}

vrrp_script chk_http_ port {
    script "/usr/local/src/nginx_check.sh"
    interval 2   # 检测脚本执行的间隔:2s
    weight 2  # 权重:若这个脚本检测为真,则服务器权重+2
}

vrrp_instance VI_1 {
    state BACKUP   # 备份服务器上将 MASTER 改为 BACKUP
    interface ens32 # 网卡名称,通过 ifconfig 命令查看
    virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
    priority 100   # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1    # 每隔1s发送一次心跳
    authentication {    # 校验方式:类型是密码,密码1111
        auth type PASS
        auth pass 1111
    }
    virtual_ipaddress { # 虛拟ip
        192.168.211.50 # VRRP H虛拟ip地址
    }
}
  • 在路径/usr/local/src/下新建检测脚本nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];
    then /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];
        then killall keepalived
    fi
fi
  • 给脚本nginx_check.sh加个执行权限:chmod u+x nginx_check.sh
  • 启动keepalived:systemctl start keepalived.service
  • 停止keepalived:systemctl stop keepalived.service
  • 查看keepalived进程状态:ps -ef | grep keepalived
访问虚拟ip:192.168.211.50
查看虚拟ip相关信息

查看nginx进程状态
master与worker的关系
worker抢占式工作原理
  • 1个 master 和多个 woker 的好处:①可以使用nginx –s reload 进行热部署操作;②每个 woker 都是独立的进程,若其中1个 woker 出现问题,则其他 woker 不受影响,继续进行争抢,实现请求过程,不会造成服务中断。
  • 设置多少个 woker 合适:Nginx同redis类似都采用了IO多路复用机制,每个worker都是1个独立的进程, 但每个进程里只有1个主线程,通过异步非阻塞的方式来处理请求。即使是千上万个请求也不在话下。每个worker的线程可以把1个cpu的性能发挥到极致。因此,worker数和服务器的cpu数相等是最为适宜的选择。设置少了会浪费cpu,多了会造成cpu频繁切换上下文带来的损耗。
# 设置worker数量
worker.processes 4 

# work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000

# work绑定cpu (4work绑定8cpu中的4个)
worker_cpu_affinity 0000001 00000010 00000100 00001000
  • 连接数worker_connection:①发送请求,占用了woker 2个或4个连接数。②nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?

a、普通的静态访问最大并发数是: worker_connections * worker_processes /2;
b、若是HTTP 作为反向代理,则最大并发数量为worker_connections * worker_processes/4。

你可能感兴趣的:(Nginx学习笔记)