运维实战 Nginx配置优化

运维实战 Nginx配置优化

  • Nginx并发优化
  • Nginx平滑升级
  • Nginx限流
      • 控制单IP并发连接数
      • 限制单位时间内的请求数目和速度
  • Nginx配置管理
    • 自动索引
    • Nginx Expire缓存配置
    • 日志轮询
    • IP访问限制
    • 禁用不必要的日志记录,节约磁盘IO的消耗
    • 站点目录和文件的限制
    • 解决中文乱码问题
    • Nginx重定向
    • 防盗链
  • Goaccess 日志可视化
    • 软件安装
    • 简单使用

Nginx并发优化

##修改worker进程数提高并发
##修改CPU使用情况,也可以使用auto
worker_processes  2;
worker_cpu_affinity 01 10;

##单个工作进程并发连接数
worker_connections

nginx作为http服务器时:
max_clients = worker_processes * worker_connections
nginx作为反向代理服务器时:
max_clients = worker_processes * worker_connections/2

##使用epoll模型
use epoll;

##开启文件高效传输模式
##同时设置tcp_nopush和tcp_nodelay为on
##可以防止网路和磁盘IO阻塞
sendfile on;
tcp_nopush on; 
tcp_nodelay on;	


##修改用户进程打开文件数限制
/etc/security/limits.conf
nginx - nofile 65535
##Linux系统级的最大打开文件数限制
##需要注意的是这一条设置与计算机的物理内存有关,不能随便设置
fs.file-max = 188414

##修改网络内核对TCP连接的有关限制
net.ipv4.ip_local_port_range = 1024	65535
##限制接收新TCP连接侦听队列的大小
net.core.somaxconn = 2048
##启用tcp连接timewait快速回收和重用
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

NGINX为什么比apache快

涉及五种IO复用,可以自行查看.

Nginx平滑升级

首先需要明确的概念:

虽然之前我们有使用过systemctl reload nginx等功能.

但实际上reload也是需要时间重载的,虽然更短但依旧需要时间.

所以能够进行平滑升级的情况下自然还是平滑升级更好.

  • 下载nginx新版本软件 正确执行./configuremake, 但并不进行make install

  • 备份原程序

cd /usr/local/lnmp/nginx/sbin
cp nginx nginx.old
  • 拷贝新程序:
cd nginx-1.19.1/objs
cp -f nginx /usr/local/lnmp/nginx
  • 运行新的二进制文件并查看进程状态
nginx
ps ax | grep nginx
##正常情况下新旧版本应该都可以看到
  • 关闭旧版本
kill -USR2 3216
kill -WINCH 3216

运行-USR2时旧的Nginx主进程将会把自己的进程文件改名为.oldbin, 然后执行新版 Nginx. 新旧Nginx会同市运行, 共同处理请求

而运行-WINCH后旧的工作进程就都会随着任务执行完毕而退出, 新版的Nginx的工作进程会逐渐取代旧版工作进程.

需要注意的是,这时主进程依旧会保留,方便进行回滚等操作

  • 回滚时的方法
kill -HUP 3216
kill -WINCH [新进程号]
kill -9 [新进程号]

额外的优化点

软件升级除了增加新功能以外很多时候是在修复bug

旧版本的bug可能会被人利用而危害到工作环境

因此对访问/嗅探隐藏版本号也算一个优化点

Nginx限流

控制单IP并发连接数

vim /usr/local/nginx/conf/nginx.conf

http {
     
     upstream linux {
     
     sticky;
     server 172.25.5.1:80;
     server 172.25.5.1:80;
     }

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
     
	location /dowload/ {
     
		limit_conn addr 1;
		limit_rate 50k;
        }
	}

上文中的做法:

$binary_remote_addr表示通过remote_addr这个标识来做限制

zone=addr:10m表示生成一个大小为10M,名字为addr的内存区域

limit_conn addr限制并发数,这里限制并发数为1

limit_rate限制带宽,这里为50K

限制单位时间内的请求数目和速度

##rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次
http {
     
	limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}


server {
     
	location / {
     
       limit_req zone=one;
		#limit_req zone=one burst=5
		#limit_req zone=one burst=5 nodelay;
	}
}

Nginx配置管理

自动索引

当打开服务器中存在的目录时自动生成目录下文件索引并显示,方便下载和浏览

location / {
     
	autoindex on;
}

Nginx Expire缓存配置

对于静态文件而言,使用缓存可以明显降低网站带宽,起到加速用户访问的效果

##对于html路径下的所有图片作缓存,保存365天
location ~ .*\.(gif|jpg|png)$ {
     
	expires 365d;
	root /html;
}

日志轮询

对于业务环境而言,对于Nginx的访问量是巨大的,因此创建的日志所占用的磁盘空间也是巨大的.

定时进行日志轮询和持久花存储可以对日志的存储和查看起到一定的帮助.

##编写日志轮询备份的脚本
vim nginxlog.sh

#!/bin/bash
cd /usrlocal/nginx/logs && mv access.log access_$(date + %F -d -1days).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

实际上干了两件事:

  • 将当前日志重命名为昨天的日志, $(date + %F -d -1days)的含义就是这样
  • 重新创建日志文件
##设定定时任务
##实现每天午夜12点备份昨天的日志
chmod +x /mnt/nginxlog.sh
00 00 * * * /mnt/nginxlog.sh &> /dev/null

##安全起见,不给予日志目录过高的访问权限
chmod -R 700 /usr/local/nginx/logs

IP访问限制

location / {
     
	deny 172.25.5.2;
	allow 172.25.5.250;
	deny all;
}

if ($remote_addr = 172.25.5.254) {
     
	return 403;
}

##两端代码的意思分别为
阻止172.25.5.2访问,允许172.25.5.250访问
阻止其他所有IP访问

如果访问IP为172.25.5.254,返回403页面

禁用不必要的日志记录,节约磁盘IO的消耗

location ~ .*\.(js|jpg|jpeg|png|css|bmp|gif)$ {
     
	access_log off
}
##就如同写的一样,当请求为后续这些文件格式结尾时,不记录日志

站点目录和文件的限制

location ~ ^/images/.*\.(sh|php)$ {
     
	deny all;
}
##访问image目录下的sh/PHP等可执行文件时拒绝,为了避免注入运行的攻击手段

##当然,同样的语法也可以用来做权限控制
location ~ ^/images/.*\.(sh|php)$ {
     
	allow 172.25.5.250;
	deny all;
}
##这样就实现了宿主机(172.25.5.250)可以运行images目录下的sh和PHP文件
##而除此以外的所有人不能

解决中文乱码问题

虽然一般来说中文设置都是网站开发人员在做开发时定义好的,但是Nginx依旧提供了这个功能.

与其说是解决中文乱码问题不如说是更换nginx字符集的方法.

# vim /usr/local/nginx/conf/nginx.conf
charset utf-8

Nginx重定向

通过进行访问重定向, 可以防止域名恶意解析到服务器IP

server {
      
	listen 80; 
	server_name www.linux.org; 
	return 500; 
}

##也可以这样写
server {
      
	listen 80; 
	server_name www.linux.org; 
	rewrite ^(.*) http://www.linux.com permanent;
}
  • 前者将访问www.linux.org的请求全部返回了500
  • 后者则将访问请求跳转到了www.linux.com,避免对原本访问地址的压力

同理,我们可以用它来实现一些业务上的需求

##80重定向443,实现自动访问加密
server {
     
	listen 80;
	server_name www.linux.org;
	rewrite ^/(.*)$ https://www.linux.org/$1 permanent;
}

##业务域名跳转

##www.linux.org/bbs 重定向 bbs.linux.org
server {
     
	listen 80;
	server_name www.linux.org;
	rewrite ^/bbs$ http://bbs.linux.org permanent;
	rewrite ^/bbs/(.*)$ http://bbs.linux.org/$1 permanent;
	location / {
     
		root  /web1;
		index   index.html;
	}
}

server {
     
	listen 80;
	server_name bbs.linux.org;
	location / {
     
		root  /bbs;
		index   index.html;
	}
}

##bbs.linux.org 重定向 www.linux.org/bbs
server {
     
	listen 80;
	server_name www.linux.org bbs.linux.org;
	if ($host = "bbs.linux.org"){
     
		rewrite ^/(.*)$ http://www.linux.org/bbs/$1 permanent;
	}
	
	location / {
     
		root  /web1;
		index   index.html;
	}
}

防盗链

##第一种方式
server {
     
	listen 80;
	server_name     www.linux.org;
	location ~ \.(jpg|png)$ {
     
		valid_referers none blocked www.linux.org;
		if ($invalid_referer) {
     
			return 403;
			}
		}
}

##第二种方式
server {
     
	listen 80;
	server_name     www.linux.org;
	location ~ \.(jpg|png)$ {
     
		valid_referers none blocked www.linux.org;
		if ($invalid_referer) {
     
			rewrite ^/ http://172.25.5.3/daolian.jpg;
			}
		}
}

valid_referers 指令

语法: valid_referers none|blocked|server_names string ...;
默认值: no
使用字段: server, location
功能: 此指令在 referer头的基础上为 $invalid_referer 变量赋值, 可以实现简单的防盗链功能 
如果 valid_referers列表中没有匹配Referer请求头, $invalid_referer将被设置为1, 否则为0(或空值)

参数:
none
    请求头中不存在 Referer字段('空值', 比如直接在浏览器打开一个图片URI)
blocked
    请求头中存在 Referer字段, 但值不是以"http(s)://"开头的字符串(被防火墙或代理服务器修改删除)
server_names
     Referer字段包含服务器名称
arbitrary string
    定义服务器名称和可选 URI前缀, 服务器名称的开头或结尾可以有一个"*"
regular expression
    使用正则匹配, 第一个符号为"~"

Goaccess 日志可视化

软件安装

wget https://tar.goaccess.io/goaccess-1.4.tar.gz
tar -xzvf goaccess-1.4.tar.gz
cd goaccess-1.4/
./configure --enable-utf8 --enable-geoip=legacy
make
make install

简单使用

goaccess access.log -o /usr/local/nginx/html/report.html --log-format=COMBINED --real-time-html

运维实战 Nginx配置优化_第1张图片

你可能感兴趣的:(运维实战,LNMP架构,企业架构)