Nginx 扩展第三方模块

简介

Nginx 是一款轻量级的 Web 服务器/反向代理及电子邮件代理服务器。其特点是占有内存少,并发能力强,异步的,多个连接(万级别)可以对应一个进程,进行响应。基于事件驱动模型。

Nginx 基础-单机Nginx性能优化

Nginx ,Apache ,Tomcat 的简单比较

Nginx

优点:负载均衡、反向代理、处理静态文件优势。

Apache

优点:Apache 是静态解析,适合静态 HTML 、图片等,处理速度较快。虽然处理速度不及 Nginx,但是 Apache 提供的组件比 Nginx 多。

缺点:属于同步多进程模型,一个连接对一个进程方式处理请求。在速度上和消耗来说,Apache 不能承受高并发,会导致宕机。

Tomcat

优点:处理动态请求,以线程的方式处理请求。

Nginx官方提供了Yum源安装

因为 Nginx 的一系列优点,所以已经慢慢成为主流的 Web 服务器。

添加源

这里讲一下 Nginx 的 Yum 安装方式,默认情况 Centos7 中无 Nginx 的源,最近发现 Nginx 官网提供了 Centos 的源地址。因此可以如下执行命令添加源:

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm复制代码

安装 Nginx

通过 yum search nginx 看是否已经添加源成功。如果成功则执行下列命令安装 Nginx。

sudo yum install -y nginx复制代码

启动 Nginx 并设置开机自动运行

sudo systemctl enable nginx.service
sudo systemctl start nginx.service
sudo systemctl restart nginx.service复制代码

添加第三方扩展模块

要知道,Nginx 本身集成模块是有局限性,所以有很多优秀的第三方模块开发者开源了一些方便实用的模块,提供给大家。

预处理安装环境

为了顺利的安装 Nginx 和它的扩展模块,我们需要预装下环境。

yum -y install libxml2 libxml2-dev libxslt-devel 
yum -y install gd-devel 
yum -y install perl-devel perl-ExtUtils-Embed 
yum -y install zip unzip复制代码

可编译 Nginx 下载

因为我们通过 Yum 下载的 Nginx 是无法重新编译的。所以需要下载 Nginx 可编译版本。

cd /usr/local/src
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -zxvf nginx-1.14.2.tar.gz复制代码

第三方模块下载

模块扩展的操作是一样的,首先确保 wget 命令可以使用,通过 wget 下载扩展文件到 /usr/local/src 文件夹、解压。

健康检查

在实际应用当中,如果你后端应用是能够快速重启的应用,比如 Nginx 的话,自带的模块是可以满足需求的。但是需要注意。如果后端有不健康节点,负载均衡器依然会先把该请求转发给该不健康节点,然后再转发给别的节点,这样就会浪费一次转发。

可是,如果当后端应用重启时,重启操作需要很久才能完成的时候就会有可能拖死整个负载均衡器。此时,由于无法准确判断节点健康状态,导致请求 handle 住,出现假死状态,最终整个负载均衡器上的所有节点都无法正常响应请求。

所以健康检查模块是非常重要的。nginxupstreamcheck_module-master 这个就是淘宝技术团队开发的 Nginx 模块 ,通过它可以用来检测后端 realserver 的健康状态。如果后端 realserver 不可用,则所有的请求就不会转发到该节点上。

模块下载、解压
wget -O /usr/local/src/nginx_upstream_check_module.zip https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master
unzip nginx_upstream_check_module.zip复制代码

interval 检测间隔时间,单位为毫秒,rsie 请求 2 次正常的话,标记此 realserver 的状态为 up,fall 表示请求 5 次都失败的情况下,标记此 realserver 的状态为 down,timeout 为超时时间,单位为毫秒。

检查规则配置示例:

upstream test {
    server [ip1]:[port1];
    server [ip2]:[port2];
    check interval=3000 rise=2 fall=5 timeout=1000;
}复制代码

清除缓存

我们为了加速网站的访问速度,所以很多时候需要缓存站点的静态文件,但是对于缓存时间的控制,我们不是很好把握。虽然都有配置过期时间,但是在有些测试的情况下,我们只想修改部分缓存,这时候我们可以使用 purge 模块来处理。

模块下载、解压
wget -O /usr/local/src/ngx_cache_purge-2.3.tar.gz  http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -zxvf ngx_cache_purge-2.3.tar.gz复制代码

ngxcachepurge 模块的作用:用于清除指定 url 的缓存。

缓存配置方式
#设置缓存空间,存储缓存文件
proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50g inactive=168h;

#在location中使用缓存空间
location /pathname { 
    proxy_set_header X-Real-IP $remote_addr;
    proxy_cache nginx-cache;
    proxy_cache_valid 200 304 302 5d;
    proxy_cache_valid any 5d;
    proxy_cache_key '$host:$server_port$request_uri';
    add_header X-Cache '$upstream_cache_status from $host';
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://localhost/pathname;
}复制代码
缓存清除方式

http://[ip:port]/purge #清除所有缓存文件
http://[ip:port]/purge/test #清除单个文件夹缓存
http://[ip:port]/purge/test/123.jpg #清除单个文件复制代码

Session保持

疑问:我们为什么要用到 Session 保持?

首先,我们采用分布式架构的时候,服务端的节点是很多的。Nginx 默认是无法保持 Session 会话的,所以当请求的服务端节点宕机的时候,我们需要重新登录。想想用户在下订单,结果一下子给跳到登录页去了,这时候你可以想想用户的脸色。Nginx 负载均衡时会遇到会话保持的问题,常用的方法有:

  1. ip hash,根据客户端的 IP,将请求分配到不同的服务器上
  2. cookie,服务器给客户端下发一个 cookie,具有特定 cookie 的请求会分配给它的发布者

sticky 是 nginx 的一个模块,它是基于 cookie 的一种 nginx 的负载均衡解决方案,通过分发和识别 cookie ,来使同一个客户端的请求落在同一台服务器上,默认标识名为 route。但是会导致一个问题,如果服务端节点宕机,那么将会出现服务无法提供的情况。

注意:cookie 需要浏览器支持,且有时候会泄露数据。

模块下载、解压
wget -O /usr/local/src/nginx-sticky-module.zip https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip
unzip -D nginx-sticky-module.zip复制代码
sticky使用方式

upstream test {
   sticky expires=1h domain=xxx.com path=/;
   server [ip1]:[port1];
   server [ip2]:[port2];
}复制代码
sticky 配置规则
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] 
    [hash=index|md5|sha1] [no_fallback] [secure] [httponly];

[name=route]       设置用来记录会话的cookie名称
[domain=.foo.bar]    设置cookie作用的域名
[path=/]          设置cookie作用的URL路径,默认根目录
[expires=1h]        设置cookie的生存期,默认不设置,浏览器关闭即失效,需要是大于1秒的值
[hash=index|md5|sha1]   设置cookie中服务器的标识是用明文还是使用md5值,默认使用md5
[no_fallback]       设置该项,当sticky的后端机器挂了以后,nginx返回502 (Bad Gateway or Proxy Error) ,而不转发到其他服务器,不建议设置
[secure]          设置启用安全的cookie,需要HTTPS支持
[httponly]         允许cookie不通过JS泄漏,没用过复制代码

吞吐量计算

实时统计网站的吞吐量,比较简单,没啥好说。这个主要观察下服务器的带宽、内存、硬盘等硬件资源能支撑多大压力。

模块下载、解压
wget -O /usr/local/src/traffic-accounting-nginx-module.zip https://github.com/Lax/traffic-accounting-nginx-module/archive/master.zip
unzip -D traffic-accounting-nginx-module.zip复制代码

动态扩容、缩容

在分布式服务下,我们会用 Nginx 做负载均衡。这里考虑几个问题:

  1. 网站上下线问题:单体应用更新站点的时候是直接覆盖文件,然后重启。这样会造成请求中断,如果是核心逻辑的请求中断,势必会影响数据的一致性,比如交易,订单等,后果比较严重。
  2. 动态加减机器,比如某个站点访问量大,要新增机器,那就需要修改 Nginx 的配置,然后 reload ,虽然 reload 很快,但是还是会有一瞬间的请求中断。

所以我们在不需要重启 Nginx 的基础上,动态修改 Nginx 的配置,将是需求。ngxdynamicupstream 模块很好的实现了上述功能。

模块下载、解压
wget -O /usr/local/src/ngx_dynamic_upstream.zip https://github.com/cubicdaiya/ngx_dynamic_upstream/archive/master.zip
unzip -D ngx_dynamic_upstream.zip复制代码

本模块 Github 学习地址:https://github.com/cubicdaiya/ngxdynamicupstream

环境配置

将上述模块进行统计的环境配置,然后编译安装。

cd /usr/local/src/nginx-1.14.2

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/usr/local/src/ngx_cache_purge-2.3 --add-module=/usr/local/src/nginx_upstream_check_module-master/ --add-module=/usr/local/src/nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ --add-module=/usr/local/src/ngx_dynamic_upstream-master  --add-module=/usr/local/src/traffic-accounting-nginx-module-master复制代码

编译加载

cd /usr/local/src/nginx-1.14.2
make -j2
cp /usr/sbin/nginx /usr/sbin/nginx.bak #备份
cp /opt/nginx-1.14.2/objs/nginx /usr/sbin/nginx #替换
systemctl restart nginx #重启 nginx 服务
nginx -t #检查配置文件
nginx -V #查看nginx环境
nginx -s reload #重载配置文件复制代码

我们直接通过 systemctl restart nginx 多少会影响到正常业务使用。所以推荐使用 Nginx 平滑升级

Basic 安全认证

如果直接将 Nginx 访问地址暴露出去,我们的服务配置全部可见,多少是有些不安全的。所以我们可以简单的配置一下 Basic 认证,将陌生访问者挡在外面。

yum -y install httpd-tools
htpasswd -c /etc/nginx/passwd.db pgy
#输入密码

# 使用示例
location / {
    auth_basic  "show me pass";
    auth_basic_user_file /etc/nginx/passwd.db;
}复制代码

有朋自远方来,不亦乐乎?
为提供更好的知识分享,欢迎提出建议、指正问题,博客:风流三月1,微信号是 pgy1607974129 ,公众号是“ Ygo 工作室”。复制代码

Ygo工作室

本文由风流三月1发布,微信号:pgy1607974129

猜你喜欢

转载自juejin.im/post/5e008d56f265da33942a8cef
今日推荐