Linux企业运维 6.3 -- nginx反向代理

目录

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 ,配置网络 和本地解析

1、反向代理

在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

2、负载均衡

将服务器接收到的请求按照规则分发的过程,称为“负载均衡”

nginx支持的负载均衡调度算法

1.weight轮询

给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大,使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列

实验效果如下:设置server2的权重值为5,则访问服务器时通过server2代理服务器的与server3的比例为5:1

2.备用机backup

当所有代理服务器都故障时将服务器本身设置为备用机,使用回环接口将调度站本身设置为备用,当后端主机恢复时则不会访问备用主机

server localhost:80 backup;

3.ip_hash

每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题

hash自动匹配到固定代理服务器让客户进行访问,除非这个服务器停止运行才会调度到新的服务器,或者有新的域名访问才会重新调度

实验:停止server3的nginx服务后转换为server2否则不会改变

4.fair智能调整调度算法

动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,需要安装upstream_fair模块

5.url_hash

按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。这种调度算法要使用的话也需要安装nginx的hash软件包

3、算法扩展 sticky算法

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算法检测会报错:

 先将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

4、nginx限流

先建立一个实验素材

cd html/
mkdir downloads
cd downloads/

拷贝一个图片 vim.ipg 大小约为500k
du -h vim.ipg

(1)限制并发连接数

在真机执行压力测试命令,设定并发用户数为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 ##部分被拒绝

 (2)限制每秒请求数

server1主机中编辑配置文件,设定每秒只通过1个请求,重启服务

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one;

 重新在真机执行压力测试,因为每秒只通过一个,则其余9个被拒绝

(3)排队,超过指定数量则排队访问

配置文件中设定一次访问5个,超过的排队等待,因为上一个实验设定每秒通过1个请求,则访问2次,差不多10秒

limit_req zone=one burst=5;

 

 (4)无延迟

配置文件,设定请求无延迟,在上一个实验的情况下,只能执行1次,即5个请求,重启服务

limit_req zone=one burst=5 nodelay;

 真机中,执行压力测试,只能通过4个,其余被拒绝(误差可以忽略)

 (5)限制带宽

配置文件中设定带宽50k,重启服务,注释掉上面实验的参数,不然会很慢

limit_rate 50k;

 在真机中执行压力测试,文件大小为500k,访问5次,限制带宽50k,大概需要50s

5、平滑升级

当服务器在运行的时候我们想升级版本的情况下就需要用到平滑升级
平滑升级可以在服务器运行的状态下最大限度的保持数据的完整性

1.版本更新

安装一个比当前版本高的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   #开启新版本

2.版本回退

回退的过程与更新相反,先还原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  #关闭新版本进程

6、nginx配置管理

(1)自动索引

访问浏览器时为了下载软件更加方便,可以在配置文件中设定自动索引

 重启服务

 (2)nginx expire 缓存配置

缓存可以降低网站带宽,加速用户访问。
编辑配置文件,设定对图片等进行缓存,缓存时间为1年,在此期间访问就会减少访问时间

 在真机中,使用curl命令访问素材文件,可以看到缓存至2022年

(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的消耗

 在配置文件中设定禁用浏览器访问指定目录时生成日志文件

在浏览器访问
172.25.24.1/status	##刷新会增加访问次数,但不会有日志生成
cd ../logs
ls
cat access.log		##为空

(5)站点目录和文件的限制

在配置文件中设定指定目录只能本机访问,拒绝其他所有请求

///
        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本机访问时,允许访问

 (6)中文乱码

使用curl命令查看本地的发布文件,是可以正常显示中文的

nginx默认不支持中文字符,在浏览器访问时,中文会变成乱码。
在nginx发布文件中加入一行中文,在浏览器中试访问,为乱码

cd /usr/localnginx/html/
echo hello中国 > index.html

编辑配置文件,设定nginx支持中文字符,并重启服务 

7、nginx重定向

(1) 防止域名恶意解析到服务器IP

1)拒绝访问,报错500

切入配置目录,编辑配置文件,设定在访问本机时,返回500,重启服务。此时使用curl命令访问本机,会显示http报错500

 

 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.7.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端口重定向成功

真机中使用curl命令,可以看到加密端口已打开

(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命令可以查看

在这里插入图片描述

浏览器输入www.westos.org会自动跳转为bbs.westos.org

rewrite ^/(.*)$ http://bbs.westos.org/$1 permanent; #以任何开头或结尾都可以重定向到bbs.westos.org 

2)bbs.westos.org 重定向www.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

(4)防盗链

盗链主机server2
防盗主机server1

 server1当中/usr/local/nginx/html下建立一个目录download
目录内下载一张图片,假设盗链这张图片

配置server2盗链主机

cd /usr/local/nginx/html
vim test.html

<html>
<body>
<br> hello中国 </br>
<img src="http://www.westos.org/download/vim.jpg">
</body>
</html>

配置完毕
在浏览器当中通过server2的IP进行访问


成功盗链到serve1主机的内容

配置防盗主机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;
                }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route (a)客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。 (b)后端服务器处理完请求,将响应数据返回给nginx。 (c)此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值 (d)客户端接收请求,并保存带route的cookie。 (e)当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。 其他需要注意的 (a)同一客户端的请求,有可能落在不同的后端服务器上。如果客户端启动时同时发起多个请求。由于这些请求都没带cookie,所以服务器会随机选择后端服务器,返回不同的cookie。当这些请求中的最后一个请求返回时,客户端的cookie才会稳定下来,值以最后返回的cookie为准。 (b)cookie不一定生效。由于cookie最初由服务器端下发,如果客户端禁用cookie,则cookie不会生效。 (c)客户端可能不带cookie。Android客户端发送请求时,一般不会带上所有的cookie,需要明确指定哪些cookie会带上。如果希望用sticky做负载均衡,请对Android开发说加上cookie。 (d)cookie名称不要和业务使用的cookie重名。Sticky默认的cookie名称是route,可以改成任何值。 (e)客户端发的第一个请求是不带cookie的。服务器下发的cookie,在客户端下一次请求时才能生效。 (f)Nginx sticky模块不能与ip_hash同时使用 sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback] [secure] [httponly]; [name=route] 设置用来记录会话的cookie名称 [domain=.foo.bar] 设置cookie作用的域名 [path=/] 设置cookie作用的URL路径,默认根目录 [expires=1h] 设置cookie的生存期,默认不设置,浏览器关闭即失效,需要是大于1秒的值 [hash=index|md5|sha1] 设置cookie中服务器的标识是用明文还是使用md5值,默认使用md5 [no_fallback] 设置该项,当sticky的后端机器挂了以后,nginx返回502 (Bad Gateway or Proxy Error) ,而不转发到其他服务器,不建议设置 [secure] 设置启用安全的cookie,需要HTTPS支持 [httponly] 允许cookie不通过JS泄漏,没用过
2023年网络建设与运维国赛的Linux部分将涉及大量与Linux操作系统相关的技术和实践。参赛选手需要具备扎实的Linux基础知识、熟悉常用的Linux命令和工具,以及对网络架构和运维流程有深入了解。以下是几个可能出现的考点和相关内容: 1. Linux 系统安装与配置:选手需要了解如何安装各种Linux发行版,并进行基本配置,如网络设置、用户管理和权限控制等。 2. Linux 网络服务:主要考察选手对于各种网络服务的搭建和配置能力,如Web服务器(Apache/Nginx)、数据库服务器(MySQL/PostgreSQL)和邮件服务器(Postfix/Dovecot)等。 3. Linux 系统监控与性能优化:选手需要熟悉Linux系统的监控和调优手段,如使用top、vmstat等工具进行性能监测,优化内存管理、磁盘IO等问题。 4. Linux 安全防护与应急响应:选手需要掌握Linux系统的安全防护策略,如配置防火墙、使用SELinux进行强化等;同时,还需了解常见的攻击方式和应急响应措施。 5. Shell 脚本编写:选手需要具备基本的Shell编程能力,能够使用Shell脚本实现日常运维任务的自动化。 在比赛中,选手需要灵活运用自己的知识和技能,通过实际操作和解决问题的能力展现自己的水平。此外,对于团队竞赛,选手之间的协作能力和分工合作也是考核的重点之一。 要在2023年的网络建设与运维国赛的Linux部分取得好成绩,选手们需要提前系统学习相关知识并进行实践,注重积累经验,不断完善自己的技能和能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值