文章目录
1.指定nginx 的运行身份
查看nginx的worker运行身份为nobody ,需要为其添加指定用户
useradd -d /usr/local/nginx -M -s /sbin/nologin nginx
修改nginx的配置文件,指定运行身份
vim /usr/local/nginx/conf/nginx.conf
重载nginx后查看worker的运行身份
2.优化性能相关的配置
worker进程的数量
worker进程的数量,通常应该为当前主机的cpu的物理核心数,查看当前主机的核心数量lscpu
修改配置文件中的worker数量为自动获取
vim /usr/local/nginx/conf/nginx.conf
重载nginx后查看worker运行数量,发现数量cpu数量一致了。
worker 进程绑定到指定cpu
将worker进程绑定到指定cpu上,可以提高缓存命中率
worker_cpu_affinity 0001 0010 0100 1000; 分别将worker进程绑定到1,2,3,4号CPU上
编辑配置文件
vim /usr/local/nginx/conf/nginx.conf
控制nginx的最大连接数
单个进程允许的最大连接数需要根据服务器性能和内存使用量作相应的调整。进程的最大连接数又受到linux系统进程的最大打开文件数限制。所以nginx的最大总并发连接数=worker 数量 * 单个进程最大连接数
修改连接数
vim /usr/local/nginx/conf/nginx.conf
再修改linux系统所限制的最大连接数,数量一般应大于所申请数。
vim /etc/security/limits.conf
一个应用程序能开启的最大连接数是受到限制的,内核限制>系统限制>应用软件限制。
查看内科支持的最大文件打开数
sysctl -a | grep file
查看系统支持的最大文件打开数
ulimit -a
3.nginx 平滑升级
nginx 方便地帮助我们实现了平滑升级。其原理简单概括,就是:
(1)在不停掉老进程的情况下,启动新进程。
(2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。
(3)新进程接受新请求。
(4)老进程处理完所有请求,关闭所有连接后,停止。
下载新版本 nginx,解压, 准备进行源码编译,
[root@server1 ~]# tar zxf nginx-1.21.1.tar.gz
[root@server1 ~]# cd nginx-1.21.1/auto
[root@server1 auto]# vim cc/gcc ##轻量化编译,注释掉debug
进行预编译和正式编译,原有的参数不能少,假如想添加其他新模块,,直接在后面添加相关配置参数即可。只编译,不安装,
[root@server1 nginx-1.21.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[root@server1 nginx-1.21.1]# make
备份原nginx二进制文件,期间nginx不会停止服务,将新编辑的二进制序覆盖掉原来安装路径下的nginx.
[root@server1 nginx-1.21.1]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
[root@server1 nginx-1.21.1]# cp -f objs/nginx /usr/local/nginx/sbin/
然后查看只有老进程在工作,在新版本的编译目录中给nginx发送平滑迁移信号。
[root@server1 nginx-1.21.1]# kill -USR2 14408 ##老版本的masterPID
新版本的master和worker 已经和就版本同时存在,
关闭旧的nginx工作进程
[root@server1 nginx-1.21.1]# kill -WINCH 14408 ##老版本的masterPID
可以看到旧的工作进程已经被关闭,只剩下旧的主进程与新的工作进程同时存在,此时访问已经是新版本
再结束旧的主进程
[root@server1 nginx-1.21.1]# kill -QUIT 14408##老版本的masterPID
再次观查,只有新的主进程和工作进程;
注意:之前的master进程不要结束掉,万一新版本有问题,可以回滚,等新版本确认没有问题了,在结束掉
命令 | 作用 |
---|---|
kill -USR2 进程号 | 不再让worker进程接受请求,当前请求处理完就让worker进程退出 |
kill -WINCH 进程号 | 处理完关闭 |
kill-HUP 进程号 | 启动进程 |
4.版本回退
与版本升级一样,将旧版本的二进制应用文件替换新版本的,这里使用之前备份的老版本直接覆盖。
[root@server1 nginx-1.21.1]# cp -f /usr/local/nginx/sbin/nginx_old nginx
[root@server1 sbin]# kill -HUP 19715 ##旧版本的PID
当旧版本已经被关闭,ps查询不到时,
[root@server1 objs]# kill -USR2 2113 3##新版本的PID
就可以拉起旧版本的worker进程
新版本的master和worker 已经和就版本同时存在,
关闭新的nginx工作进程
[root@server1 sbin]# kill -WINCH 19715##当前版本的PID
nginx 负载均衡
1、轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
http {
#......
upstream backserver {
server 172.25.1.2;
server 172.25.1.3;
}
server {
listen 80;
server_name www.erqian.org;
location / {
proxy_pass http://backserver;
}
}
测试访问
2、权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的
情况。
upstream backserver {
server 172.25.1.2 weight=3;
server 172.25.1.3;
}
测试访问
权重越高,在被访问的概率越大
3.ip_hash
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 172.25.1.2;
server 172.25.1.3;
}
4.基于cookie的负载均衡
通过nginx的拓展模块nginx-sticky-module实现。
安装插件,重新编译。
[root@server1 nginx-1.20.1]# unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
[root@server1 nginx-1.20.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
[root@server1 nginx-1.20.1]# \cp -f objs/nginx /usr/local/nginx/sbin/nginx
编辑配置文件
浏览器访问会一直保持server2
删除掉cookie直后刷新,访问server3
资源访问的控制
1.最大连接数限制
修改配置文件,nginx中通过limit_comm_zone 和limit_req_zone两个组建来对客户端访问目录和文件的访问平吕和次数进行限制,
编辑配置文件,
limit_conn_zone $binary_remote_addr zone=addr:10m;
##定义两个参数,生成一个大小为10M,名字为addr的内存区域,连接数为第二个参数。编写指令模块。
重载测试,在html下新建一个download共享目录,里面放一张图片用来做访问测试。
[root@server1 ~]# mkdir /usr/local/nginx/html/download
[root@server1 ~]# mv 777.jpg /usr/local/nginx/html/download/
浏览器里访问成功
压力测试
[erqian@erqian Desktop]$ ab -c100 -n 100 http://172.25.1.1/download/777.jpg
2.限制请求率
速率限制可用于防止 DDoS(分布式拒绝服务攻击) 攻击,或防止上游服务器同时被过多请求淹没。该方法基于以下leaky bucket
算法:请求以各种速率到达存储桶并以固定速率离开存储桶。
修改配置文件,用limit_req_zone 指令设置参数,设置允许相同标识的客户端的访问频次,这里限制的是每秒1次
ab -c 10000 -n 100000 http://www.baidu.com
-c表示并发用户数
-n表示请求总数
重载,做压测,当一个用户同时发送10个请求时,只能响应1个。
NGINX 中这种过多的请求可以被缓冲和处理。limit_req 指令的burst参数设置等待以指定速率处理的最大请求数,超出zone限制的请求会被放入队列中
做压测,一个用户访问10次,
3.限制带宽
用limit_rate 指令:限制每个连接的带宽
我们的测试图片大小为 72 k,限制带宽为70k
重载做压测
4.自动索引:下载方便
当访问location时未指定路径,且路径下无主页文件时,开启自动索引将会显示该location的目录结构
重载,用浏览器访问
5.中文乱码
我们在默认发布页面写入中文,用浏览器访问会出现乱码
[root@server1 ~]# echo 中文乱码 > /usr/local/nginx/html/index.html
修改配置文件,加入中文支持后,清除浏览器缓存重新访问
6.nginx expire缓存配置
缓存可以降低网站带宽,加速用户访问,对图片等大文件可以进行缓存
编辑配置文件,在http{}里添加缓存部分即可,对gif或者jpg等大文件进行缓存,加快访问速度。
location ~ .*\.(gif|jpg|png)$ {
expires 365d;##对图片缓存365天。
root html;
}
访问测试,可以看到缓存时间为一年。
## 7.日志轮询
当日志文件不断增长的时候,就需要定时切割,否则,写日志的速度和性能也会下降,更不便于我们归档,查询。
编写脚本用于记录日志,每24小时即一天记录一次日志
[root@server1 ~]# cd /opt/
[root@server1 opt]# vim nginxlog.sh
[root@server1 opt]# date
Wed Sep 8 22:53:26 CST 2021
[root@server1 opt]# cat nginxlog.sh
#!/bin/bash
cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
ll -USR1 `cat /usr/local/nginx/logs/nginx.pid` ##重新生成日至文件
[root@server1 opt]# chmod +x nginxlog.sh ##给脚本执行权限
运行脚本程序
[root@server1 logs]# sh /opt/nginxlog.sh
7 禁用不必要的日志
访问图片等文件时,不记录日志,节省磁盘空间
重新访问一次,没有生成新的日志