nginx入门

1.nginx的功能介绍

nginx(发音为“ engine x”)是由俄罗斯软件工程师Igor Sysoev编写的免费开源Web服务器。

自2004年公开发布以来,nginx一直致力于高性能,高并发性和低内存使用率。

Web服务器功能之上的其他功能,例如负载平衡,缓存,访问和带宽控制,以及与各种应用程序高效集成的能力,已使Nginx成为现代网站体系结构的理想选择。

2.nginx的安装

安装依赖项

# GCC编译器,用来编译C语言程序

yum install -y gcc

# C++编译器,用来编译C++语言程序

yum install -y gcc-c++

# Perl库兼容正则表达式,Nginx的HTTP模块要靠它来解析正则表达式

yum install -y pcre pcre-devel

# zlib库,用于对HTTP包的内容做gzip格式的压缩

yum install -y zlib zlib-devel

# 可以一次性执行前面的命令统一执行前面的命令

sudo yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel

# nginx

wget http://nginx.org/download/nginx-1.14.2.tar.gz

tar -xvf nginx-1.14.2.tar.gz

# 安装nginx 到/usr/local/nginx-1.14.2目录下面

cd nginx-1.14.2

./configure --prefix=/usr/local/nginx-1.14.2

make

make install

3.使用方式

nginx –s stop 快速停止

nginx –s quit  优雅停机

nginx –s reload 重新加载配置文件

nginx –s reopen 日志文件过大重建后(比如备份之前的日志文件,重建新的日志文件),让nginx把日志写入到新建的同名文件中。

4.nginx配置为WEB静态服务器

web服务器最重要的一个功能就是静态文件分发,比如css,jss,image;

http指令:构造一个处理http请求的上下文

server指令:构建一个虚拟服务器

location指令:虚拟服务器接收到端口对应的http请求之后,处理的路由规则。

配置文件示例:

events {} # 必写

http {# http请求相关的配置

  server {# 启动一个nginx虚拟服务器,默认端口80

    location / {

      # root 资源所在的根地址,此处为nginx安装目录内的相对路径

      root html;

    }

    location /images/ {

      # 此处写的是盘符下的绝对路径

      root /data/www/;

    }

  }

}

收到http://localhost/images/ test.png 请求后,nginx返回/data/www/images/test.png文件内容

收到http://localhost/some/index.html请求,nginx返回安装目录下/html/index.html的文件内容

5.nginx配置为代理服务器

nginx除了返回静态文件内容,还提供了ngx_proxy_moudle模块。在location中通过proxy_pass向上游服务器发起代理请求,给客户端返回代理的内容。

proxy_pass指令:向目标服务器发起代理请求。

配置如下:

events {} # 必写

http {# http请求相关的配置

  server {# 启动一个nginx虚拟服务器,默认端口80

    location / {

      # 向http://192.168.1.101:8081发起请求,并将代理请求返回的内容作为响应

      proxy_pass http://192.168.1.101:8081;

    }

  }

}

6.nginx配置为动静分离服务器

动静分离:静态内容由nginx服务器直接返回,动态内容由nginx服务器发起代理请求获取内容。

本质就是配置多个location模块,配置多个路由、多个命令组合、根据不同的请求,走不同的路由。

配置如下:

events{}

http{#htttp请求相关的配置

        server{

            location /{

                proxy_pass http://127.0.0.1:8080

            }

            location ~/.(gif|jpg|png|css|js|html){#静态不变的直接由nginx返回

                root data/www;

            }

        }

}

7.nginx配置集群负载均衡

nginx提供一个ngx_http_upstream_moudle模块。

upstream指令块:定义服务器实例集合,还可以指定负载均衡算法。

server指令:指定一个服务实例地址,weight参数是权重。

events {

}

http {

# Tomcat服务器集群

  upstream tomcat_servers {

#两个tomcat

    server 192.168.1.100:8081 weight=3;

    server 192.168.1.101:8081;

  }

  server {

   #将所有请求交给Tomcat集群去处理

      location / {

      proxy_set_header Host $http_host;

      proxy_pass http://tomcat_servers;

    }

  }

}

其他关于负载均衡算法的指令请参考官方文档:

http://nginx.org/en/docs/http/ngx_http_upstream_module.html

8.nginx故障转移

问题描述:默认情况下,当nginx发起代理请求失败后,也会给客户端直接返回失败的结果,这显然会影响用户的体验。

解决方案: 

    故障转移 :将请求分配给A服务器处理失败后,继续将请求分配给B继续处理。

    配置指令:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream

    配置示例:proxy_next_upstream error timout;

注意事项:

    可能会导致服务器处理重复请求,需要注意接口幂等性。

解决方案:所有数据修改的操作都要加上去重逻辑。请求中携带唯一的request_id以及发起请求的时间,后端通过filter记录下来。

具体实现思路:进入表单提交页面时从后端获取一个token令牌 ,后端产生token保存起来并设置一个过期时间,后端收到请求后即删除token。这样如果用户传递的token在后端找不到,即认为该请求失效,提示用户重试。

9.nginx雪崩的应对方案

    nginx在故障转移的场景下,会给其它正常的后端服务器分配更多的请求。而在高并发的场景下,每台服务器的压力都非常大,如果把原本由其它后端服务器处理的请求分摊出来,可能会导致原来正常的服务器,因压力增大而崩溃。一般有两种解决方案:限制重试次数,限制重试超时时间。、

10.nginx的熔断机制

    问题描述:对于确实存在故障的服务器,nginx不必去做太多的尝试 ,因为这会导致一个请求的处理时间变的过长。示例:服务器A的压力很大,处理请求的时长为15s,nginx设置的超时时间为10秒,服务器B的请求处理时间为1s。一个请求先转发到A服务器,超时后再故障转移到B服务器。整个请求的处理时长在用户看来是11s。

    熔断机制:当nginx请求某台服务器时,出现一定次数错误(可配置)的情况下,nginx在一定时间内(可配置),不在将请求分配给改服务器处理。过了熔断时间后,nginx会尝试分配一次请求给该服务器处理,如果失败,继续熔断。

配置示例:192.168.1.100 max_fails=3 fail_timeout=10s

你可能感兴趣的:(nginx入门)