详解nginx

mac2024-10-12  49

文章目录

nginxnginx是什么?搭建并部署安装升级回退日志切割systemd方式相关参数 应用正向代理反向代理压缩图片添加ssl模块rewrite重写规则(重定向)防盗链

nginx

官网 常用模块介绍 nginx代理

nginx是什么?

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

为什么用Nginx?

(1)跨平台、配置简单; (2)非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发; (3)内存消耗小:开启10个nginx才占150M内存,Nginx采取了分阶段资源分配技术; (4)nginx处理静态文件好,耗费内存少; (5)内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。 (6)节省宽带:支持GZIP压缩,可以添加浏览器本地缓存; (7)稳定性高:宕机的概率非常小 (8)master/worker结构:一个master进程,生成一个或者多个worker进程。 (9)接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力; (10)一边接收web服务器的返回数据,一边发送给浏览器客户端; (11)网络依赖性比较低,只要ping通就可以负载均衡; (12)事件驱动:通信机制采用epoll模型。

nginx和Apache的区别?

两者最核心的区别在于apache是同步多进程模型,一个request对应一个进程,而nginx是异步的,多个连接(万级别)可以对应一个进程。 一般来说,需要性能的web服务,用nginx,如果不需要性能只求稳定,更考虑Apache,后者的各种模块实现的比前者好很多,epoll网络IO模型是nginx处理性能高的根本,但并不是所有情况下epoll大获全胜的,如果本身提供静态服务的只有几个文件,apache的select模型或许比epoll更高性能。当然,这只是一个假设,真正还需要实测了再说。 更通用的方案是,前端nginx抗并发,后端apache集群,配合起来会更好。

工作模式

nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

master-worker

该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务

单进程模式

单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。

搭建并部署

安装

nginx大部分常用模块,编译时./configure --help 以–without开头的都默认安装。 –prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx –conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行 中的-c选项。默认为prefix/conf/nginx.conf –user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。 默认的用户名是nobody。–group=name类似 –with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用–with-pcre自动找到库文件。使 用–with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 - 8.30)并解压,剩下的就交给Nginx 的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。 –with-zlib=PATH : 指定 zlib(版本1.1.3 - 1.2.5)的源码解压目录。在默认就启用的网络传输压缩 模块ngx_http_gzip_module时需要使用zlib 。 –with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与 openssl-devel已安装 –with-http_stub_status_module : 用来监控 Nginx 的当前状态 –with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如XReal-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址 –add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模 块都要重新编译(Tengine可以在新加入module时无需重新编译)

#1.下载nginx #2.tar zxf nginx-1.14.0.tar.gz #3.cd nginx-1.14.0 ##讲解里面各目录的意义 1)auto目录:里面有4个子目录,cc是编译使用的,os是判断操作系统类型的,其他都是辅助configure编译的, 也就是操作系统有什么特性供nginx使用 2)CHANGES:各版本的改变,bug修复等信息 CHANGES.ru:nginx作者是俄罗斯人,这是俄罗斯版本 3)conf: 为了方便运维配置,conf目录里有示例文件,安装好后会拷贝到安装目录 4)configure: 5)contrib:提供nginx语法检测字体 cp -r contrib/vim/* ~/.vim ##家目录下如果没有.vim目录,手动新建 6)html:默认发布目录,50x.html是报500错误时的页面 7) src:源码目录 8) 编译完成后会生成一个中间目录objs,里面有个ngx_modules.c,表示编译进nginx的模块,可以打开看一下 9) make完成后再看objs目录,又有新文件 #4.编译 ./configure --prefix=/usr/local/nginx --with-file-aio 前面lnmp部分已经讲过

升级回退

##1:nginx平滑升级、回退 #升级 1)首先将之前的1.14版本的启动脚本备份 cd /usr/local/nginx/sbin cp nginx nginx.old 2)再编译新版本1.15 'configure make结束不要make install,这会覆盖原来的nginx' cd /root/nginx-1.15.8/objs cp -f nginx /usr/local/nginx/sbin/nginx 3)向原来的nginx的master进程发送信号,不再接收新的请求, 新的nginx程序开启worker进程,并且开始接收请求 kill -USR2 3607 ##这个时候ps -ef看到两个master进程和其对应的worker进程 kill -WINCH 3607 ##这个时候ps -ef看到老的worker进程结束,但master进程还在,不影响,是为了升级不成功时版本回退 4)执行/usr/local/nginx/sbin/nginx -v ##看到版本已经更新 /usr/local/nginx/sbin/nginx -V ##还可以看到编译的模块 #回退 1)先还原nginx脚本 cd /usr/local/nginx/sbin cp -f nginx.old nginx 2)重新唤起旧版本的master进程,让其接收请求 kill -HUP 3607 #-HUP相当于reload 3)让新版本的master进程不接收请求,关闭worker进程 kill -USR2 6146 kill -WINCH 6146 4)再查看nginx版本,回退到旧版本 /usr/local/nginx/sbin/nginx -v ##查看nginx版本 /usr/local/nginx/sbin/nginx -V ##查看nginx版本及编译参数等 一次全部编译 ./configure --prefix=/usr/local/nginx --with-http_realip_module --withhttp_image_filter_module=dynamic --with-http_ssl_module ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

日志切割

##2.nginx日志切割 #因为nginx的access.log日志会保存所有客户端连接信息,普通网站每天请求量很大,所以要每天切割(可以用 nginx自带的reopen) 1)先查看nginx的access.log日志大小 [root@server1 logs]# du -sh access.log 20K access.log 2)多次请求页面,再查看日志大小 [kiosk@foundation0 ~]$ ab -c 1 -n 100000 http://www.westos.org/index.html ##1个并 发,100000次请求 3)再看日志大小 [root@server1 logs]# du -sh access.log 16M access.log 4)首先保存之前的日志 [root@server1 logs]# mv access.log `date +%F -d -1day`_access.log ##因为第二天肯定 是备份前一天的日志 [root@server1 logs]# /usr/local/nginx/sbin/nginx -s reopen #发现重新生成了一个access.log,新的请求信息会到新日志里 #可以把命令写在crontab里,每天执行一次

systemd方式

##2:systemd方式nginx启动脚本 1)系统启动脚本都在/usr/lib/systemd/system目录下,但是自己配置的服务官方不建议放在此目录下, 放在/ etc/systemd/system目录下 2)用httpd服务启动脚本做参考 cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/nginx.service vim /etc/systemd/system/nginx.service [Unit] Description=The Nginx HTTP Server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ##没有可以不要 ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=multi-user.target 3)启动nginx systemctl start nginx

相关参数

##nginx相关参数 1)最大连接数 worker_connections 65535 ##当nginx做反向代理时,这个数字要除以2来看最大连接数 然后查看系统最大打开文件数: sysctl -a | grep file fs.file-max = 200603 ##最大打开文件数为200603,一个连接也是一个文件(socket文件,linux思想一切皆文件) 查看系统默认打开文件数 ulimit -a open files (-n) 1024 ##默认1024个 然后修改系统参数: vim /etc/security/limits.conf nginx - nofile 65535 ##加在最后 新建nginx用户: useradd -M -d /usr/local/nginx -s /sbin/nologin nginx 我们经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费, 服务器 压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制 2)限制链接数 ##看官网 docs.nginx.com --> NGINX Plus --> Admin Guide --> Security Controls --> Limiting Access to Proxied HTTP Resources vim nginx.conf ...ls keepalive_timeout 65; #gzip on; #limit_conn_zone 用来限制同一时间连接数,即并发限制 #limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket” $binary_remote_addr是限制同一客户端ip地址 zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息 # 定义一个名为addr的limit_conn_zone $binary_remote_addr是限制同一客户端ip地址 #以下两条语句写在server之上 limit_conn_zone $binary_remote_addr zone=addr:10m; #大小是10M内存 10M的内存来对于IP传输 开销 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #1s中不超过一个请求 ... location / { root html; index index.html index.htm; } location /download { limit_conn addr 1; ##只能一个并发,多了会报错 limit_rate 50k; ##限制带宽,每秒最多50k } '上面三个参数一个一个演示' mkdir /usr/local/nginx/html/download #给download目录里放一个vim.jpg(约400k) ab -c 10 -n 1000 http://172.25.136.1/download/vim.jpg 每次发送10个并发的请求数,请求数总数为100 [root@server1 logs]# cat access.log |grep 200 可以看到请求成功的200数量远远少于503的请求错误

应用

正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端才能使用正向代理。举个例子说明一下: 在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时需要找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们! 上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。

总结

总结来说:正向代理,“它代理的是客户端,代客户端发出请求”,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。 正向代理的用途: (1)访问原来无法访问的资源,如Google (2) 可以做缓存,加速访问资源 (3)对客户端访问授权,上网进行认证 (4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

反向代理

反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说,就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。 举个例子说明一下: 某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用Nginx进行反向代理实现的,并且通过封装Nginx和其他的组件之后起了个高大上的名字:Tengine。那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图

总结

此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。 客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。 反向代理,它代理的是服务端,代服务端接收请求",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。 反向代理的作用: (1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网 (2)负载均衡,通过反向代理服务器来优化网站的负载

通常上网访问路径(比如说用阿里云主机): client() --> ADSL(拨号上网) --> cdn --> SLB(阿里云负载均衡) --> nginx

1.重新编译添加模块 ./configure --prefix=/usr/local/nginx --with-http_realip_module make cd /root/nginx-1.15.8/objs cp -f nginx /usr/local/nginx/sbin/nginx 2.添加虚拟主机 vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name server1.example.org; ##添加域名 set_real_ip_from 172.25.136.1; ##真实服务器上一级代理的IP地址或者IP段,可以写多行 real_ip_header X-Forwarded-For; real_ip_recursive on; ##这里off就获取不到源地址,可以先改为off看效果,再打开 location / { return 200 "client real ip: $remote_addr\n"; } } ———————————————————————————————— #尝试访问 nginx -s reload curl -I server1.example.com curl -H "X-Forwarded-For: 1.1.1.1,172.25.136.1" server1.example.org ##X-Forwarded-For可以保存每一级的ip头,结果可以获取到server1的ip 3.反向代理 ##深入:自己再开一台虚拟机模拟反向代理,测试这个配置是否生效 server1配置: ###就写在配置文件本来的sever下面就行了 server { listen 80; server_name localhost; set_real_ip_from 172.25.136.2; real_ip_header X-Forwarded-For; real_ip_recursive on; —————————————————————————— server2配置(做代理): upstream westos { server 172.25.136.1:80; #上游真实服务器 } server { listen 80; server_name www.westos.org; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://westos; } } —————————————————————— nginx -s reload 再用物理机访问www.westos.org,然后在server1上查看access.log,可以看到请求来自物理机 ##注意物理机要添加反向代理主机的dns off的时候就是来自反向代理主机

压缩图片

不管一个系统或网站的大与小,都存在相应的图片处理,生成缩略图、为图片加水印等等,如果涉及到APP端,这个图 片的处理需求变得更加重要了,因为在目前看来,客户端的屏幕大小不一,会导致以下问题: 1、图片过大导致APP加载图片速度慢; 2、消耗用户过多流量。 添加图片过滤模块(有时一张高清图片太大,页面加载时间太长,需要压缩)

1.需要重新编译nginx ./configure --prefix=/usr/local/nginx --with-http_realip_module --withhttp_image_filter_module=dynamic 编译报错,没有gd-devel包 yum list gd ##看到系统gd版本是2.0.35-26,所以自己下载的gd-devel也得是这个版本 yum install -y gd-devel-2.0.35-26.el7.x86_64.rpm 再编译 make cd /root/nginx-1.15.8/objs cp nginx /usr/local/nginx/sbin/ 静态模块需要手动新建目录,把模块放进去 mkdir /usr/local/nginx/modules cp ngx_http_image_filter_module.so /usr/local/nginx/modules/ 修改配置文件 load_module modules/ngx_http_image_filter_module.so;##加在最开头 location /download/ { limit_conn addr 1; #limit_rate 50k; #limit_req zone=one burst=5; image_filter resize 150 100; #就是重新调整图片的尺寸(像素) } 然后在浏览器上打开访问,没有变化先清理缓存 http://ip/download/xxx.jpg #注意:路径一定要输入全,图片位置要对 按F12,点击network->file可以看到图片大小变为不到2k,之前400多k

添加ssl模块

重新编译nginx ./configure --prefix=/usr/local/nginx --with-http_realip_module --withhttp_image_filter_module=dynamic --with-http_ssl_module cd /root/nginx-1.15.8/objs cp nginx /usr/local/nginx/sbin 重新编译完,之前的模块需要再重新拷贝到模块目录,不然启动会报错 cp ngx_http_image_filter_module.so /usr/local/nginx/modules/ 修改配置文件 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 /web; index index.html index.htm; } } server { listen 80; server_name www.westos.org; location / { root /web; index index.html; } } 生成自签名证书 cd /etc/pki/tls/certs make cert.pem cn -> shaanxi -> xi'an -> westos -> linux-> server1 ##注意主机名字 -> root@westos.org cp cert.pem /usr/local/nginx/conf/ mkdir /web vim /web/index.html server1.westos.org nginx -s reload 浏览器访问 确认安全例外 在设置里选preference -> Advanced -> Certificates -> View Certificates 可以在里面找到自签名的证书

rewrite重写规则(重定向)

调整用户浏览的URL,看起来规范 合乎开发及产品人员的需求 为了让搜索引擎收录网站内容,让用户体验更好 企业会将动态URL地址伪装成静态地址提供服务 网站更换新域名后 例如,访问京东的360buy.com会跳转到jd.com 根据特殊的变量、目录、客户端信息进行跳转 URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中

================================================================================ rewrite <regex> <replacement> [flag]; 关键字 正则 替代内容 flag标记 关键字:其中关键字error_log不能改变 正则:perl兼容正则表达式语句进行规则匹配 替代内容:将正则匹配的内容替换成replacement flag标记:rewrite支持的flag标记 flag标记说明: last #本条规则匹配完成后,继续向下匹配新的location URI规则 break #本条规则匹配完成即终止,不再匹配后面的任何规则 redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 例子: rewrite ^/(.*) http://www.czlun.com/$1 permanent; 说明: rewrite为固定关键字,表示开始进行rewrite匹配规则 regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址 replacement部分是http://www.czlun.com/$1 $1,是取自regex部分()里的内容。匹配成功后跳转到的URL。 flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.czlun.com/$1 地址上 ================================================================================ ########################################### . : 匹配除换行符以外的任意字符 ? : 重复0次或1次 例如“do(es)?”能匹配“do”或者“does”,"?"等效于"{0,1}" + : 重复1次或更多次 如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o” * : 重复0次或更多次 #如“ol*”能匹配“o”及“ol”、“oll” \d :匹配数字 ^ : 匹配字符串的开始 $ : 匹配字符串的结束 {n} : 重复n次 {n,} : 重复n次或更多次 [c] : 匹配单个字符c [a-z] : 匹配a-z小写字母的任意一个 ###########################################

实现http—>https(重定向1)

location 是在 server 块中配置。可以根据不同的 URI 使用不同的配置(location 中配置),来处理不同的请求。 vim nginx.conf server { listen 443 ssl; server_name localhost; 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 /web; index index.html index.htm; } } server { listen 80; server_name www.westos.org; rewrite ^/(.*)$ https://www.westos.org/$1; ##$1表示用户在这里输入的内容保留,只会重定向$1前面的 #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; 永久重定向(可以缓存,临时的不允许缓存) } ## permanent 返回301永久重定向

#再加一台虚拟主机

server { listen 443 ssl; server_name www.westos.org bbs.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 /web; # index index.html index.htm; #} location / { root /bbs; index index.html; } } mkdir /bbs vim /bbs/index.html <h1>bbs.westos.org</h1> nginx -s reload 重新重定向(2) server { listen 80; server_name www.westos.org; #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; rewrite ^/bbs$ https://bbs.westos.org/index.html permanent; #表示访问www.westos.org并且以bbs结尾的,都定向到https://bbs.westos.org } 重定向3 server { listen 80; server_name bbs.westos.org; #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; rewrite ^/bbs$ https://bbs.westos.org permanent; rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; } #浏览器测试:是bbs.westos.org对应的根目录 '先匹配第一条重写规则定向到bbs.westos.org,然后再定向到下一条规则' 重定向4:整合 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 ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; if ($host = "bbs.westos.org") { #$host : 请求主机头字段,否则为服务器名称 rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent; } location / { root /web; index index.html; } } nginx -s reload cd /web/ cp -r /bbs/ . 测试:curl -I bbs.westos.org

防盗链

准确的说,只有某些时候,这种跨站访问资源,才被称为盗链。假设B站点作为一个商业网站,有很多自主版权的图片,自身展示用于商业目的。而A站点,希望在自己的网站上面也展示这些图片,直接使用。常见的防盗链系统,一般使用在图片、音视频、软件等相关的资源上。

提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件。换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。 如果想对自己的网站进行防盗链保护,则需要针对不同的情况进行区别对待。如果网站服务器用的是apache,那么使用apache自带的Url Rewrite功能可以很轻松地防止各种盗链,其原理是检查refer,如果refer的信息来自其他网站则重定向到指定图片或网页上。 如果服务器使用的是IIS的话,则需要通过第三方插件来实现防盗链功能了,现在比较常用的一款产品叫做ISAPI_Rewrite,可以实现类似于apache的防盗链功能。另外对于论坛来说还可以使用“登录验证”的方法进行防盗链。

1.先配置盗链 server1上的vim.jpg被盗链,server2是盗链者 server1上不需要改变什么配置,只用把www.westos.org这个域名保留 在server2上修改虚拟主机配置: server { listen 80; server_name daolian.westos.org; charset utf-8;#不加这个参数网页上看到的汉字是乱码 location / { root /web; index index.html; } } 在物理机和各节点都配置解析 172.25.136.2 daolian.westos.org vim /web/index.html <html> <body> <br>盗链图片</br> <img src="http://www.westos.org/vim.jpg"> </body> </html> server1上需要把vim.jpg资源放到/web目录 server: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/index.html permanent; #rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; #if ($host = "bbs.westos.org") { # rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent; # } location / { root /web; index index.html; } } 访问: http://daolian.westos.org 发现访问到了server1上的vim.jpg资源,这就是盗链 2.#配置防盗链 server1上修改配置: 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 ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; #if ($host = "bbs.westos.org") { # rewrite ^/(.*)$ http://www.westos.org/$1 permanent; #} location / { root /web; index index.html; } location ~* \.(gif|jpg|png|jpeg)$ { root /web; valid_referers none blocked www.westos.org; if ($invalid_referer) { return 403; } } } 当访问域名为www.westos.org时正常访问,否则返回一个不可见小图标 3.#再优化防盗链配置,添加重定向规则 vim nginx.conf location ~* \.(gif|jpg|png|jpeg)$ { root /web; valid_referers none blocked www.westos.org; if ($invalid_referer) { rewrite ^/(.*)$ http://bbs.westos.org/daolian.jpg;##放置警告标语 } } } server { listen 80; server_name bbs.westos.org; location / { root /bbs; index index.html; } } 当盗链访问server1时,重定向到另外一张图片,作出警告
最新回复(0)