Nginx学习

Nginx学习

官网地址:http://nginx.org/

什么是nginx?

1. *Nginx* (engine x) 是一个高性能的[HTTP](https://baike.baidu.com/item/HTTP)和[反向代理](https://baike.baidu.com/item/反向代理/7793488)web服务器,特点是<font color=#FF0000>**占有内存少,并发能力强**</font>。
2. nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表名能支持高达50000个并发连接数。

nginx一般用来干啥?

  1. 反向代理
  2. 负载均衡
  3. 动静分离

nginx安装

安装前置依赖

yum -y install make gcc-c++ openssl openssl-devel pcre pcre-devel zlib zlib-devel

nginx安装

cd /usr/local/ #切换到指定目录
mkdir nginx  #创建nginx文件夹并上传下载好的nginx包
./configure  #使用nginx默认配置
make && make install #编译安装
#出现错误,可能是没有logs文件夹,在nginx下创建logs文件夹
mkdir logs

nginx启动

#切换到nignx安装的sbin目录
/usr/local/nginx/sbin
#指定配置文件进行启动
./nginx -c /usr/local/nginx/conf/nginx.conf 
#查看进程确定启动
ps -ef|grep nginx
#访问
http://192.168.2.27  出现welcome to nginx

防火墙操作

 firewall-cmd --list-all  #查看开放的端口号
 #开启http
 firewall-cmd --add-service=http --permanent
 #添加端口,格式为:端口/通讯协议 --permanent #永久生效,没有此参数重启后失效
 firewall-cmd --add-port=80/tcp --permanent
 #重新加载防火墙
 firewall-cmd --reload

nginx配置文件详解

nginx配置文件由三部分组成

全局块

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

#nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量越多,但是会受到软硬件的制约
worker_processes  1;

#配置错误日志的存放路径
error_log  logs/error.log;

events块

​ events块涉及的指令主要影响nginx服务器与用户的网络连接。

#表示支持的最大连接数为1024,这部分对nginx的性能影响较大,在实际中需要进行灵活配置
worker_connections  1024;

http块

​ http块是nginx配置中最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里,它分为http全局块和sever块

  1. http全局块

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

  1. server块

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

    ​ 每个http块可以包含多个server块,每个server块相当于一个虚拟主机

    1. 全局server块

      最常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或IP配置

    2. location块

      一个server块可以配置多个location块

      ​ 这块的主要作用是基于nginx服务器接收到的请求字符串(例如:http://192.168.2.27/wzjs),对虚拟ip之外的字符串(例如前面的:/wzjs)进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行配置!

nginx正反向代理

概念

正向代理概念

比如我们直接访问国外的网站,例如谷歌,是直接访问不到的,这个时候就需要一个正向代理服务器,客户端进行配置,通过正向代理去访问谷歌!

反向代理概念

​ 用户将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址信息,隐藏了真实服务器ip地址

反向代理location指令说明

基本语法:location [=||*|^~|@] pattern{……}

=:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求

~:用于表示uri包含正则表达式,并且区分大小写

~*:用于表示uri包含正则表达式,并且区分大小写

^~:用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即处理此location请求,而不再使用location块中的正则uri和请求字符串做匹配

注意:如果uri包含正在表达式,则必须要有~ 或者 ~*标识

nginx负载均衡

负载均衡基础配置

http {
	#负载服务配置
	upstream wzjsServer {
		server 192.168.2.27:8080 weight=5;
		server 192.168.2.28:9080 weight=5;
    
    	#======================================以下为补充配置==========================================
    	#限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制
    	server 192.168.2.27:222 max_conns=1000; 
	    #表示当前的 server 暂时不参与负载。
   		server 192.168.2.27.333 down; 
	    #其它所有的非 backup 机器 down 或者忙的时候,才会被请求。
    	server 192.168.2.27.444 backup; 
    	#max_fails(默认1):允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器
    	#fail_timeout(默认10秒):达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
    	server 192.168.2.27:8080 max_fails=3 fail_timeout=15;
	}

    server {
        listen       80;
        server_name  localhost;
        
		location /wzjs {
        	#反向代理指定负载服务
            proxy_pass http://wzjsServer;
        }
    }
}

负载均衡策略

轮询(默认)

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

weight(权重配置)

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

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如:

#负载服务配置
upstream wzjsServer {
    server 192.168.2.27:8080 weight=5;
    server 192.168.2.28:9080 weight=4;
}

ip_hash

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

#负载服务配置
upstream wzjsServer {
    ip_hash;
    server 192.168.2.27:8080 weight=5;
    server 192.168.2.28:9080 weight=4;
}

url_hash

按请求url的hash结果来分配请求,使每个url定向到同一个后端服务器,服务器做缓存时比较有效。

#负载服务配置
upstream wzjsServer {
    server 192.168.2.27:8080 weight=5;
    server 192.168.2.28:9080 weight=4;
    hash $request_uri;
}

faid(第三方)==>需要下载fair模块源码编译进nginx

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

upstream wzjsServer {
    server 192.168.2.27:8080;
    server 192.168.2.28:9080;
    fair;
}

nginx动静分离

nginx配置静态资源代理

  1. 创建静态资源存放文件夹:/server/staticProxy

  2. 添加单个目录代理配置

    location /img/ { #指向/server/staticProxy下面的img目录
        root /server/staticProxy/; #代理目录
    }
    #访问http://192.168.2.27/img/test.jpg测试
    
    
    location /pdf/ { #指向/server/staticProxy下面的pdf目录目录
        root /server/staticProxy/;  #代理目录
    }
    #访问http://192.168.2.27/pdf/test.pdf测试
    
  3. 添加代理父目录,多个子目录

    location /staticProxy/ { #代理父目录
        root /server/;
    }
    #访问测试
    http://192.168.2.27/staticProxy/pdf/test.pdf
    http://192.168.2.27/staticProxy/img/test.jpg
    

nginx高可用集群搭建

什么是nginx高可用?

nginx集群

安装实操

集群搭建前置条件

  1. 两台服务器都安装nginx
  2. 两台服务器都安装keepalived

keepalived安装

命令安装:yum install keepalived -y

检查是否安装:rpm -q -a keepalived

安装后位置:/etc/keepalived

高可用主从配置

修改keepalived.conf文件

global_defs {
    notification_email { #通知
        lwenpu@163.com
    }
    notification_email_from sns-lvs@gmail.com #通知\电子邮件\来自
    smtp_server 192.168.2.27 #通知邮箱的服务
    router_id 192.168.2.27        # 设置nginx master的id,在一个网络应该是唯一的
}
vrrp_script chk_http_port {
    script "/usr/local/nginx/src/check_nginx_pid.sh"    #检测脚本
    interval 2                          #(检测脚本执行的间隔,单位是秒)
    weight 2 #权重
}
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface ens33            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),使用ifconfig查看
    virtual_router_id 66        # 虚拟路由编号,主从要一致
    priority 100            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication { #权限规则
        auth_type PASS
        auth_pass mz_xifen
    }
    track_script {
    	chk_http_port            #(调用检测脚本)
    }
    virtual_ipaddress {
        192.168.17.66            # 定义虚拟ip(VIP),可多设,每行一个
    }
}

添加检测脚本

#!/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
    systemctl stop keepalived
  fi
fi

注:如果脚本执行报错!

vim check_nginx_pid.sh
#直接输入":",然后在":"之后输入"set ff"
:set ff
#如果出现
fileformat=dos
#我们需要把格式改为unix,方法是输入":set ff=unix"
:set ff=unix
#再使用:set ff查看,发现变成了以下,就可以正常执行了
fileformat=unix 

两台服务器都配置完keepalived.conf和添加检测脚本后,分别进行keepalived和nginx的启动

keepalived启动:systemctl start keepalived.service

keepalived日志查看:tail -f /var/log/messages

keepalived重启:systemctl restart keepalived

nginx启动:./nginx -c /usr/local/nginx/conf/nginx.conf

测试

访问虚拟ip:192.168.17.66 ==出现nginx配置则成功

  1. 停止master的nginx测试
  2. 恢复master,停止slave节点测试
  3. 都停掉测试

一切按照预想的结果则恭喜溪风高可用集群环境搭建成功!

nginx原理及配置优化

工作原理为:一个master多个worker

一个master和多个worker的好处

  1. 可以使用nginx -s reload热部署,利于nginx进行热部署操作
  2. 每个worker是独立的进程,如果有其中的一个worker出现问题,其他worker是独立的,继续进行争抢,实现请求过程,不会造成服务中断!

设置多少个worker合适?

worker数和服务器的cpu数相等是最合适的,如果超出cpu数会造成cpu上下文切换!

连接数worker_connection

  1. 发送请求,占用了worker的几个连接数?

    静态代理2个,反向代理4个

  2. nginx有一个master,有四个worker,每个worker支持最大的连接数是1024,支持最大的并发数是多少?

    静态代理计算公式:worker_connection*worker_processes/2

    反向代理计算公式:worker_connection*worker_processes/4

posted @ 2021-08-15 22:46  幸运刘  阅读(54)  评论(0)    收藏  举报