https://docs.nginx.com/ ##nginx配置官网
实验环境配置
scp -r /usr/local/nginx server2:/usr/local/ ##将服务部署到server2
scp -r /usr/local/nginx server3:/usr/local/
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ ##建立软链接,全局启动nginx
scp /usr/lib/systemd/system/nginx.service server3:/usr/lib/systemd/system/nginx.service ##将nginx进程添加系统进程
useradd -d /usr/local/nginx/ -M -s /sbin/nologin nginx ##创建系统级nginx用户
systemctl daemon-reload ##重新加载服务配置
systemctl enable --now nginx ##开机自启服务
各主机的地址解析需要完善(/etc/hosts)
一、Nginx反向代理
正向代理和反向代理
正向代理:客户端明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器正向代理模式屏蔽或者隐藏了真实客户端信息
反向代理:服务器清楚客户端,但是请求具体由哪台服务器处理的并不明确
二、负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略就是自定义策略。
1、轮询
server1 nginx主机
server2 server3 代理服务器
实验:
(server1主机中)
http{
upstream westos { ##负载均衡器upstream
server 172.25.22.2:80;
server 172.25.22.3:80;
}
server {
listen 80;
server_name www.westos.org;
location / {
proxy_pass http://westos; ##反向代理器proxy_pass
}
}
}
nginx -t ##检测语法
nginx -s reload ##重新加载nginx
代理服务器server2,server3配置主页
echo server2 > /usr/local/nginx/html/index.html
echo server3 > /usr/local/nginx/html/index.html
nginx -s reload
在真机中测试
需要添加域名解析 (172.25.22.1 www.westos.org)
curl www.westos.org
server1作为nginx主机会将任务分发至代理服务器上
2、加权轮询
实验
upstream westos {
server 172.25.22.2:80 weight=2; ##权重为2
server 172.25.22.3:80;
}
实验结果表明server2比server3访问更加频繁。
backup: 不能和ip_hash一起使用,backup 参数是指当所有非备机都宕机或者不可用的情况下,就只能使用带backup标准的备机。
3、ip_hash
ip_hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题
ip_hash对后端做健康检测,如果server3出问题,则调用server2
(server3 nginx -s stop)
三、算法扩展
nginx并不支持一些算法,当我们需要使用时,则需要进行扩展。比如sticky模块,nginx本身不支持,当在配置文件中写入并调用时,会报错
sticky的部署
nginx -s stop ##停止nginx服务
wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src
gzip -d master.tar.gz
tar xf master.tar
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 ##配置(注意sticky路径)
make ##编译
cd objs/
\cp -f nginx /usr/local/nginx/sbin/nginx ##覆盖原文件,\表示告诉shell不要去查alias,直接执行原本的cp
编写配置文件配置sticky算法扩展
启动nginx并检测语法
可以使用浏览器访问NGINX (注意清理缓存刷新负载均衡)
四、nginx限流
建立实验素材
cd /usr/local/nginx/html/
mkdir download
du -h vim.jpg
1、限制并发连接数
(1)在真机进行压力测试,全部通过
ab -c10 -n10 http://172.25.22.1/download/vim.jpg ##-c一次请求的数量,-n数量为10,失败0
在server1中配置
limit_conn_zone 参数解释
限制连接数的能力limit_conn_zone $binary_remote_addr zone=NAME:10m; ##limit_conn_zone 参数配置 //第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。 //第二个参数:zone=addr:10m表示生成一个大小为10M,名字为addr的内存区域,用来存储访问的频次信息。 location /download/ { limit_conn addr 1; } //imit_conn为限制并发连接数
实验测试:
2、控制速率
在server1中配置
limit_req_zone 参数解释
限制请求处理速率能力limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ##limit_req_zone 参数配置 //第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。 //第二个参数:zone=addr:10m表示生成一个大小为10M,名字为addr的内存区域,用来存储访问的频次信息。 //第三个参数:rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求 location /download/ { limit_conn addr 1; limit_req zone=one; }
实验测试:
ab -c10 -n10 http://172.25.22.1/download/vim.jpg
1、排队
burst
在超过设定的处理速率后能额外处理的请求数location /download/ { limit_conn addr 1; limit_req zone=one burst=5; } // rate=1r/s 每秒通过一个请求.若同时有6个请求到达,Nginx 会处理第一个请求,剩余5个请求将放入队列,然后每隔1m从队列中获取一个请求进行处理。若请求数大于6,处理多余的请求
实验测试:
ab -c1 -n10 http://172.25.22.1/download/vim.jpg
1、无延迟
nodelay
针对的是 burst 参数location /download/ { limit_conn addr 1; limit_req zone=one burst=5 nodelay; } // nodelay 超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。
实验测试:
ab -c1 -n10 http://172.25.22.1/download/vim.jpg
3、限制带宽
下载东西时,会被限制网速,其实就是限制带宽。
在配置文件中设定带宽50k,重启服务,注释掉上面实验的参数
实验测试:
ab -c1 -n5 http://172.25.22.1/download/vim.jpg
文件大小为444k,访问5次,限制带宽50k,大概需要40s。
五、Nginx配置管理
当使用浏览器访问时为了方便查看和下载软件,可以在配置文件中设定自动索引
实验测试:
1、expires缓存
使用缓存可以降低网站带宽,加速用户访问。
编辑配置文件,设定对图片等进行缓存,缓存时间为1年,在此期间访问就会减少访问时间location ~ .*\.(gif|jpg|png)$ { ##对图片等进行缓存 expires 365d; ##缓存365天 root html; ##缓存指定html下 }
实验测试:
curl -I 172.25.22.1/download/vim.jpg
缓存至2022年
2、日志轮询
cd /opt/ ##第三方软件安装位置 vim nginx_log.sh #!/bin/bash cd /usr/local/nginx/logs/ && mv access.log access_$(date +%F -d -1day).log ##生成日至文件,date +%F -d -1day 昨天的年月日 kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` chmod +x nginx_log.sh /opt/nginx_log.sh ##运行脚本文件
实验测试:
3、禁用不必要的日志记录,以节省磁盘IO的消耗
在配置文件中设定禁用浏览器访问指定目录时生成日志文件
mkdir /usr/local/nginx/html/statuslocation /status { stub_status on; access_log off; }
实验测试:
此时在浏览器中访问该目录,在日志目录中不会生成日志记录
在真机中使用curl命令访问该目录时,会产生日志文件
curl -I 172.25.7.1/status
curl localhost/status
4、站点目录和文件的限制
在配置文件中设定指定目录只能本机访问,拒绝其他所有请求
location /status { stub_status on; access_log off; allow 127.0.0.1; ##回环接口,只允许本机访问此目录 deny all; ##拒绝其他一切 }
实验测试:
真机测试:
本机访问:
5、nginx 重定向
1.防止域名恶意解析到服务器IP
2.在 web 服务中,通常会通过重定向功能,将一个域名的请求转发到另一个域名上。
1、拒绝访问,报错500
设定在访问本机时,返回500
server { listen 80; server_name localhost; return 500; ##重定向返回值为500 }
实验测试:
curl localhost
curl -I http://172.25.22.1
2、将所有访问重定向至指定域名
设定将所有访问请求重定向至指定域名
server { listen 80; server_name localhost; rewrite ^(.*) http://www.westos.org permanent; ##访问本机重定向至www.westos.org }
实验测试:
curl -I http://172.25.22.1
3、端口重定向
生成证书,并移动到配置目录中
cd /etc/pki/tls/certs/ make cert.pem mv /etc/pki/tls/certs/cert.pem /usr/local/nginx/conf/
编辑配置文件,将80端口定向到443端口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; charset utf-8; location / { root html; index index.html index.htm; } server { listen 80; server_name www.westos.org; rewrite ^/(.*)$ https://www.westos.org/$1 permanent; ##将80端口定向443端口 location / { proxy_pass http://westos; } }
实验测试:
4、虚拟主机重定向
1、当访问www.westos.org 重定向bbs.westos.org
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 permanent;`##以任何开头或结尾都重定向到bbs.westos.org #location / { # proxy_pass http://westos; #} } server { listen 80; server_name bbs.westos.org; location / { root /bbs; index index.html; }
实验测试:
2、当访问bbs.westos.org 重定向www.westos.org
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 permanent; location / { proxy_pass http://westos; } } server { listen 80; server_name bbs.westos.org; if ($host = "bbs.westos.org"){ rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent; } #location / { # root /bbs; # index index.html; #} 在真机先做地址解析,使用curl命令可以查看 172.25.22.1 www.westos.org bbs.westos.org
实验测试:
6、中文乱码
nginx默认不支持中文字符,在浏览器访问时,中文会变成乱码
server { listen 80; server_name localhost; charset utf-8; ##utf-8 }
实验测试:
7、防盗链
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。可以通过设置配置防止别人盗链
server1 防盗主机
server2 盗链主机server2 cd /usr/local/nginx/html/ vim index.html <html> <body> <br>server2</br> <img src="http://www.westos.org/download/vim.jpg"> </body> </html>
通过访问server2可以直接访问server1的图片
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 permanent; location / { root html; index index.html; #proxy_pass http://westos; } location ~ \.(jpg|png)$ { ##防盗设置 valid_referers none blocked www.westos.org; if ($invalid_referer) { return 403; #rewrite ^/ http://www2.westos.org/daolian.jpg; } } }
可以通过重定向让盗链指向其他资源
location ~* \.(gif|jpg|png)$ { valid_referers none blocked www.westos.com; if ($invalid_referer) { #return 403; rewrite ^/ http://www.westos.com/daolian.jpg; } }