Nginx文件访问控制、结构优化和适配移动端
写在前面在前面我们使用Nginx基于来源IP或者用户账号密码等信息来做用户访问控制,其实使用类似的原理还可以使用Nginx来实现根据扩展名来限制程序和文件的访问、禁止访问指定目录下的所有文件和目录(屏蔽某些目录)等配置功能。之后还会学习如何对Nginx程序结构进行优化,最后介绍如何适配PC或者移动设备。
根据扩展名来限制程序和文件的访问一般来说,现在很多网站都是以用户为中心的,不仅支持用户发布文本内容到服务器,甚至还支持用户发送图片、视频、文件等内容到服务器上,但是给用户开启上传功能是很危险的,极有可能带来重大问题。
接下来举一个简单的例子,使用Nginx禁止访问上传资源目录下的PHP、SHELL、PYTHON、JAVA、GO等程序文件,这样即使用户上传了木马文件也无法执行,可以提高系统的安全性。如下所示:
1234567891011location ~ ^/images/.*\.(php|php5|sh|py|java|go)$ { deny all;}location ~ ^/static/.*\.(php|php5|sh|py|java|go)$ { ...
Nginx防盗链、爬虫和虚拟目录
写在前面前面学习的都是一些比较枯燥的内容,接下来学习一下较为有趣的配置,如使用Nginx来设置防盗链、防爬虫和虚拟目录等,学习和掌握这些有趣的知识可以提升自己的综合能力。
防盗链为什么需要防盗链?现在随着自媒体的发展,很多人开始以博流量为由,各种复制别人发布的文章,更有甚至将其标为原创来盗取他人的劳动成果,因此防盗链的设置显得尤为重要。
一般来说,当开发者对该网站做好防盗链之后,其他网站盗链本站的图片就会全部失效无法显示,但是如果用户是通过浏览器来访问本网站或者直接访问图片地址时,这些图片依旧是可以正常显示,且可以右键下载到本地,所以这只是对网站做的防盗链,对于用户还是挺友好的。
这是使用的是ngx_http_referer_module模块,通常使用它来阻挡非法的域名请求,请注意伪装Referer头部其实非常简单,因此这个模块只能用于阻挡大部分非法请求,而有些正常请求,如用户直接访问是不会携带Referer头部,但是这种情况是应当被允许的,因此不能拒绝来源Referer头部为空的请求。
在vhost文件夹下面新建一个hero.com.conf的配置文件,其中的内容为:
1234567 ...
Nginx安全优化
写在前面前面学习的都是如何使用Nginx,接下来学习更深层次的Nginx优化知识。我们可以通过修改或者隐藏Nginx版本号,或者更改Nginx服务的默认用户等方式来提升Nginx的安全性。
隐藏Nginx版本号在浏览器中访问一个不存在的链接,可以看到页面出现如下所示的信息:
可以看到它直接暴露了Nginx的版本号,这肯定是不安全的,除了这个版本号之外,还有其他的信息也是较为敏感的,开发者可以进入到Nginx安装所在机器,执行如下命令来查看输出信息:
12345678910[root@envythink vhost]# curl -I 127.0.0.1HTTP/1.1 200 OKServer: nginx/1.17.0Date: Wed, 18 May 2020 07:02:59 GMTContent-Type: text/htmlContent-Length: 612Last-Modified: Tue, 03 Nov 2020 01:18:28 GMTConnection: keep-aliveETag: "5fa0afe4-264"Accept-Range ...
Nginx日志文件
写在前面在前面学习Nginx目录结构的时候,可以发现它有一个logs目录,这是nginx日志的默认目录,里面包括访问日志(access.log)、错误日志(error.log)以及nginx.pid文件。nginx.pid文件就是nginx进程在启动后会将其pid写入这个文件中,这个没什么好学习的。现在学习的重点就是访问日志(access.log)和错误日志(error.log)。
访问日志(access.log)访问日志文件(access.log)记录了每个用户对网站的访问请求,这个功能是ngx_http_log_module模块提供的,access.log文件可以帮助站长分析用户的浏览行为。
日志格式首先打开access.log文件,查看一下其中的内容,如下所示:
可以看到日志文件的记录格式为“访问IP+访问时间+请求方法+请求路径+HTTP版本+状态码+代理信息”,这些都是我们从日志文件中能获取到的,但是这些肯定是可以定制的。
回忆之前的Nginx主配置文件nginx.conf,可以发现里面有如下一段代码:
也就是下面的代码片段其实就是用来定义日志文件的输出格式,这是默认的格 ...
Nginx解决跨域问题
写在前面在前面我们学习了HTTP请求、响应报文、简单请求和非简单请求,接下来开始学习Nginx如何解决跨域问题。
简单请求和非简单请求首先对前面学习的简单请求和非简单请求相关内容进行回顾。为什么需要区分简单请求和非简单请求,那是因为浏览器处理简单请求和非简单请求的方式不一样。
如果某个请求同时满足下面两个条件,那么该请求就属于简单请求:(1)请求方法是GET、POST或者HEAD三者中的任意一个;(2)HTTP头信息不超过下面几个字段:Accept、Accept-Language、Content-Language、Last-Event-IDContent-Type。请注意Last-Event-IDContent-Type只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain;
除此之外,凡是不同时满足这两个条件的,都属于非简单请求。
前面说过浏览器会针对这两种请求采取不同的处理方式,那么具体的处理方式又是怎样的呢?
简单请求对于简单请求来说,浏览器会在其头信息中增加Origin字段后直接发出,Orig ...
Nginx安装第三方模块和访问控制
写在前面在前面学习了Nginx如何实现反向代理和负载均衡,接下来开始学习如何在Nginx中安装第三方模块,以及如何基于来源IP或者用户名密码来对访问进行控制。
Nginx安装第三方模块前面介绍的4中负载均衡方法中,有两个是第三方模块,需要在Nginx中提前安装它们。开发者只需进入Nginx所在目录,然后执行如下编译命令即可:
1./configure --prefix=/你的安装目录 --add-module=/第三方模块目录
为了更好的获得演示效果,这里以Nginx安装echo模块为例进行介绍。请注意笔者Nginx的安装目录为/usr/local/nignx,下载目录为/home/envythink/nginx-1.17.0,这两者是不同的,当开发者需要执行编译或者安装第三方插件的时候,就需要进入到下载目录进行编译安装。
第一步,安装前测试。首先在/usr/local/nginx/conf/vhost下的envy.com.conf文件内新增如下的server配置:
123456789server { listen 82; server_name envy.com; ...
Nginx实现负载均衡
写在前面在前面我们对Nginx如何实现本地请求转发和反向代理进行了学习,接下来学习Nginx另一个较为重要的用途,实现服务端的负载均衡。
负载均衡负载均衡介绍一般情况下,客户端发送多个请求到服务器,服务器将处理这些请求,不过其中一部分请求可能要操作一些资源,如数据库、静态资源等,服务器处理完成请求后,再将结果返回给客户端。
对于早期的系统来说,由于功能不复杂,且并发请求相对较少,因此上述模式可以适用。但是随着业务不断更迭、访问量和数据量也在飞速发展,此时这种模式已经无法满足实际要求,当并发量比较大的时候,服务器非常容易发生宕机和崩溃。
很明显这就是服务器性能瓶颈带来的访问过载,除了不断加机器之外,还需要使用负载均衡来解决这一问题。
在请求数量达到指数级增长的时候,单个机器性能再优秀也无法满足需求,这时就必须采用集群的方式,将请求分发到多个机器上,其实就是将负载分发到多个机器上,这就是负载均衡。负载均衡的核心就是分摊压力。一般来说,Nginx实现负载均衡就是将请求转发给多个服务器,也就是服务器集群。
举一个司空见惯的例子,当你早高峰乘坐地铁的时候,工作人员会拿着大喇叭告诉你:“请往车厢两 ...
Nginx实现反向代理
写在前面通过前面的学习,我们已经对Nginx有了一个初步的认识,那么接下来将通过实际的例子来学习Nginx如何实现反向代理。
反向代理入门演示在实际工作中,服务器最常用的功能就是反向代理。使用反向代理后,直接收到请求的服务器是代理服务器,然后代理服务器将请求转发给内部网络上真正进行处理的服务器,并将得到的结果返回给客户端。也就是说,反向代理隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。反向代理一般用在需要处理跨域请求的时候,现在基本上大型的网站都设置了反向代理,下面简单介绍一下如何实现反向代理。
(1)考虑到后续的效果演示,这里修改之前在nginx.conf主文件中的导入配置,之前只是导入了vhost目录下的某个名为envythink.com.conf的配置文件,而在实际工作中肯定需要导入多个,因此将其修改为如下所示的信息:
1include vhost/*.conf;
(2)在/usr/local/nginx/conf/vhost目录下新建一个名为envy.com.conf的配置文件,其中的代码如下所示:
1234567891011# /usr/local/ngi ...
Nginx虚拟主机
写在前面在了解了Nginx相关的基础知识后,接下来将正式进入Nginx的实战内容。首先来学习Nginx的虚拟主机,这是后续学习其他知识的基础。
虚拟主机概念虚拟主机,在Web服务中可以理解为是一个独立的网站站点,这个站点具有“独立的域名”(所谓的独立域名可以是真的不同域名和IP地址,也可以是同一域名的不同端口),独立的程序和资源目录,可以独立的向外提供服务。
类型既然前面说了“独立的域名”的不同含义,因此这里的类型就是对实际“独立的域名”的解释和分类:(1)基于域名的虚拟主机:采用不同的域名来区分不同的虚拟主机或者对外提供服务;(2)基于端口的虚拟主机:采用相同的域名,但是以不同的端口来区分不同的虚拟主机或者对外提供服务;(3)基于IP的虚拟主机:采用不同的IP地址来区分不同的虚拟主机或者对外提供服务,这种方式在生产中使用的较少;
以上三种类型可以单独使用,也可以混合使用,具体如何使用需要结合具体场景来选择。
虚拟主机配置实例为了更好的学习和使用Nginx虚拟主机,这里分别对前面介绍的基于域名的虚拟主机、基于端口的虚拟主机和基于IP的虚拟主机这三种方式进行实战练习。
基于域名的虚拟主机 ...
Nginx主配置文件
写在前面考虑到Nginx主配置文件的重要性和日常使用的高频率,这里专门拿出一篇文章来深入学习nginx.conf主配置文件,灵活配置nginx.conf主配置文件是学好Nginx的关键所在。
Nginx配置文件在nginx目录下有一个conf目录,里面存放的都是与Nginx配置相关的文件,一般来说我们修改的都是名为nginx.conf的主配置文件。该配置文件由若干个部分组成,每个大括号{}表示一个部分,每行指令都由分号结束;,用于表示一行的结束。去除nginx.conf主配置文件中的注释代码,完整的内容如下所示:
12345678910111213141516171819202122232425262728worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepa ...