高并发与高可用实战(二)Nginx实战

环境准备

CentOS7 7.0 64位 以上+一台外网服务器+一个域名+CDN内容分发

电脑配置 16g以上内存

CentOS7 关闭防火墙

//临时关闭

systemctl stop firewalld

//禁止开机启动

systemctl disable firewalld

Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

 

负载均衡与反向代理

负载均衡

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

      负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

Nginx

     Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好.中国大陆使用nginx网站用户有:新浪、网易、 腾讯等。

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:

作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。

Nginx一般用户七层负载均衡,其吞吐量有一定的限制。为了提高整体的吞吐量,会在DNS和Nginx之间引入LVS(软件负载均衡器)、F5(硬负载均衡器) 可以做四层负载均衡,首先DNS解析到LVS(F5),让后LVS(F5)转发给Nginx,在有Nginx转发给真实的服务器

 

Nginx基本安装

Windows安装Nginx

解压:nginx-windows

双击: nginx.exe

能看到nginx欢迎界面说明,nginx安装成功

演示下 nginx做静态服务器

Linux安装Nginx

1.安装gcc gcc-c++(如新环境,未安装请先安装)

$ yum install -y gcc gcc-c++

2.安装wget

$ yum -y install wget

3.安装PCRE库

$ cd /usr/local/

$ wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz

$ tar -zxvf pcre-8.33.tar.gz

$ cd pcre-8.33

$ ./configure

$ make && make install

如果报错:

 

在 linux 中执行 wget 命令提示 -bash: wget: command not found 解决方法

解决办法 yum -y install wget

 

 

5.安装SSL库

$ cd /usr/local/

$ wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz

$ tar -zxvf openssl-1.0.1j.tar.gz

$ cd openssl-1.0.1j

$ ./config

$ make && make install

6.安装zlib库存

$ cd /usr/local/

$ wget http://zlib.net/zlib-1.2.11.tar.gz

$ tar -zxvf zlib-1.2.11.tar.gz

$ ./configure

$ make && make install

5.安装nginx

$ cd /usr/local/

$ wget http://nginx.org/download/nginx-1.8.0.tar.gz

$ tar -zxvf nginx-1.8.0.tar.gz

$ cd nginx-1.8.0

$ ./configure

$ make && make install

6.安装nginx

/usr/local/nginx/sbin/nginx

Nginx应用场景

   1、http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。

     2、虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。

     3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。

4、nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

Nginx目录结构

Nginx-

|_  conf   配置目录

|_  contrib

|_  docs 文档目录

|_  logs  日志目录

|_  temp 临时文件目录

|_  html 静态页面目录

|_  nginx.exe 主程序

Nginx静态资源

静态资源访问 存放在nginx的html页面

Nginx虚拟主机配置

1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站

2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台

3、基于ip的虚拟主机,几乎不用。

基于虚拟主机配置域名

实现步骤:

需要建立/data/www /data/bbs目录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件; 

      #当客户端访问www.itmayiedu.com,监听端口号为80,直接跳转到data/www目录下文件

    server {

        listen       80;

        server_name  www.itmayiedu.com;

        location / {

            root   data/www;

            index  index.html index.htm;

        }

    }

      #当客户端访问www.itmayiedu.com,监听端口号为80,直接跳转到data/bbs目录下文件

       server {

        listen       80;

        server_name  bbs.itmayiedu.com;

        location / {

            root   data/bbs;

            index  index.html index.htm;

        }

    }

基于端口的虚拟主机

使用端口来区分,浏览器使用域名或ip地址:端口号 访问

      #当客户端访问www.itmayiedu.com,监听端口号为8080,直接跳转到data/www目录下文件

       server {

        listen       8080;

        server_name  8080.itmayiedu.com;

        location / {

            root   data/www;

            index  index.html index.htm;

        }

    }

     

      #当客户端访问www.itmayiedu.com,监听端口号为8081,直接跳转到data/bbs目录下文件

       server {

        listen       8081;

        server_name  8081.itmayiedu.com;

        location / {

            root   data/bbs;

            index  index.html index.htm;

        }

    }

 

 

Nginx配置反向代理

 反向代理的作用

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

启动一个Tomcat 127.0.0.1:8080

使用nginx反向代理 8080.itmayiedu.com 直接跳转到127.0.0.1:8080

反向代理的好处

反向代理的好处隐藏真实内部ip地址,请求先访问nginx代理服务器(外网可以访问到),在使用nginx服务器转发到真实服务器中。

反向代理的配置

###当客户端访问www.itmayiedu.com,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080

      server {

        listen       80;

        server_name  www.itmayiedu.com;

        location / {

            proxy_pass http://127.0.0.1:8080;

            index  index.html index.htm;

        }

}

###当客户端访问www.itmayiedu.com,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8081

      server {

        listen       80;

        server_name  8081.itmayiedu.com;

        location / {

              proxy_pass http://127.0.0.1:8081;

            index  index.html index.htm;

        }

    }

 

 

 

Location正则表达式

location的作用

  location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

location的语法

已=开头表示精确匹配
如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。

^~ 开头表示uri以某个常规字符串开头,不是正则匹配

~ 开头表示区分大小写的正则匹配;

~* 开头表示不区分大小写的正则匹配

/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到

Location正则案例

#精确匹配,/后面不能带任何字符

server {

        listen       80;

        server_name  www.itmayiedu.com;

                            #精确匹配,注解后面不能带任何字符

        location =/ {

                                proxy_pass http://127.0.0.1:8080;

            index  index.html index.htm;

        }

}

 

 #匹配所有以/开头请求

server {

        listen       80;

        server_name  www.itmayiedu.com;

                 #匹配所有以/开头请求

        location / {

                                proxy_pass http://127.0.0.1:8080;

            index  index.html index.htm;

        }

    }

###  以开头/itmayiedu_8080拦截  默认开启不区分大小写

              server {

        listen       80;

        server_name  www.itmayiedu.com;

                            ###  以开头/itmayiedu_8080 最终跳转到http://127.0.0.1:8080/;

        location /itmayiedu_8080/ {

                                proxy_pass http://127.0.0.1:8080/;

            index  index.html index.htm;

        }

                            ###  以开头/itmayiedu_8080 最终跳转到http://127.0.0.1:8081/;

                            location /itmayiedu_8081/ {

                                proxy_pass http://127.0.0.1:8081/;

            index  index.html index.htm;

        }

    }

### 开头区分大小写

 

Upstream Server 负载均衡

Upstream Server 中文翻译 上游服务器,意思就是负载均衡服务器设置,白话文表示(就是被nginx代理最后真实访问的服务器)

负载均衡算法:配置多个上游服务器(真实业务逻辑访问的服务器)的负载均衡机制

失败重试机制:当上游服务器(真实业务逻辑访问的服务器)出现超时或者服务器不存活,是否考虑重试机制(补偿机制)

服务器心跳检测: 当上游服务器(真实业务逻辑访问的服务器),监控检测|心跳检测

Nginx配置负载均衡

Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡、故障转移、失败重试、容错、健康检查等。

当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。

Upstream Server配置

upstream 主要配置如下:

IP地址和端口号:配置上游服务器的IP地址和端口

      ###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制

    upstream  backServer{

          server 127.0.0.1:8080;

          server 127.0.0.1:8081;

      }

     

      server {

        listen       80;

        server_name  www.itmayiedu.com;

        location / {

               ### 指定上游服务器负载均衡服务器

               proxy_pass http://backServer;

            index  index.html index.htm;

        }

    }

 

负载均衡算法

1、轮询(默认)

 每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

2、weight(轮询权值)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

 3、ip_hash

        每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。

 

  4、fair(第三方)

       比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。

 

  5、url_hash(第三方)

       按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

 

权重Weight

   upstream  backServer{

              server 127.0.0.1:8080 weight=1;

              server 127.0.0.1:8081 weight=2;

              }

            

              server {

        listen       80;

        server_name  www.itmayiedu.com;

        location / {

                                ### 指定上游服务器负载均衡服务器

                             proxy_pass http://backServer;

            index  index.html index.htm;

        }

    }

 

IP绑定ip_hash

 每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。

 

upstream  backServer{

          server 127.0.0.1:8080 ;

           server 127.0.0.1:8081 ;

           ip_hash;

      }

     

      server {

        listen       80;

        server_name  www.itmayiedu.com;

        location / {

               ### 指定上游服务器负载均衡服务器

               proxy_pass http://backServer;

            index  index.html index.htm;

        }

    }

Nginx配置故障转移

当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。

Nginx配置代码

server {

        listen       80;

        server_name  www.itmayiedu.com;

        location / {

                                ### 指定上游服务器负载均衡服务器

                                proxy_pass http://backServer;

                            ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间

                                          proxy_connect_timeout 1s;

                                          ###nginx发送给上游服务器(真实访问的服务器)超时时间

            proxy_send_timeout 1s;

                                          ### nginx接受上游服务器(真实访问的服务器)超时时间

            proxy_read_timeout 1s;

            index  index.html index.htm;

        }

    }

Nginx配置失败重试策略

Nginx信号量

Nginx中使用信号来控制Nginx停止、平滑重启,Nginx支持以下几种信号:

TERM,INT :kill -TERM(INT) nginx主进程号或者kill -TERM(INT) `cat/usr/local/nginx/logs/nginx.pid `,nginx的进程马上被关闭,不能完整处理正在使用的nginx的用户的请求,等同于 /usr/local/nginx -s stop

QUIT:kill -QUIT nginx主进程号 优雅的关闭nginx进程,在处理完所有正在使用nginx用户请求后再关闭nginx进程,等同于/usr/local/nginx -s quit

HUP:kill -HUP nginx主进程号 nginx进程不关闭,但是重新加载配置文件。等同于/usr/local/nginx -s reload

USR1:kill -USR1 nginx主进程号 不用关闭nginx进程就可以重读日志,此命令可以用于nginx的日志定时备份,按月/日等时间间隔分割有用

USR2:kill -USR2 nginx主进程号 nginx的版本需要升级的时候,不需要停止nginx,就能对nginx升级

WINCH:kill -WINCH nginx主进程号 配合USR2对nginx升级,优雅的关闭nginx旧版本的进程。

nginx rewrite

 

Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。

Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。

通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。

Rewrite全局变量

nginx的rewrite规则就是使用正则匹配请求的url,然后根据定义的规则进行重写和改变,需ngx_http_rewrite_module模块来支持url重写功能,该模块是标准模块,默认已经安装。

变量

含义

$args

这个变量等于请求行中的参数,同$query_string

$content length

请求头中的Content-length字段。

$content_type

请求头中的Content-Type字段。

$document_root

当前请求在root指令中指定的值。

$host

请求主机头字段,否则为服务器名称。

$http_user_agent

客户端agent信息

$http_cookie

客户端cookie信息

$limit_rate

这个变量可以限制连接速率。

$request_method

客户端请求的动作,通常为GETPOST

$remote_addr

客户端的IP地址。

$remote_port

客户端的端口。

$remote_user

已经经过Auth Basic Module验证的用户名。

$request_filename

当前请求的文件路径,由rootalias指令与URI请求生成。

$scheme

HTTP方法(如httphttps)。

$server_protocol

请求使用的协议,通常是HTTP/1.0HTTP/1.1

$server_addr

服务器地址,在完成一次系统调用后可以确定这个值。

$server_name

服务器名称。

$server_port

请求到达服务器的端口号。

$request_uri

包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。

$uri

不带请求参数的当前URI$uri不包含主机名,如”/foo/bar.html”。

$document_uri

$uri相同。

判断IP地址来源

  ## 如果访问的ip地址为192.168.5.165,则返回403

     if  ($remote_addr = 192.168.5.166) { 

         return 403; 

     } 

限制浏览器访问

## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500

 if ($http_user_agent ~ Chrome) {  

         return 500; 

        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值