目录
1、反向代理
2、负载均衡
nginx支持的负载均衡调度算法
1.weight轮询
2.备用机backup
3.ip_hash
4.fair智能调整调度算法
5.url_hash
3、算法扩展 sticky算法
4、nginx限流
(1)限制并发连接数
(2)限制每秒请求数
(3)排队,超过指定数量则排队访问
(4)无延迟
(5)限制带宽
5、平滑升级
1.版本更新
2.版本回退
6、nginx配置管理
(1)自动索引
(2)nginx expire 缓存配置
(3)日志轮询
(4)禁用不必要的日志记录,以节省磁盘IO的消耗
(5)站点目录和文件的限制
(6)中文乱码
7、nginx重定向
(1) 防止域名恶意解析到服务器IP
1)拒绝访问,报错500
2)将所有访问重定向至指定域名
(2)端口重定向
(3)虚拟主机重定向
1)www.westos.org 重定向bbs.westos.org
2)bbs.westos.org 重定向www.westos.org
(4)防盗链
环境搭建:使用虚拟机母机生成的server1、2、3 ,配置网络 和本地解析
在server2 server3中编辑主配置文件,worker_processes 设置为auto自动识别工作线程
在两个代理服务器server2 server3中配置
echo server2 > /usr/local/nginx/html/index.html
echo server3 > /usr/local/nginx/html/index.html
nignx 启动nginx
nginx -s reload 重新加载
在server1中配置
vim /usr/local/nginx/conf/nginx.conf
配置完成后,重启服务nginx并测试 curl www.westos.org
得到的结果是代理服务器server2 server3 并不是server1
将服务器接收到的请求按照规则分发的过程,称为“负载均衡”
给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大,使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列
实验效果如下:设置server2的权重值为5,则访问服务器时通过server2代理服务器的与server3的比例为5:1
当所有代理服务器都故障时将服务器本身设置为备用机,使用回环接口将调度站本身设置为备用,当后端主机恢复时则不会访问备用主机
server localhost:80 backup;
每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题
hash自动匹配到固定代理服务器让客户进行访问,除非这个服务器停止运行才会调度到新的服务器,或者有新的域名访问才会重新调度
实验:停止server3的nginx服务后转换为server2否则不会改变
动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,需要安装upstream_fair模块
按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。这种调度算法要使用的话也需要安装nginx的hash软件包
nginx并不支持一些算法,当我们需要使用时则需要进行拓展
Sticky工作原理:
Sticky是基于cookie的一种负载均衡解决方案,通过分发和识别cookie,使来自同一个客户端的请求落在同一台服务器上,默认cookie标识名为route:
1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
2.后端服务器处理完请求,将响应数据返回给nginx。
3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。
4.客户端接收请求,并保存带route的cookie。
5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。sticky模块与Ip_hash都是与负载均衡算法相关,但又有区别
区别:
1.ip hash,根据客户端的IP的hash进行匹配绑定,
客户端将会与一个后端服务器绑定,一定程度上解决了集群部署环境下session共享的问题
2.sticky,根据服务器给客户端的cookie,客户端再次请求时会带上此cookie,nginx会把有此cookie的请求转发到颁发cookie的服务器上推荐使用sticky算法
先将sticky注释掉,并停止nginx服务
更改火墙策略,下载算法模块
iptables -t nat -I POSTROUTING -s 172.25.24.0/24 -j MASQUERADE ##真机上写火墙策略,开启地址伪装
此步骤是为了远程lftp拷贝安扎ungbao,在网上下载可以忽略
yum install -y unzip ##下好sticky安装包后,下载zip解压软件包
unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip ##解压sticky软件包
安装好之后切入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 ##编译
通常便以后不知道是否成功,此时去make install 可能会出现错误。
输入命令:echo $? 结果为0即为成功
将nginx复制到sbin并覆盖,切入配置目录,编辑配置文件,此时可以使用sticky算法 并检测语法
cd objs/
\cp -f nginx /usr/local/nginx/sbin/ ##复制覆盖文件,\表示告诉shell不要去查alias,直接执行原本的cp
vim nginx.conf
nginx -t
先建立一个实验素材
cd html/
mkdir downloads
cd downloads/
拷贝一个图片 vim.ipg 大小约为500k
du -h vim.ipg
在真机执行压力测试命令,设定并发用户数为10,请求总数为10,成功10个
在server1中编辑配置文件:
limit_conn_zone $binary_remote_addr zone=addr:10m;
location /download/ {
limit_conn addr 1;
}
##真机中
ab -c10 -n 10 http://172.25.24.1/download/vim.jpg ##部分被拒绝
server1主机中编辑配置文件,设定每秒只通过1个请求,重启服务
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one;
重新在真机执行压力测试,因为每秒只通过一个,则其余9个被拒绝
配置文件中设定一次访问5个,超过的排队等待,因为上一个实验设定每秒通过1个请求,则访问2次,差不多10秒
limit_req zone=one burst=5;
配置文件,设定请求无延迟,在上一个实验的情况下,只能执行1次,即5个请求,重启服务
limit_req zone=one burst=5 nodelay;
真机中,执行压力测试,只能通过4个,其余被拒绝(误差可以忽略)
配置文件中设定带宽50k,重启服务,注释掉上面实验的参数,不然会很慢
limit_rate 50k;
在真机中执行压力测试,文件大小为500k,访问5次,限制带宽50k,大概需要50s
当服务器在运行的时候我们想升级版本的情况下就需要用到平滑升级
平滑升级可以在服务器运行的状态下最大限度的保持数据的完整性
安装一个比当前版本高的nginx,解压,重新编译
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio
make
注意:此处不需要make install
make之后备份原程序,将升级版本拷贝覆盖原程序
cd /usr/local/nginx/sbin
\cp -f nginx nginx.old #备份
cd ~/nginx1.21.1/objs
\cp -f nginx /usr/local/nginx/sbin #新程序覆盖替换
ps ax | grep nginx #查看当前nginx进程
kill -USR2 原主进程pid #开启新版本
回退的过程与更新相反,先还原nginx程序,唤醒进程,回收新版本,并关闭即可
cd /usr/local/nginx/sbin/
\cp -f nginx.old nginx #还原nginx程序
kill -HUP 原进程pid #唤醒原进程
ps ax | grep nginx #查看进程
kill -WINCH 21337 #回收新版本进程
kill -QUIT 21337 #关闭新版本进程
访问浏览器时为了下载软件更加方便,可以在配置文件中设定自动索引
重启服务
缓存可以降低网站带宽,加速用户访问。
编辑配置文件,设定对图片等进行缓存,缓存时间为1年,在此期间访问就会减少访问时间
在真机中,使用curl命令访问素材文件,可以看到缓存至2022年
编写一个脚本,设定打开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 ##生成日志
在配置文件中设定禁用浏览器访问指定目录时生成日志文件
在浏览器访问
172.25.24.1/status ##刷新会增加访问次数,但不会有日志生成
cd ../logs
ls
cat access.log ##为空
在配置文件中设定指定目录只能本机访问,拒绝其他所有请求
///
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.7.1/status ##拒绝访问
在server1本机访问时,允许访问
使用curl命令查看本地的发布文件,是可以正常显示中文的
nginx默认不支持中文字符,在浏览器访问时,中文会变成乱码。
在nginx发布文件中加入一行中文,在浏览器中试访问,为乱码
cd /usr/localnginx/html/
echo hello中国 > index.html
编辑配置文件,设定nginx支持中文字符,并重启服务
切入配置目录,编辑配置文件,设定在访问本机时,返回500,重启服务。此时使用curl命令访问本机,会显示http报错500
将所有访问请求重定向至指定域名,重启服务,此时使用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.7.1回车后会自动跳转至www.westos.org
编辑配置文件,将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端口重定向成功
真机中使用curl命令,可以看到加密端口已打开
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;
#rewrite ^/(.*)$ http://bbs.westos.org/$1 permanent;
#location / {
# proxy_pass http://westos;
# }
}
server {
listen 80;
server_name bbs.westos.org;
location / {
root /bbs;
index index.html;
}
}
///
nginx -s reload
在真机使用curl命令可以查看
浏览器输入www.westos.org会自动跳转为bbs.westos.org
rewrite ^/(.*)$ http://bbs.westos.org/$1 permanent; #以任何开头或结尾都可以重定向到bbs.westos.org
vim nginx.conf
///
server {
listen 80;
server_name www.westos.org bbs.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命令可以查看
在浏览器中输入bbs.westos.org会自动跳转至www.westos.org/bbs
盗链主机server2
防盗主机server1
server1当中/usr/local/nginx/html下建立一个目录download
目录内下载一张图片,假设盗链这张图片
配置server2盗链主机
cd /usr/local/nginx/html
vim test.html
hello中国
配置完毕
在浏览器当中通过server2的IP进行访问
配置防盗主机server1
vim /usr/local/nginx/conf/nginx.conf
location ~ \.(jpg|png)$ {
valid_referers none blocked www.westos.org;
if ($invalid_referer) {
return 403; ##只能通过www.westos.org域名进行访问,否则将会403拒绝
#rewrite ^/ http://www.westos.org/daolian.jpg;
}
}
浏览器再次访问
为了防盗连的效果,我们可以将防盗链重定向到一张图片,展示给盗链你的人
location ~ \.(jpg|png)$ {
valid_referers none blocked www.westos.org;
if ($invalid_referer) {
#return 403;
rewrite ^/ http://www.westos.org/daolian.jpg;
}
}