nginx配置图片服务器,nginx配置健康检查

nginx 防盗链简单配置

通常我们不希望自己网站的图片、文件等被一些未经允许的网站应用,那么我们可以在nginx里做一些配置来阻止这些网站的访问。

我们将使用nginx的valid_referers指令来做防盗链,下面来简单介绍下valid_referers指令。

语法:

valid_referers [none|blocked|server_names]...

默认值:none

使用环境:server,location

该指令会根据Referer Header头的内容分配一个值为0或1给变量$invalid_referer。如果Referer Header头不符合valid_referers指令设置的有效Referer,变量$invalid_referer将被设置为1.

该指令的参数可以为下面的内容:

none:表示无Referer值的情况。

blocked:表示Referer值被防火墙进行伪装。

server_names:表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。

简单介绍完后小伙伴们可能会想为啥要用这个参数做防盗链呢?

我们知道HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理。下面我们在浏览器里面打开几个页面来体验下这个参数

下面我们准备一张图片test.jpg,和两台服务器,注意笔者的nginx版本是1.17的,不同的版本可能配置稍微有点不同。

服务器A:47.93.121.3

服务器B:175.24.110.203

笔者将图片test.php放到服务器A上,并能够正常访问

接着我们在服务器B上写一个test.htm来引用这张图片:

访问看下:

能够正常访问。

但是我们希望服务器B在没有经过允许的情况下不能访问这张图片,那我们就需要配置下服务器A的nginx

那我们再在服务器B上看还能不能访问到这张图片:

发现已经不能访问这张图片,那我们再看看服务器A能不能访问:

07《Nginx 入门教程》Nginx 的 Http 模块介绍(上)

本部分内容将详细介绍 Nginx中对 Http请求的 11个处理阶段,分成 3个小节讲解并进行相关实验操作。

Nginx将一个 Http请求分成多个阶段,以模块为单位进行处理。其将 Http请求的处理过程分成了 11个阶段,各个阶段可以包含任意多个 Http的模块并以流水线的方式处理请求。这 11个 Http阶段如下所示:

网上有人做了一个非常形象的图片,如下图所示。我们可以看到 11个阶段的处理顺序,以及每个阶段中涉及到的相关模块以及模块之间的顺序。

POST_READ阶段是 Nginx接收到 Http请求完整头部后的处理阶段,这里主要使用的是 realip模块获取用户的真实地址,方便后续对该 IP进行限速或者过滤其请求等。

SERVER_REWRITE和后面的 REWRITE阶段一般是使用 rewrite模块修改 Http请求的 uri,实现请求的控制。

FIND_CONFIG阶段只是做 location的匹配项。

PREACCESS、ACCESS和 POST_ACCESS是和 Http请求访问权限相关的阶段。PREACCESS阶段是在连接之前要做的访问控制,这个阶段有 limit_conn和 limit_req等模块工作。ACCESS阶段是解决用户能不能访问,比如根据用户名、密码限制用户访问(auth_basic模块)、根据 ip限制用户访问(access模块)以及第三方模块认证限制用户的访问(auth_request模块)。POST_ACCESS是在 ACCESS之后要做的一些工作。

TRY_FILES阶段为访问静态文件资源而设置的。有时候又称之为 PRECONTENT阶段,即在 CONTENT阶段之前做的事情。主要是 try_files模块在此阶段工作。

最重要的 CONTENT是处理 Http请求内容的阶段,大部分 HTTP模块介入这个阶段,比如 index、autoindex、concat以及反向代理的模块都是在这里生效的。

LOG是处理完请求后的日志记录阶段,如 access_log模块。

realip模块是在 postread阶段生效的,它的作用是:当本机的 nginx处于一个反向代理的后端时获取到真实的用户 ip。如果没有 realip模块,Nginx中的$remote_addr可能就不是客户端的真实 ip了,而是代理主机的 ip。

realip模块的配置实例如下:

set_real_ip_from是指定我们信任的后端代理服务器,real_ip_header是告诉 nginx真正的用户 ip是存在 X-Forwarded-For请求头中的。

当 real_ip_recursive设置为 off时,nginx会把 real_ip_header指定的 Http头中的最后一个 ip当成真实 ip;

而当 real_ip_recursive为 on时,nginx会把 real_ip_header指定的 Http头中的最后一个不是信任服务器的 ip(前面设置的set_real_ip_from)当成真实 ip。通过这样的手段,最后拿到用户的真实 ip。

rewrite模块可以看到它在 SERVER_REWRITE和 REWRITE阶段都有介入。rewrite模块的主要功能是改写请求的 uri。它是 Nginx默认安装的模块。rewrite模块会根据正则匹配重写 uri,然后发起内部跳转再匹配 location,或者直接做30x重定向返回客户端。rewrite模块的指令有 break, if, return, rewrite, set等,这些都是我们常用到的。

return指令返回后,Http请求将在 return的阶段终止,后续阶段将无法进行,所以许多模块得不到执行。

1、将 regex指定的 url替换成 replacement这个新的 url,可以使用正则表达式及变量提取。

2、当 replacement以 http://或者 https://或者$schema开头,则直接返回 302重定向

3、替换后的 url根据 flag指定的方式进行处理

if指令的条件表达式:

location匹配是在 FIND_CONFIG阶段进行的,我们需要掌握 location的匹配规则和匹配顺序。

有一个简单总结如下:

即:

realip模块默认没有被编译进 Nginx的,我们需要在源码编译阶段使用–with-http_realip_module,将 realip模块编译进来后方可使用。接下来,我们做个简单测试,首先准备一个 server块如下:

首先,我们将 real_ip_recursive设置为 off,然后做一次请求:

这里返回的是头部参数 X-Forwarded-For中最后一个 ip,如果将 real_ip_recursive设置为 on,此时,由于 set_real_ip_from中设置218.19.206.164为信任的方向代理 ip,那么 Nginx会往前找一位,认为 1.1.1.1是用户的真实ip。

我们写一个简单配置如下:

先测试if指令,当请求方法为 POST时,我们能得到‘post request!’这样的字符串输出。GET请求时候,针对 404情况,会跳转到/403.html,我们准备一个 403.html页面,里面写上’403, forbidden!’这一行内容,开始下面的 Http请求:

如果我们打开 return 405这行指令,则 error_page将不会生效,连同后面的 location匹配也不会生效。无论我们发送如何请求,都会返回405的错误信息。这是因为 server中的 return指令是在 SERVER_REWRITE中执行的,而 location匹配则是在下一个阶段 FIND_CONFIG中执行的,所以上一个阶段在 return后,根本不会进入后面的阶段执行。

首先,我们准备环境,首先是新建一个目录 third(全路径为/root/test/third),再该目录下新建一个文件 3.txt,里面只有一行内容‘hello, world’。接下来,我们准备一个 server块,加到 Http指令块中:

上述配置中,要打开 rewrite_log指令,这样我们可以看到 rewrite指令的相应日志,方便查看结果。

当我们在/second配置中,使用 break时,请求命令:

如果是不使用 break标识,则请求结果如下:

首先是/first/3.txt请求在/first中匹配,并被替换为/second/3.txt, last标识表示将继续进行匹配,在/second中,uri又被 rewrite成/third/3.txt,如果后面跟了 break标识,表示 rewrite到此结束,不会执行后面的 return指令,直接请求静态资源/third/3.txt,得到其内容’hello, world’;如果是没有 break标识,则会在执行 return指令后直接返回,并不会继续执行下去,最后返回’second!'字符串。

我们按照这样的 location规则,进行匹配实验,结果如下:

这里介绍了 Nginx处理 Http请求的 11个阶段,并重点介绍了前三个阶段POST_READ、REWRITE以及FIND_CONFIG以及这些阶段中涉及到的模块和指令。前面讲到的指令都是 Nginx中的高频指令,必须要熟练掌握。

图片服务器的搭建01

nginx+vsftp搭建图片服务器

前言:

在分布式架构中,往往会有多个tomcat,然后你上传的图片只是在其中的某一个tomcat,你访问时是由集群的tomcat随机提供服务。当你访问的tomcat是有图片的那个时,图片能正常显示,如果恰巧是那个没有图片的tomcat时,图片就不能正常显示。这就完成了访问同一个图片,可能你刷新一次可以访问,再刷新一次图片就访问不到了。这时,我们就需要一个服务器用来专门存储图片,一般我们都用nginx。

1、nginx+vsftp:

上面分别介绍了nginx和vsftp,那么这两个东西怎么组合起来用呢?怎么实现这个图片服务器呢?我们知道,tomcat安装好启动后,在浏览器输入localhost:8080,就会出现tomcat的欢迎页,nginx也一样。比如linux的ip是192.168.50.122,那么启动nginx后,在浏览器访问这个地址也会出现nginx的欢迎页,其实是因为它有个默认的访问页面,完整的地址应该是192.168.50.122/index.html,那么我们就可以根据这个,把它默认的访问页面改成我们上传的图片的保存路径,比如上传了一张pic.jpg图片到linux的/home/ftpuser/images中,如果我们把默认访问页面改成/home/ftpuser,那么在浏览器中输入192.168.50.122/images/pic.jpg,就可以访问到这张图片了。下面就来介绍nginx、vsftp的安装以及配置。

<meta charset="utf-8">

1、安装:

2、添加ftp用户:

3、给ftp用户添加密码:

输入两次密码后修改密码。

4、修改selinux:

①查看状态:

执行这个命令可以看到

这两个都off,执行如下命令设置为on:

再次执行 getsebool-a| grep ftp看到那两个状态是on就行了。

5、关闭匿名访问:

执行

命令:

还要在vsftp.conf文件最下面添加以下内容:

然后保存退出即可。

6、设置开机启动:

7、测试:

打开filezilla工具,输入虚拟机的ip,21端口,用户名和密码,点击快速连接,连接vsftp服务:

如图所示则连接成功。

<meta charset="utf-8">

按照以上步骤安装好nginx和vsftp后,还是不能访问上传的图片的,需要进行如下配置:

执行

命令,打开nginx的配置文件:

按道理这样就可以了,但是我访问却报错:

403 forbidden,最后发现是因为ftpuser文件夹没有可读权限,执行如下命令:

再次访问即可成功!

至此图片服务器搭建完成!至于在Java中如何使用这个图片服务器,请参考 Java实现把图片上传到图片服务器。

在搭建的过程中,遇到很多坑,因为我参考的教程是centos 6,防火墙是iptables,而centos 7是firewall,

阅读剩余
THE END