创建diskless的nginx

缘由

所在产品用nginx做代理,由于技术架构的约束,导致系统磁盘故障变成了一个全局性故障(使用了统一的磁盘服务),所以希望nginx做代理时,当出现磁盘故障时,现有的流量转发不中断。

问题分析

nginx作为代理模式运行状态时,运行过程中存在读写磁盘的点如下:

  1. linux的swap机制,如果内存不够系统会将部分内存信息调度到磁盘中,如果磁盘故障后再次读取可能出现系统异常
  2. nginx的日志,包括access_log和error.log
  3. nginx代理模式下缓存磁盘选项

如上的磁盘读写点都需要消除掉

解决方案

swap关闭

  1. swapoff -a
  2. vim /etc/fstab,注释掉swap那一行

日志不直接落磁盘

初步思考有如下几个方案:

  • 修改nginx代码,将写磁盘改成异步方式,该方案存在修改点过多,不易维护的问题
  • 使用linux的内存作为磁盘,该方案需要解决磁盘耗用大的问题

从架构合理性上看选择方案2,从OS层面解决问题,避免侵入nginx代码和进程

  1. ** 挂载1G内存到nginx日志目录:**

mount -t tmpfs -o size=1G nginx_logs /usr/local/openresty/nginx/logs/
尝试写入超过1G大小的内容,可以看下目录空间大小是不会写超的
dd if=/dev/zero of=/var/log/log.file bs=1M count=2000

  1. ** 设置开机启动 **

vim /etc/fstab
添加 nginx_logs /usr/local/openresty/nginx/logs/ tmpfs defaults,size=1G,x-gvfs-show 0 0

  1. ** crontab中每隔一段时间切割日志,并归档 **

mv access.log /bakcup_dir/access.log.yy-mm-dd-hh-mm-ss
kill -USR1 $ngx_pid

消除代理报文缓存磁盘

需要根据自己的业务来识别是否存在缓存磁盘的应用,比如 proxy_buffering 需要改成 off

效果

通过上面的方案,可以消除掉nginx代理模式下对硬盘的依赖,当磁盘摘掉时,转发流量可以正常转发,日志写入失败(内存模拟磁盘空间有限),当然系统如果重启了是没法恢复流量的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值