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