一.平滑升级
1.版本升级
当服务器在运行时,需要升级的情况下,平滑升级即就是不断开服务器就可以进行升级,最大限度保证数据的完整性。 在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;
worker_cpu_affinity 01 10;
///
nginx -s reload
cd
wget http://nginx.org/download/nginx-1.21.1.tar.gz
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
cd objs/
ls-->nginx
cd /usr/local/nginx/sbin/ ##备份原程序
ls-->nginx
cp nginx nginx.old
cd
cd nginx-1.21.1/ ##拷贝新程序
ls
cd objs/
alias
\cp -f nginx /usr/local/nginx/sbin/
ps ax | grep nginx ##获取当前nginx主进程pid
kill -USR2 22602
ps ax | grep nginx
curl localhost -I
kill -WINCH 22602 ##关闭worker进程但保留主进程:为了回退
ps ax | grep nginx
curl localhost -I
因为有时候我们会发现新版本并没有旧版本用着顺手,那么关闭worker进程但保留主进程就是为了回退,即就是关闭工作端worker,保留master。
2. 版本回退
回退的过程是相反的,先还原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.21.2:80 weight=2;
///
nginx -t ##失败,因为sticky不支持,需进行扩展
所以我们需要对nginx进行扩展,先将nginx.conf配置文件中的sticky注释掉,并停止服务。 下载sticky软件包,所以需要在真机对其进行火墙策略的设定。
iptables -t nat -I POSTROUTING -s 172.25.21.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软件包。 安装好之后切入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
将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.21.2:80;
server 172.25.21.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
1、限制并发连接数
在真机执行压力测试命令,设定并发用户数为10,请求总数为10,失败请求4个。
在真机执行:
ab -c10 -n 10 http://172.25.21.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.21.1/download/vim.jpg ##大部分被拒绝
2.限制每秒请求数
在真机执行压力测试,设定并发用户数为1,请求总数为10,则请求全部通过。
ab -c1 -n 10 http://172.25.21.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个被拒绝。
在配置文件中设定一次访问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.21.1/download/vim.jpg # 在真实情况下,偏差在几台主机的情况是可以忽略不计的
3.无延迟
编辑配置文件,设定请求无延迟,在上一个实验的情况下,只能执行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.21.1/download/vim.jpg
4.限制带宽
在配置文件中设定带宽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.21.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.21.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.21.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 ##生成日志
禁用不必要的日志记录,以节省磁盘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.21.1/status ##刷新会增加访问次数,但不会有日志生成
cd ../logs
ls
cat access.log ##为空
但当在真机中使用curl命令访问该目录时,会产生日志文件。
###真机 curl -I 172.25.21.1/status
###server1 cat access.log ##会产生日志文件
4.站点目录和文件的限制
在配置文件中设定指定目录只能本机访问,拒绝其他所有请求。
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.21.1/status ##拒绝访问 当在server1本机访问时,允许访问。
curl localhost/status
5.中文乱码问题
nginx默认不支持中文字符,在浏览器访问时,中文会变成乱码。 在nginx发布文件中加入一行中文,在浏览器中试访问,为乱码。
cd ..(nginx)
cd html/
vim index.html
///
helloworld
欢迎
///
在浏览器访问时中文是乱码/302b714ea4d54ee192fd84bba50f2ceb.png)编辑配置文件,设定nginx支持中文字符,并重启服务。
vim nginx.conf
///
server {
listen 80;
server_name localhost;
charset utf-8;
///
nginx -s reload
此时在浏览器中访问172.25.21.1,可以看到中文正常显示。
五.nginx 重定向
1、防止域名恶意解析到服务器IP
为了防止域名恶意解析到服务器IP,编辑配置文件,设定将所有访问请求重定向至指定域名,重启服务。此时使用curl命令访问本机,会显示访问地址为http://www.westos.org。
vim /usr/local/nginx/conf/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.21.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.21.1/index.html—>https://172.25.21.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;
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命令可以查看。
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.21.1 server1 www.westos.org reg.westos.org bbs.westos.org
///
curl -I bbs.westos.org
在浏览器中输入bbs.westos.org会自动跳转至www.westos.org/bbs。
六.防盗链
防盗链目的是为了防止图片被恶意盗取:
vim /usr/local/nginx/conf/nginx.conf
///
server {
listen 80;
server_name localhost;
location ~ \.(jpg|png|jpeg)$ {
valid_referers none blocked www.westos.org;
if ($invalid_referer) {
return 403;
# rewrite ^/ http://172.25.1.2/daolian.jpeg;
}
}
///
nginx -s reload
curl -I www.westos.org/download/vim.jpg
|