Linux企业化运维
实验所用系统为Redhat-rhel7.6。
目录
Linux企业化运维–nginx之并发优化、负载均衡+反向代理、平滑升级、算法扩展、限流、配置管理、重定向、防盗链
一、并发优化
ulimit -a 可以查看用户可以打开文件的限制 ##open files
sysctl -a | grep file ##打开文件的限制
///fs.file-max = 183593
free -m
二、负载均衡+反向代理
1、默认轮询
本实验需要打开另外两台快照主机。
在server1
上做负载均衡
和反向代理
,检测语法
,重启服务
,将本机配置好的nginx复制
到server2
主机。
cd /usr/local/nginx/conf/
vim nginx.conf ##编辑配置文件
///
http {
upstream westos { ##负载均衡器upstream
server 172.25.24.2:80;
server 172.25.24.3:80;
}
server {
listen 80;
server_name www.westos.org;
location / {
proxy_pass http://westos; ##反向代理器proxy_pass
}
}
}##注意此处http的后括号
///
nginx -t
nginx -s reload
cd ..
cd ..(local)
scp -r nginx/ server2:/usr/local/ ##将本机配置好的nginx复制到server2主机
此时在server2
主机上,建立软链接以便全局使用
nginx,编辑配置文件,将server1中的设定修改回默认值
,写入发布内容,在本次尝试是否能访问。
###server2
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ ##建立软链接以便全局使用nginx
cd /usr/local/nginx/sbin/
ls
cd ..(nginx)
cd conf/
vim nginx.conf
///
#user nobody; ##注释掉
worker_processes auto;
events {
worker_connections 1024; ##改回默认
}
///
nginx -t ##检测语法
cd ..(nginx)
cd html/
ls
echo server2 > index.html
nginx
curl localhost ##显示server2
server3
主机做相同操作,结果如下。
此时在真机上对快照进行地址解析
,ping
通www.westos.org之后便可以使用curl
命令查看server主机
的发布文件。
###真机
vim /etc/hosts
///
172.25.24.1 server1 www.westos.org
172.25.24.2 server2
172.25.24.3 server3
172.25.24.4 server4
172.25.24.5 server5
172.25.24.6 server6
172.25.24.7 server7
172.25.24.8 server8
172.25.24.9 server9
172.25.24.10 server10
///
ping www.westos.org
curl www.westos.org
##此时server2和server3交替出现,频率相同
2、改变权重,默认为1
在server1
主机中修改配置文件,增加server2主机的权重
,检测语法,重启服务。
###server1------改变权重
cd /usr/local/nginx/conf/
vim nginx.conf
///
http {
upstream westos {
server 172.25.24.2:80 weight=2; ##增加权重
///
nginx -t
nginx -s reload
在真机上作测试时,server2
和server3
主机则几乎与权重等比出现。
###真机
权重大的则等比显示
3、ip_hash
ip_hash
对后端做健康检测,如果server3
出问题,则调度server2
(###模拟问题server3 nginx -s stop)
如果后端全挂,则http报错502
(500表示服务器错误)
在server1
主机中修改配置文件,在负载均衡
模块中添加ip_hash
,检测语法,重启服务。
vim nginx.conf
///
http {
upstream westos {
ip_hash;
///
nginx -t
nginx -s reload
在server3
主机中关闭nginx
服务,以模仿后端该主机出现问题的情况,此时在真机做检测时,则只有server2
主机的发布文件。
###server3
nginx -s stop
###真机
只有server2
当server2
主机也出现问题时,真机则会报错502
,显示服务器错误。
###server2
nginx -s stop
###真机
502
4、备用机
当所有后端主机都出现问题时,备用机可以暂时运行,但是风险很高,需要及时修理后端服务器。
在server1
主机中设定负载均衡中本机可以作为备用机,检测语法,重启服务。同时编辑发布文件。
vim nginx.conf
///
http {
# ip_hash; ##注释
server localhost:80 backup; ##备用机
///
nginx -t
nginx -s reload
cd ..
cd html/
ls
echo helloworld > index.html
当两台后端服务器都不能使用时,则显示server1
备用机的发布文件。
###真机
curl www.westos.org ##helloworld
如果后端主机恢复,则不会访问备用机。
三、平滑升级
- 版本升级
当服务器在运行时,需要升级的情况下,平滑升级即就是不断开服务器就可以进行升级,最大限度保证数据的完整性。
在server1主机中,修改配置文件,设定工作进程数为2,安装一个比当前版本高的nginx,重新编译(configure--makefile--make
三步曲)。
下载nginx新版本软件,正常执行./configure
和make
但不要执行make install
。
##server1
cd /usr/local/nginx/conf/
vim nginx.conf
///
user nginx;
worker_processes 2; ##设定工作进程数为2
worker_cpu_affinity 01 10;
///
nginx -s reload
cd
lftp 172.25.254.250
> ls
> cd pub/docs/lamp/
> get nginx-1.21.1.tar.gz ##获取安装包(可以在网络上下载)
> exit
tar zxf nginx-1.21.1.tar.gz
cd nginx-1.21.1/
ls
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio ##重新编译
make
之后备份旧程序,并拷贝新程序。
make
cd objs/
ls-->nginx
cd /usr/local/nginx/sbin/
ls-->nginx
cp nginx nginx.old ##备份原程序
cd
cd nginx-1.21.1/
ls
cd objs/
\cp -f nginx /usr/local/nginx/sbin/ ##拷贝新程序
获取当前nginx主进程pid,即master
进程。开启新版本。关闭worker
进程但保留主进程master
。
ps ax | grep nginx ##获取当前nginx主进程pid,即master进程
kill -USR2 22602 ##开启新版本
ps ax | grep nginx
curl localhost -I ##显示新版本号
kill -WINCH 22602 ##关闭worker进程但保留主进程
因为有时候我们会发现新版本并没有旧版本用着顺手,那么关闭worker进程但保留主进程就是为了回退
,即就是关闭工作端worker
,保留master
。
ps ax | grep nginx
curl localhost -I ##此时依旧显示新版本号
- 版本回退
回退的过程是相反的,先还原nginx程序,唤醒原进程,回收新版本,并且关闭。
cd /usr/local/nginx/sbin/
ls
\cp -f nginx.old nginx ##还原nginx程序
kill -HUP 22602 ##唤醒原进程
ps ax | grep nginx
kill -WINCH 1040 ##回收新版本的worker进程
kill -QUIT 1040 ##关闭新版本主进程
ps ax | grep nginx
curl localhost -I
四、算法扩展
有时nginx并不支持一些算法,当我们需要使用时,则需要进行扩展。
比如sticky
模块,nginx
本身不支持,当在配置文件中写入并调用时,会报错。
cd /usr/local/nginc/conf
vim nginx.conf
///
http {
upstream westos {
sticky;
server 172.25.24.2:80 weight=2;
///
nginx -t ##失败,因为sticky不支持,需进行扩展
所以我们需要对nginx
进行扩展,先将sticky
注释掉,并停止服务。
在配置文件中注释掉sticky;
nginx -t
nginx -s stop
我通过lftp
下载sticky
软件包,所以需要在真机对其进行火墙策略的设定。
iptables -t nat -I POSTROUTING -s 172.25.24.0/24 -j MASQUERADE ##火墙策略(真机)
cd
lftp 172.25.254.250
> ls
> cd pub/docs/lamp/
> get nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
> exit
ls
此时需要对软件包解压,方便起见,安装解压软件并解压sticky
软件包。
yum install -y unzip
unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
ls
安装好之后切入nginx
目录,清理缓存,执行configure->make
。
cd nginx-1.20.1/
make clean ##清理缓存
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
make
将nginx
复制到sbin
并覆盖,切入配置目录,编辑配置文件,取消对sticky
的注释并检测语法,但是此时sticky
模块会与backup
冲突,所以检测失败。
ls
cd objs/
\cp -f nginx /usr/local/nginx/sbin/ ##复制覆盖文件,\表示告诉shell不要去查alias,直接执行原本的cp
vim nginx.conf
nginx -t
需要将之前的设定注释或删掉,重新检测语法,并开启服务。
vim nginx.conf
///
http {
upstream westos {
sticky;
server 172.25.24.2:80;
server 172.25.24.3:80;
#server localhost:80 backup;
///
nginx -t
nginx
五 、nginx限流
实验素材:
先建立一个目录用于存放实验素材。
cd html/
mkdir download
cd download/
lftp 172.25.254.250
> ls
> cd pub/docs/
> get vim.jpg
> exit
du -h vim.jpg ##444K
1、限制并发连接数
在真机执行压力测试命令,设定并发用户数为10,请求总数为10,则失败了4个。
###真机
ab -c10 -n 10 http://172.25.24.1/download/vim.jpg ##并发用户数为10,请求总数为10,失败4个
在server1主机中设定访问下载链接时,受到控制,重启服务。
cd /usr/local/nginx/conf/
vim nginx.conf
///
#gzip on;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
...
location /download/ {
limit_conn addr 1;
}
///
nginx -s reload
重新在真机执行压力测试,因为被限流,所以大部分请求被拒绝。
###真机
ab -c10 -n 10 http://172.25.24.1/download/vim.jpg ##大部分被拒绝
2、限制每秒请求数
在真机执行压力测试,设定并发用户数为1,请求总数为10,则请求全部通过。
###真机
ab -c1 -n 10 http://172.25.24.1/download/vim.jpg ##全部通过
在server1主机中编辑配置文件,设定每秒只通过1个请求,重启服务。
###server1
vim nginx.conf
///
#gzip on;
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ##设定每秒只能通过一个请求
location /download/ {
limit_conn addr 1;
limit_req zone=one;
}
///
nginx -s reload
重新在真机执行压力测试,因为每秒只通过一个,则其余9个被拒绝。
###真机
ab -c1 -n 10 http://172.25.24.1/download/vim.jpg ##只通过一个
3、排队,超过指定数量则排队访问
在配置文件中设定一次访问5个,超过的排队等待,因为上一个实验设定每秒通过1个请求,则访问2次,差不多10秒。
vim nginx.conf
///
location /download/ {
limit_conn addr 1;
limit_req zone=one burst=5;
///
nginx -s reload
在真机中,执行压力测试,访问时长大约9秒。
###真机
ab -c1 -n 10 http://172.25.24.1/download/vim.jpg ##时间较久,差不多9秒
[注意] 在真实情况下,偏差在几台主机的情况是可以忽略不计的。
4、无延迟
编辑配置文件,设定请求无延迟,在上一个实验的情况下,只能执行1次,即5个请求,重启服务。
vim nginx.conf
///
location /download/ {
limit_conn addr 1;
limit_req zone=one burst=5 nodelay;
///
nginx -s reload
在真机中,执行压力测试,只能通过5个,其余被拒绝。
###真机
ab -c1 -n 10 http://172.25.24.1/download/vim.jpg
5、限制带宽
现实生活中,我们下载东西时,会被限制网速,其实就是限制带宽。
在配置文件中设定带宽50k,重启服务,注释掉上面实验的参数,不然会很慢。
vim nginx.conf
///
location /download/ {
limit_conn addr 1;
#limit_req zone=one burst=5 nodelay; ##注释掉这条,不然会很慢
limit_rate 50k;
///
nginx -s reload
在真机中执行压力测试,文件大小为444k,访问10次,限制带宽50k,大概需要80s。
###真机
ab -c1 -n 10 http://172.25.24.1/download/vim.jpg
六、nginx配置管理
1、自动索引
可以在浏览器访问,下载软件更方便。
在配置文件中设定自动索引,注意注释上文参数设定,重启服务。
vim nginx.conf
///
location /download/ {
limit_conn addr 1;
#limit_req zone=one burst=5 nodelay;
#limit_rate 50k; ##注释
autoindex.on;
///
nginx -s reload
在浏览器中访问,可以打开server1
主机的指定目录。
在浏览器访问
172.25.24.1/download
2、nginx expire 缓存配置
缓存可以降低网站带宽,加速用户访问。
编辑配置文件,设定对图片等进行缓存,缓存时间为1年,在此期间访问就会减少访问时间。
vim nginx.conf
///
location /download/ {
limit_conn addr 1;
#limit_req zone=one burst=5 nodelay;
#limit_rate 50k;
autoindex on;
} ##在此位置下方进行设定
location ~ .*\.(gif|jpg|png)$ { ##对图片等进行缓存
expires 365d;
root html;
}
///
nginx -s reload
在真机中,使用curl
命令访问素材文件,可以看到缓存至2022年。
###真机
curl -I 172.25.24.1/download/vim.jpg
///Expires: Thu, 01 Sep 2022 04:53:01 GMT
3、日志轮询
编写一个脚本,设定打开nginx
时会生成日志文件,命名格式为前一天。
cd /opt/ ##第三方软件安装位置
vim nginx.sh
///
#!/bin/bash
cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
///
给脚本执行权限,执行脚本,切入到日志目录,产生日志。
chmod +x nginx.sh
./nginx.sh
cd /usr/local/nginx/logs/
ls --> access_2021-08-31.log ##生成日志
4、禁用不必要的日志记录,以节省磁盘IO的消耗
在配置文件中设定禁用浏览器访问指定目录时生成日志文件。
cd ..(nginx)
cd conf/
vim nginx.conf
///
location ~ .*\.(gif|jpg|png)$ {
expires 365d;
root html;
} ##在这个位置的下面加入设定
location /status {
stub_status on;
access_log off;
}
///
nginx -t
nginx -s reload
此时在浏览器中访问该目录,在日志目录中不会生成日志记录。
在浏览器访问
172.25.24.1/status ##刷新会增加访问次数,但不会有日志生成
cd ../logs
ls
cat access.log ##为空
但当在真机中使用curl
命令访问该目录时,会产生日志文件。
###真机
curl -I 172.25.24.1/status
###server1
cat access.log ##会产生日志文件
5、站点目录和文件的限制
在配置文件中设定指定目录只能本机访问,拒绝其他所有请求。
cd conf/
vim nginx.conf
///
location /status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
///
nginx -t
nginx -s reload
当在真机访问status
目录时,拒绝访问,报错403
,资源不可用,服务器理解客户的请求,但拒绝处理。
###真机
curl 172.25.24.1/status ##拒绝访问
当在server1
本机访问时,允许访问。
###server1
curl localhost/status
6、中文乱码
nginx
默认不支持中文字符,在浏览器访问时,中文会变成乱码。
在nginx发布文件中加入一行中文,在浏览器中试访问,为乱码。
cd ..(nginx)
cd html/
vim index.html
///
helloworld
欢迎
///
#在浏览器访问时中文是乱码
但是在server1
本机中,可以使用curl
命令查看本地的发布文件,是可以正常显示中文的。
编辑配置文件,设定nginx
支持中文字符,并重启服务。
vim nginx.conf
///
server {
listen 80;
server_name localhost;
charset utf-8;
///
nginx -s reload
此时在浏览器中访问172.25.24.1,可以看到中文正常显示。
在真机中对server1
主机进行地址解析,使用curl
命令访问时,也可以看到发布文件。
在真机做地址解析
vim /etc/hosts
///
172.25.24.1 server1 www.westos.org reg.westos.org
///
curl reg.westos.org
七、nginx 重定向
1、防止域名恶意解析到服务器IP
1)拒绝访问,报错500
切入配置目录,编辑配置文件,设定在访问本机时,返回500,重启服务。此时使用curl
命令访问本机,会显示http报错500。
cd /usr/local/nginx/conf/
vim nginx.conf
///
server {
listen 80;
server_name localhost;
return 500;
///
nginx -s reload
curl -I localhost ##HTTP/1.1 500 Internal Server Error
当在浏览器中访问server1主机时,也会报错500。
172.25.24.1--->500 Internal Server Error
2)将所有访问重定向至指定域名
编辑配置文件,设定将所有访问请求重定向至指定域名,重启服务。此时使用curl
命令访问本机,会显示访问地址为http://www.westos.org
。
vim nginx.conf
///
server {
listen 80;
server_name localhost;
rewrite ^(.*) http://www.westos.org permanent;
///
nginx -s reload
curl -I localhost ##Location: http://www.westos.org
当在浏览器中访问server1
主机时,写入172.25.24.1
回车后会自动跳转至www.westos.org
。
2、端口重定向
编辑配置文件,将80端口定向到443端口。
vim nginx.conf
///
server {
listen 443 ssl;
server_name www.westos.org;
ssl_certificate cert.pem;
ssl_certificate_key cert.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.westos.org;
rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
#location / {
# proxy_pass http://westos;
# }
}
///
生成证书,并移动到配置目录中,检测语法,重启服务。此时检测端口。
cd /etc/pki/tls/certs
make cert.pem ##生成证书
mv cert.pem /usr/local/nginx/conf
nginx -t
nginx -s reload
netstat -antlup | grep 443
在浏览器中访问server1主机,可以看到https即代表443端口重定向成功。
172.25.24.1/index.html--->https://172.25.24.1/index.html
在真机中使用curl命令,可以看到加密端口已打开。
curl -I www.westos.org/
curl -I www.westos.org/index.html
3、虚拟主机重定向
1)www.westos.org 重定向bbs.westos.org
cd ..(nginx)
cd html
mkdir bbs
mv bbs/ /
vim nginx.conf
///
server {
listen 80;
server_name www.westos.org;
#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
rewrite ^/bbs$ http://bbs.westos.org permanent;
##^/bbs$表示匹配以/开头,bbs结尾,,比如www.westos.org/bbs,如果后加其他url,则不能重定向
rewrite ^/(.*)$ http://bbs.westos.org/$1 permanent;
##^/(.*)$表示匹配以/开头,$结尾,后面可以加url,比如www.westos.org/bbs/bbs.html
#location / {
# proxy_pass http://westos;
# }
}
server {
listen 80;
server_name bbs.westos.org;
location / {
root /bbs;
index index.html;
}
}
///
nginx -s reload
在真机使用curl
命令可以查看。
curl -I www.westos.org/bbs/bbs.html
浏览器输入www.westos.org
会自动跳转为bbs.westos.org
。
2)bbs.westos.org 重定向www.westos.org
vim nginx.conf
///
server {
listen 80;
server_name www.westos.org;
#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
#rewrite ^/bbs$ http://bbs.westos.org permanent;
#rewrite ^/(.*)$ http://bbs.westos.org/$1 permanent;
if ($host = "bbs.westos.org") {
rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;
}
#server { ##全部注释
# listen 80;
# server_name bbs.westos.org;
#
# location / {
# root /bbs;
# index index.html;
# }
# }
///
nginx -s reload
在真机先做地址解析,使用curl
命令可以查看。
vim /etc/hosts
///
172.25.24.1 server1 www.westos.org reg.westos.org bbs.westos.org
///
curl -I bbs.westos.org
在浏览器中输入bbs.westos.org
会自动跳转至www.westos.org/bbs
。
八、防盗链
为了防止图片被恶意盗取
1、server2盗取server1的图片
在server2
中编辑一发布文件,写入访问该文件时,盗取server1
主机中的某一图片。
###server2
cd /usr/local/nginx/html
vim test.html ##盗链文件,盗取server1主机的图片
///
<html>
<body>
<img src = "http://www.westos.org/download/vim.jpg">
</body>
</html>
///
此时在真机浏览器中可以直接访问server1
的图片,也可以也可以通过访问server2
,访问到server1
主机的图片。
172.25.24.1/download/vim.jpg
172.25.24.2/test.html
2、设定防盗链
在server1的配置文件中设定当被访问时,返回403报错或者显示指定防盗链图片,重启服务。
###server1
vim nginx.conf
///
server {
listen 80;
server_name www.westos.org;
location ~ \.(jpg|png)$ {
valid_referers none blocked www.westos.org;
if ($invalid_referer) {
#return 403; ##返回403
rewrite ^/ http://172.25.24.2/daolian.jpg; ##显示指定图片
}
}
///
nginx -s reload
在真机浏览器进行测试
172.25.24.2/test.html-->指定图片