10分钟-从nginx入门到精通的逆袭之路(附:高可用keepalive+nginx教程)

1、nginx简介

高性能的http和反向代理web服务器,优点:占用内存少、并发能力强,为性能而生,支持热部署,几乎能7*24小时不间断运行,另具有较高的稳定性

2、反向代理

正向代理:
	配置代理服务器,通过代理服务器访问互联网服务
反向代理:
	客户无感知,仅需访问反向代理服务器,反向代理服务器访问目标服务器获取响应结果,返回给客户端用户
说明:
	正向代理就相当于你自己找了一个中介(代理服务),去商店(目标服务器)买东西,买过来之后转交给你;而反向代理相当于商店(目标服务器)雇佣了一个中介(代理服务器)放到那里,等着你来访问,然后中介去商店拿到你想要的东西给你;即正向代理为客户端代理,反向代理为服务器代理;

在这里插入图片描述

3、负载均衡

单个服务器解决不了的问题,通过增加服务器的数量,将之前集中到一台服务器上的请求,分散到多台服务器上执行,将负载分发到多个服务器上,就是负载均衡

在这里插入图片描述

4、动静分离

为了加快响应的解析速度,将静态资源和动态资源部署在不同的服务器上面,由不同的服务器进行解析,降低单个服务的访问压力

5、nginx安装

1、安装编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
2、安装pcre
使nginx支持Rewrite功能,依次执行如下命令
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
tar -zxvf pcre-8.35.tar.gz
cd pcre-8.35
./configure
make && make install(编译安装)
pcre-config --version(查看版本号)
3、安装nginx
wget http://nginx.org/download/nginx-1.17.10.tar.gz
tar zxvf nginx-1.6.2.tar.gz
cd nginx-1.17.10
./configure
    --prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx
    --conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf
    --user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。--group=name类似
    --with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用--with-pcre自动找到库文件。使用--with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 – 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。
    --with-zlib=PATH : 指定 zlib(版本1.1.3 – 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。
    --with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
    --with-http_stub_status_module : 用来监控 Nginx 的当前状态
    --with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
    --add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)

make && make install(编译安装)
查看安装版本(默认会在此目录下,如果要安装指定目录,在./configure时,可以进行指定)
cd /usr/local/nginx/sbin/nginx -v
启动nginx
cd /usr/local/nginx/sbin
./nginx
启动成功之后,开启防火墙80端口
firewall-cmd --list-all(查询已开放的端口号)
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
直接访问服务器ip地址即可

在这里插入图片描述

6、nginx常用命令

使用nginx命令前提条件,必须进入到nginx的sbin命令目录下(即此处的/usr/local/nginx/sbin)
查看版本号
	./nginx -v
启动nginx
	./nginx
关闭nginx
	./nginx -s stop
重加载nginx(修改配置文件,不用重启直接加载生效)
	./nginx -s reload
重启nginx
	./nginx -s reopen 

7、nginx配置文件

1、位置:
	nginx分为解压目录和安装目录,如果在./configure时没有指定安装目录,那么默认的安装目录为(/usr/local/nginx),所有的操作是在安装目录下面进行的,当然配置文件修改的也是安装目录下面的,这个必须知道,不然更改解压目录下面的nginx.conf文件是无效的;
2、配置文件的组成部分
全局块(影响nginx整体服务运行的配置命令):
	#user  nobody;
    worker_processes  1;

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

    #pid        logs/nginx.pid;

    events {
        worker_connections  1024;
    }
	重点说明:
    worker_processes:
    	nginx工作开启的进程数,默认情况下为1,如果没有性能问题不必修改;如果修改,官方认为修改为和cpu核心数一样即可,但是一般开到4个或者8个即可,在网上开优化就不大了;查看cpu核心数的命令(cat /proc/cpuinfo| grep "processor"| wc -l),如果设置数和cpu数不一致,则可能出现问题
	

events块(主要影响nginx与用户的网络链接):
 	events {
        worker_connections  1024;
   	 }
   	重点说明:
   	worker_connections:
		单个工作进程可以允许同时建立外部连接的数量,数值越大,能同时处理的链接越多;此参数的设置和linux的系统内存,以及’进程最大可打开文件数‘(此参数受限于linux系统,可通过ulimit -命令查看)有关,如果worker_rlimit_nofile 设置会覆盖ulimit的值;

http块(服务器配置最多的部分):
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;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   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 {
            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;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # 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;
    #    }
    #}



8、反向代理配置

示例一:
	linux系统安装tomcat,根据ip:8080访问tomcat主页,在nginx上面配置,通过80端口映射到tomcat主页的8080端口,即通过浏览器访问linux的http://ip,来跳转到http://ip:8080;配置如下图:

在这里插入图片描述

示例二:
    通过访问http://ip:9000/a/a.html 转发到 http://ip:8080的服务器里面;
    通过访问http://ip:9000/b/a.html 转发到http://ip1:8080的服务器里面;
    转发规则根据不同的路径(/a/或者/b/)转发到不同的服务器(没有两台服务器的话,可以用两个tomcat不同的端口模拟,原理是以一样的),,别忘了开放服务器的9000端口,配置如下图:

在这里插入图片描述
在这里插入图片描述

’~‘符号代表使用正则,路径里面包含/a/则跳转到http://192.168.79.10:8080服务,包含/b/则跳转到http://192.168.79.11:8080服务
location 语法规则:
	location   [=|~|~*|^~|!~|!~*]    /uri/   { … }   
	·操作符 = 为 精确匹配 拥有优先级,优先级最高,一旦匹配不在往下走,可以配置访问频率较高的固定链接;
	·操作符 ^~ 为某个常规字符串开头 因为匹配的也较为准确 拥有绝对优先级,仅次=,可以是配置静态文件目录开头;
	·操作符 ~   表示区分大小写的正则匹配(uri区分大小写)没有绝对优先级,按文件顺序匹配;
	·操作符 ~* 表示不区分大小写的正则匹配  没有绝对优先级,按文件顺序匹配;
	·!为逻辑非操作
	·!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 没有绝对优先级,按文件顺序匹配
	·/ 通用匹配   表示任何请求都会匹配到    拥有绝对优先级,拥有的优先级最低
多个location配置的情况下匹配顺序为:
	首先匹配=,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。
	当有匹配成功时候,停止匹配,按当前匹配规则处理请求。也就是nginx的location有且只能被匹配一个

9、负载均衡

示例:
	通过访问http://ip1/test/a.html ,平均转发到两台tomcat服务器内,即http://ip1:8080/test/a.html和http://ip2:8080/test/a.html,配置如下图(关键字upstream);

在这里插入图片描述

nginx的调度策略:
·轮询:默认的调度方式;
·weight:根据权重进行连接分配,权重越大,分配连接越多,默认值为1;
·ip_hash:按照访问的ip的hash值进行分配,同一个ip每次都会访问到第一次访问的服务器上,解决session共享问题;
·url_hash:根据url的hash值进行分配;
·least_conn:最少链接数,哪个服务器的链接数少,就分配给哪个服务器;
·fair(需要安装插件):最短响应时间分配,按后端服务器的响应时间进行分配,谁的响应时间短给谁;

10、动静分离

	把动态请求和静态请求进行分开,nginx处理静态资源,tomcat处理动态资源;把静态文件单独放在一个服务器上,以提高访问的效率(tomcat不擅长静态文件的处理,另外可以对于不经常变动的静态你文件设置缓存时间expires),具体配置如下(也可指定后缀进行转发配置):

在这里插入图片描述

11、keepalive+nginx实现负载高可用

	开篇讲述nginx是一个高可用的负载工具,但是也是有缺点的,如果只有一台入口nginx服务器,那么这台服务器一旦宕机,可想而知,整体服务全部垮掉,这肯定不是我们想要的结果,于是就引出了,目前比较流行的nginx集群实现模式,keepalive+nginx的主从备份;
	keepalive是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障;
VRRP协议:
    VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。
	在VRRP协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为虚拟MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播IP地址 224.0.0.18 来定时发送通告消息。每个Router都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低master的优先权可以让处于backup状态的路由器抢占(pro-empt)主路由器的状态,两个backup优先级相同的IP地址较大者为master,接管虚拟IP。
	具体原理如下图:

在这里插入图片描述

yum install -y popt-devel
wget http://www.keepalived.org/software/keepalived-2.0.15.tar.gz
 tar -zxvf keepalived-2.0.11.tar.gz 
./configure --prefix=/ #这里说明keepalive默认配置文件路径为/etc/keepalive/keepalive.conf,不写--prefix=/的话会在/usr/local/etc/keepalive/keepalive.conf下面,有可能导致启动报错
make && make install
配置修改如下:
! Configuration File for keepalived
#全局配置
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_connect_timeout 30
   router_id Hadoop2001 #服务器的名称
}

#脚本配置
vrrp_script chk_http_port {
 
    script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本
 
    interval 2  #(检测脚本执行的间隔,单位是秒//脚本检测时间间隔,脚本必须在'间隔时间'内返回状态)
 
    weight 2  #脚本成立的话,此服务器的权重调整为2
 }


#虚拟ip配置
vrrp_instance VI_1 {
    state MASTER  # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface ens33  # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 51 # 虚拟路由编号,主从要一致 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
    priority 100 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
    advert_int 1  ######服务器之间的存活检查时间
    authentication {
        auth_type PASS ######设置认证类型和认证密码
        auth_pass 1111 ######认证密码,一组lvs 服务器的认证密码必须一致
    }
    virtual_ipaddress {
    #如果是虚拟机多个系统服务的话,最好设置成和自己的虚拟机IP同网段(?和你ip在一个网段),因为交换机上没配相关路由,跨网段的时候是会存在路由问题的,如果你把VIP也设置为192.168.?.*应该就没这个问题了
        192.168.?.* # 定义虚拟ip(VIP),可多设,每行一个,最好设置成和自己的虚拟机IP同网段,
        192.168.*.17 # 定义虚拟ip(VIP),可多设,每行一个
        192.168.*.18 # 定义虚拟ip(VIP),可多设,每行一个
    }
}
附加说明:
	检测脚本如果在window服务器上用txt直接编辑上传到linux的话要vi编辑:set ff=unix,不然无法执行;
	另外一定要注意脚本返回的状态要在检测时间内返回,不然脚本无法执行完毕;
	检测脚本:
	1	#!/bin/bash
     2	while :
     3	do
     4	nginxpid=`ps -C nginx --no-header | wc -l`
     5	if [ $nginxpid -eq 0 ];then
     6	   #/usr/local/nginx/sbin/nginx
     7	   sleep 1 
     8	   nginxpid=`ps -C nginx --no-header | wc -l`
     9	   echo $nginxpid
    10	      if [ $nginxpid -eq 0 ];then
    11	        systemctl stop keepalived	
    12	      fi
    13	fi
    14	done
    
	全部配置完毕之后,用systemctl status keepalived命令启动keepalive,如果报错,可能是因为安装时没有指定配置文件路径,进入/usr/local/etc/sysconfig目录,对其修改如下图,然后启动即可:

在这里插入图片描述

建立VRRP通信,防止出现脑裂(主备同时拥有vip);eth0:为您制定的网卡,固定的VRRP广播地址:224.0.0.18
	firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
	firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
	firewall-cmd --reload
# 查看配置的规则
	firewall-cmd --direct --get-rules ipv4 filter INPUT
	firewall-cmd --direct --get-rules ipv4 filter OUTPUT
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值