当前位置 博文首页 > Nginx详解

    Nginx详解

    作者:MPolaris 时间:2021-01-14 06:03

    1. Nginx简介

    1.1 Nginx 的应用场景

    Nginx ("engine x") 是一个 高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强。事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 的网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

    Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言比如 perl、php等,但是不支持 java,Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

    Nginx 是 C语言开发,建议在 Linux 上运行,当然也可以安装 Windows 版本。

    1.2 反向代理与反向代理

    正向代理

    Nginx 不仅可以做反向代理实现负载均衡,还能用作为正向代理来进行上网等功能。正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet则需要通过代理服务器来访问,这种代理服务就称为正向代理。

    image-20210101223821389

    反向代理

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

    image-20210101223821389
    1.3 负载均衡

    客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后再将结果返回给客户端。 这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?

    我们首先想到的可能是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?

    上面的分析我们去掉了增加服务器物理配置来解决问题的办法也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

    image-20210101223821389
    1.4 动静分离

    为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析加快解析速度。降低原来单个服务器的压力。

    image-20210101223821389

    2. 安装

    2.1 在Linux中安装Nginx

    GCC安装(如果没有的话)

    安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境则需要安装

    yum install gcc-c++
    

    pcre安装

    PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。

    yum install -y pcre pcre-devel
    # 查看安装版本
    pcre-config --version
    

    openssl安装

    OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

    yum install -y openssl openssl-devel
    

    zlib安装

    zlib库提供了很多种压缩和解压缩方式,nginx使用zlib对http包的内容进行gzip,所以需要安装

    yum install -y zlib zlib-devel
    

    nginx安装,启动、停止

    # 1.下载nginx安装包
    wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
    # 解压压缩包到指定目录并切换到该目录下
    tar -zxvf nginx-1.12.0.tar.gz
    cd nginx-1.12.0
    # 执行三个命令
    ./configure #使用默认配置,其实在 nginx-1.12.0 版本中你就不需要去配置相关东西,默认就可以了。
    make #编译
    make install #安装
    # 查找安装路径并进入
    whereis nginx
    # 启动、停止nginx
    cd /usr/local/nginx/sbin/
    ./nginx -v		#查看nginx版本号
    ./nginx 		#启动
    ./nginx -s stop #此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程
    ./nginx -s quit #此方式停止步骤是待nginx进程处理任务完毕进行停止
    ./nginx -s reload 
    
    #启动时报80端口被占用解决办法:安装net-tool 包:
    yum install net-tools
    #查询nginx进程
    ps aux|grep nginx
    #重启 nginx
    #  方式一:先停止再启动(推荐)
    ./nginx -s quit
    ./nginx
    #  方式二:重新加载配置文件,当 ngin x的配置文件 nginx.conf 修改后,要想让配置生效需要重启 nginx,使用下面的命令不用先停止 nginx 再启动,nginx 即可将配置信息在 nginx 中生效,如下:
    ./nginx -s reload
    # 开机自启动(在rc.local增加启动代码即可)
    vi /etc/rc.local  # 添加:/usr/local/nginx/sbin/nginx
    chmod 755 rc.local # 设置执行权限
    

    防火墙相关

    # 查看开放的端口号
    firewall-cmd --list-all
    # 查询端口号80 是否开启:
    firewall-cmd --query-port=80/tcp
    # 永久开放80端口号:
    firewall-cmd --permanent --zone=public --add-port=80/tcp
    # 启动|关闭|重新启动  防火墙
    systemctl [start|stop|restart] firewalld.service
    
    2.2 使用docker-compose 安装Nginx

    下面以本人搭建的博客系统为例,看不懂的先看后面章节

    创建docker-compose.yml

    version: '3.1'
    services:
      nginx:
        restart: always
        image: nginx:1.19.2-alpine 
        container_name: polaris-nginx # nginx容器名
        ports:
          - 80:80       # http默认端口
          - 443:443     # https默认端口
        volumes:
          - "./conf/nginx.conf:/etc/nginx/nginx.conf"
          - "./wwwroot:/usr/share/nginx/wwwroot"
          - "./log:/var/log/nginx"
    

    创建配置文件nginx.conf

    user  nginx;
    worker_processes  1; # 进程数,建议按照cpu 数目来指定,一般为它的倍数。
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024; # 单个后台worker process进程的最大并发链接数  
    }
    
    
    http {
    	# upstream ↓
    	# down 表示当前的server暂时不参与负载
    	# weight 加权轮询权重,默认为1。weight越大,负载的权重就越大。
    	# backup 备用服务器, 当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
    	# max_fails 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
    	# fail_timeout max_fails次失败后,暂停的时间。
    	# 名字不能用下划线,否则访问不到
    	
    	# 博客后端,多个可以实现负载均衡(根据权重)
        upstream polaris-blog-system{
    	   server 172.20.147.156:8080 weight=1;
        }
    	
    	# 门户
    	upstream polaris-blog-portal{
    		server 172.20.147.156:3000 weight=1;      
    	}
    
    	#设定mime类型,类型由mime.type文件定义
        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 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    	# 对于普通应用,必须设为 on,
        # 如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
        # 以平衡磁盘与网络I/O处理速度,降低系统的uptime.
        sendfile on;
    	
        # tcp_nopush     on;
    
    	# 用于设置客户端连接保持活动的超时时间,在超过这个时间之后服务器会关闭该链接。
        keepalive_timeout  65;
    
        #开启gzip压缩
        gzip  on;
        gzip_disable "MSIE [1-6].";
    	
    	# 设定请求缓冲
        client_header_buffer_size    128k;
        large_client_header_buffers  4 128k;
    
    	# 允许客户端请求的最大单文件字节数
    	client_max_body_size 50m;
       
    	# 服务器名字的hash表大小
    	server_names_hash_bucket_size 128;
    	
    	# header中自定义变量时支持下划线
    	underscores_in_headers on; 
        
    	
    	server {
    		listen       80;
    		server_name  www.mpolaris.top;# 这个是门户的访问域名,指向http://polaris-blog-portal
    		
    		#location ^~/shop/ {
    		#	proxy_pass https://api.mpolaris.net/; # 商城,还未开发
    		#}
    		
    		location ^~/portal/ {
    			proxy_pass   http://polaris-blog-system;
    			# 以下是一些反向代理的配置可删除
    			proxy_redirect             off;
    			# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    			proxy_set_header           Host $host;
    			proxy_set_header           Cookie $http_cookie;
    			proxy_set_header           X-Real-IP $remote_addr;
    			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
    			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
    			proxy_set_header           X-Forwarded-Server $host;
    		}
    		
    		location ^~/user/ {
    			proxy_pass   http://polaris-blog-system;
    			# 以下是一些反向代理的配置可删除
    			proxy_redirect             off;
    			# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    			proxy_set_header           Host $host;
    			proxy_set_header           Cookie $http_cookie;
    			proxy_set_header           X-Real-IP $remote_addr;
    			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
    			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
    			proxy_set_header           X-Forwarded-Server $host;
    		}
    
    		location / {
    			proxy_pass   http://polaris-blog-portal;
    			# 以下是一些反向代理的配置可删除
    			proxy_redirect             off;
    			# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    			proxy_set_header           Host $host;
    			proxy_set_header           Cookie $http_cookie;
    			proxy_set_header           X-Real-IP $remote_addr;
    			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
    			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
    			proxy_set_header           X-Forwarded-Server $host;
    		}
    		
        }
    	
    	server {
    		listen       80;
    		server_name  mp.mpolaris.top; # 这个是管理中心的访问域名
    
    		#charset koi8-r;
    		#access_log  /var/log/nginx/host.access.log  main;
    		
    		
    		# 用户相关的请求,转到polaris_blog
    		location ^~/user/ {
                proxy_pass   http://polaris-blog-system;
    			# 以下是一些反向代理的配置可删除
    			proxy_redirect             off; 
    			# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    			proxy_set_header           Host $host;
    			proxy_set_header 		   Cookie $http_cookie;
    			proxy_set_header           X-Real-IP $remote_addr; 
    			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
    			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
    			proxy_set_header           X-Forwarded-Server $host;
            }
            
    		location ^~/admin/ {
               	proxy_pass   http://polaris-blog-system;
    			# 以下是一些反向代理的配置可删除
    			proxy_redirect             off; 
    			# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    			proxy_set_header           Host $host;
    			proxy_set_header 		   Cookie $http_cookie;
    			proxy_set_header           X-Real-IP $remote_addr; 
    			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
    			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
    			proxy_set_header           X-Forwarded-Server $host;
            }
            
            location ^~/portal/ {
               	proxy_pass    http://polaris-blog-system;
    			# 以下是一些反向代理的配置可删除
    			proxy_redirect             off; 
    			# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    			proxy_set_header           Host $host;
    			proxy_set_header 		   Cookie $http_cookie;
    			proxy_set_header           X-Real-IP $remote_addr; 
    			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
    			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
    			proxy_set_header           X-Forwarded-Server $host;
            }
    
    		# 其他访问访问wwwroot/mp
    		location / {
    			# 此处解决刷新页面出现404的问题
    			try_files $uri $uri/ /index.html;
    		    root   /usr/share/nginx/wwwroot/mp;
    			index  index.html index.htm;
    		}
    	}
    }
    

    3. 配置文件

    3.1 nginx.conf

    nginx 安装目录下其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件nginx.conf 也在其中,对 nginx 的使用基本上都是对此配置文件进行相应的修改。

    image-20210101223821389

    根据nginx.conf配置文件,可将其分为三部分

    3.2 第一部分:全局块

    从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组),允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

    如下配置,这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。

    worker_processes 1;
    
    3.3 第二部分:events块

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

    这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

    如下例子就表示每个 work process 支持的最大连接数为 1024。

    events {
    	worker_connections 1024;
    }
    
    3.4 第三部分:http块

    http块算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:http 块也可以包括 http 全局块server 块

    http {
        include       mime.types;
        default_type  application/octet-stream;
        
        sendfile on;
        
        keepalive_timeout  65;   
    	
    	server {
    		listen       80;
    		server_name  localhost
    
    		location / {
    			root   html;
    			index  index.html index.htm;
    		}
    		
    		error_page 500 502 503 504 /50x.html;
    		
    		location = /50x.html {
    			root   html;
    		}
    		
    	}
    }
    

    http全局块

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

    server块

    这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

    每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

    • 全局 server 块:常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
    • location 块:一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
    //location指令说明:location指令用于匹配URL,语法如下
    location [ = | ~ | ~* | ^~] uri {
        
    }
    // ① = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
    // ② ~ :用于表示 uri 包含正则表达式,并且区分大小写。
    // ③ ~* :用于表示 uri 包含正则表达式,并且不区分大小写。
    // ④ ^~ :用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
    
    //注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
    

    4. 配置实例 - 反向代理

    4.1 实例一

    实现效果

    在浏览器地址栏输入地址www.123.com,就会跳转到Linux系统tomcat主页面中

    image-20210103010039415

    准备内容

    在Linux系统中安装tomcat并启动

    # 下载
    wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.61/bin/apache-tomcat-8.5.61.tar.gz
    # 解压
    tar -zxvf apache-tomcat-8.5.61.tar.gz
    # 进入bin目录并启动tomcat
    cd apache-tomcat-8.5.61/bin
    ./startup.sh
    # 查看tomcat日志, -f 循环读取(常用于查阅正在改变的日志文件)
    tail -f catalina.out
    

    nginx.conf配置

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
    	
        keepalive_timeout  65;
    
        server {
            listen       80;
            # 访问192.168.204.130就会转发到proxy配置的地址去
            server_name  192.168.204.130; 
    
            location / {
    			proxy_pass http://127.0.0.1:8080;  #反向代理
    			
                root   html;
                index  index.html index.htm;
            }
    
           
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    
    4.2 实例二

    实现效果

    使用nginx反向代理,根据访问的路径跳转到不同端口的服务中。

    • nginx监听端口为9001
    • 访问http://192.168.204.130:9001/edu/,直接跳转到127.0.0.1:8081
    • 访问http://192.168.204.130:9001/vod/,直接跳转到127.0.0.1:8082

    准备内容

    • 准备两个tomcat,一个8081端口,一个8082端口,并在两个tomcat中分别准备好测试的页面
    • 修改nginx的配置文件,在http块中编写server{}逻辑

    nginx.conf配置

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
    
        keepalive_timeout  65;
    
        server {
            listen       9001;
            server_name  192.168.204.130; # 访问该地址就会转发到proxy配置的地址去
    
            location ~ /edu/ {
                proxy_pass http://127.0.0.1:8080;  #反向代理
            }
    
    		location ~ /vod/ {
                proxy_pass http://127.0.0.1:8081;  #反向代理
            }
        }
    }
    

    5. 配置实例 - 负载均衡

    5.1 实例

    实现效果

    浏览器地址栏输入地址http://192.168.204.130/Test/test.html,实现负载均衡效果,即将平均到8080和8081端口中

    准备工作

    • 两台tomcat服务器,一个为8080端口另一个为8081端口
    • 在两台tomcat的webapps目录中,创建Test文件夹并在其中创建test.html页面用于测试

    nginx.conf配置

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
    
        keepalive_timeout  65;
        
        upstream myserver {
            server 192.168.204.130:8080 weight=2;
            server 192.168.204.130:8081 weight=1;
        }
    
        server {
            listen       80;
            server_name  192.168.204.130;
    
            location / {
                proxy_pass http://myserver; # 负载均衡
                
                root html;
                index index.html index.htm;
            }
        }
    }
    
    5.2 nginx分配服务器策略

    第一种:轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉能自动剔除

    第二种:weight

    weight 代表权重默认为 1,权重越高被分配的客户端越多

    第三种:ip_hash

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

    upstream myServer {
    	ip_hash;
    	server server 192.168.204.130:8080;
    	server server 192.168.204.130:8081;
    }
    

    第四种:fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配

    upstream myServer {
    	server server 192.168.204.130:8080;
    	server server 192.168.204.130:8081;
    	fair;
    }
    

    6. 配置实例 - 动静分离

    6.1 理解

    Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。

    动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。通过 location 指定不同的后缀名实现不同的请求转发。

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

    6.2 实例

    项目资源准备

    nginx 配置

    重点是添加 location,最后检查 Nginx 配置是否正确即可,然后测试动静分离是否成功,之需要删除后端 tomcat 服务器上的某个静态文件,查看是否能访问,如果可以访问说明静态资源 nginx 直接返回了,不走后端 tomcat 服务器。

    server {
        listen       80;
        server_name  192.168.204.130;
    
        location /image/ {
            root html/image/;
            autoindex on; #列出当前文件夹中的内容
            index index.html index.htm;
        }
    }
    

    7. 搭建Nginx高可用集群

    7.1 主从模式

    图示

    image-20210113221825855

    搭建环境

    1. 两台服务器192.168.0.1与192.168.0.2
    2. 在两台服务器上安装Nginx,keepalived
    3. keepalived安装成功后在/etc下生成一个文件keepalived/keepalived.conf,对其进行配置
    # 全局定义
    global_defs { 
       notification_email { 
           acassen@firewall.loc 
           failover@firewall.loc 
           sysadmin@firewall.loc 
       } 
       notification_email_from Alexandre.Cassen@firewall.loc 
       smtp_server 192.168.17.129 
       smtp_connect_timeout 30 
       # 主要配置该值,通过这个服务器名字可以直接访问到ip
       router_id LVS_DEVEL   # /etc/host文件中配置:127.0.0.1 LVS_DEVEL
    } 
    
    # 检测脚本 与 权重参数
    vrrp_script chk_http_port { 
       script "/usr/local/src/nginx_check.sh"  # 脚本路径
       interval 2   #(检测脚本执行的间隔,单位s) 
       weight 2    # 设置当前服务器的权重。例当脚本成立时当前服务器权重+2
    } 
     
    # 虚拟IP配置
    vrrp_instance VI_1 { 
       state MASTER    # 备份服务器上将 MASTER 改为 BACKUP 
       interface ens33   # 绑定的网卡名 
       virtual_router_id 51   # 路由值,主、备机必须一样,是一个的唯一标识
       priority 100   # 主、备机取不同的优先级,主机值较大,备份机值较小 
       advert_int 1   # 每个多少时间(单位s)检测一次当前服务器
       authentication { # 权限方式,如下密码的形式,密码为1111
         auth_type PASS 
         auth_pass 1111 
       } 
       virtual_ipaddress { 
         192.168.17.50   # 虚拟IP地址 ,可以绑定多个
       } 
    }
    
    1. 编写检测脚本文件 nginx_check.sh
    #!/bin/bash 
    A=`ps -C nginx –no-header |wc -l` 
    if [ $A -eq 0 ];then 
     /usr/local/nginx/sbin/nginx  # nginx启动路径
     sleep 2 
     if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
     killall keepalived 
     fi 
    fi
    
    1. 将两台服务器上的nginx和keepalived都启动起来
    ./nginx
    systemctl start keepalived.service
    
    1. 访问虚拟ip,查看是否能访问到nginx主页
    2. 停掉主Nginx服务器后,访问虚拟ip,查看是否能访问到nginx主页
    7.2 双主模式

    图示

    image-20210113234042092

    搭建环境

    其他步骤与主从模式类似,只是keepalived.conf配置文件有所变化

    #全局定义
    global_defs { 
       notification_email { 
           acassen@firewall.loc 
           failover@firewall.loc 
           sysadmin@firewall.loc 
       } 
       notification_email_from Alexandre.Cassen@firewall.loc 
       smtp_server 192.168.17.129 
       smtp_connect_timeout 30 
       router_id LVS_DEVEL 
    } 
    
    # 检测脚本 与 权重参数
    vrrp_script chk_http_port { 
       script "/usr/local/src/nginx_check.sh"  
       interval 2   
       weight 2  
    } 
     
    # 虚拟IP配置
    vrrp_instance VI_1 { 
       state MASTER   
       interface ens33  
       virtual_router_id 51  
       priority 100   
       advert_int 1   
       authentication { 
         auth_type PASS 
         auth_pass 1111 
       } 
       virtual_ipaddress { 
         192.168.17.50 
       } 
    }
    
    # 虚拟IP配置
    vrrp_instance VI_2 { 
       state BACKUP   
       interface ens33  
       virtual_router_id 52  
       priority 50   
       advert_int 1   
       authentication { 
         auth_type PASS 
         auth_pass 2222
       } 
       virtual_ipaddress { 
         192.168.17.80 
       } 
    }
    

    8. Nginx原理与优化参数配置

    8.1 master & worker

    master & worker机制

    image-20210113235646531

    master-workers 的机制的好处

    首先对于每个 worker 进程来说独立的进程不需要加锁,省掉了锁带来的开销,同时在编程以及问题查找时也会方便很多。

    其次采用独立的进程可以让互相之间不会影响,一个进程退出后其它进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程,同时还支持 热部署(nginx -s reload)。当然worker 进程的异常退出肯定是程序有 bug 了,异常退出会导致当前 worker 上的所有请求失败,不过不会影响到所有请求降低了风险。

    worker如何工作

    image-20210114000115568

    需要设置多少个worker

    Nginx 同 Redis 类似都采用了 IO 多路复用机制(注意windows系统没有该功能),每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等 是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

    设置worker数量

    worker_processes 4
    #work 绑定 cpu(4 work 绑定 4cpu)。
    worker_cpu_affinity 0001 0010 0100 1000
    #work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
    worker_cpu_affinity 0000001 00000010 00000100 00001000
    

    连接数 worker_connection

    这个值是表示每个 worker 进程所能建立连接的最大值,所以一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。当然这里说的是最大连接数,对于HTTP 请 求 本 地 资 源 来 说 能 够 支 持 的 最 大 并 发 数 量 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * 、worker_processes /2,而如果是 HTTP 作为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发建立与客户端的连接和与后端服务的连接会占用两个连接。

    image-20210114001632413
    下一篇:没有了