location的路由匹配规则
参见:
参考:
(Nginx路由匹配规则的一些理解)[https://www.jianshu.com/p/a7348eded963]
添加访问的权限认证
参见:
一个配置 Nginx TPS提升了近50倍
大家好,我是玉米。今天,我想与大家分享一个实际的性能压测案例,展示了通过仅一项配置更改,即NGINX的压缩设置,我们怎样实现了性能提升高达50倍。
首先,让我们来了解一下背景场景:通常,为了方便不同地区的用户快速获取静态资源,我们会将这些资源存放在CDN上。这样不仅加速了内容的分发,还有效减轻了我们服务器的负担。然而,一旦这些文件更新,CDN需要从我们本地的NGINX服务器拉取新的缓存文件,因此我们的流量主要来源于CDN同步文件状态的需求。
接下来,我们讨论的配置环境是一台配置为双核2GB内存的云服务器,虽然配置不高,但足以展示我们的测试。我们使用了三个压缩后的文件进行测试:第一个文件非常小,只有375字节,它是一个压缩后的简单JSON对象。第二个文件是一个88KB的HTML索引页面,经压缩后减少至50KB。我们的测试步骤首先是获取并测试这个索引页面在NGINX上的最高吞吐量(TPS),然后开启静态文件压缩,直接返回压缩后的文件,再次测试TPS。最后,我们测试了小文件的TPS。
在初始设置下,我们从200的并发请求开始,每30秒增加100,并发直到系统不再能够处理请求为止。测试结果显示,当并发用户数达到600,TPS达到352时,服务器开始出现失败的请求,这时CPU使用率已达100%。在此场景下,我们的压缩比例是6:1。在另一个测试场景中,初始并发设为300,我们调整了压缩比例至2:1,此时并发用户数可以达到700,TPS提升至854。然而,由于CPU达到100%使用率,系统开始报错,事务成功率不再是100%。
进一步优化后,开启静态压缩功能,NGINX直接返回压缩后的文件,我们观察到并发用户数激增至2400,平均TPS可达约10000,事务成功率保持在100%。尽管如此,随着测试的进行,我们注意到CPU使用率虽然高,但未满载,TPS却不再增长。分析原因,发现是网络接口卡(NIC)达到了其带宽极限,导致数据传输成为瓶颈。当我们切换到更小的文件,即我们的帮助页面时,并发用户数飙升至超过10000,TPS更是达到了惊人的30000+,但最终还是由于CPU使用率达到100%导致的性能瓶颈。
通过这个案例,我们学到的经验是,对于一些文件,提前进行压缩并开启静态压缩可以有效节省系统CPU资源。在许多浏览器或系统访问时,默认会要求服务端使用GZIP进行压缩,以减少网络传输数据量。因此,在实施压缩时,我们必须权衡压缩过程中CPU资源的消耗。感谢大家的聆听,希望这次分享对你们有所帮助。
nginx如何开启静态文件压缩?
在Nginx中开启静态文件压缩通常涉及到配置gzip模块。下面是一些基本的步骤和配置示例,用以开启并优化Nginx的静态文件压缩功能:
编辑Nginx配置文件:这通常是在Nginx的主配置文件
nginx.conf中,或者在特定的站点配置文件中,位于/etc/nginx/nginx.conf或/etc/nginx/sites-available/目录下的某个文件。配置gzip模块:在
http、server或location块中,添加或修改以下指令来开启和配置gzip压缩:gzip on;:开启gzip压缩。gzip_disable "msie6";:关闭对旧版IE浏览器的gzip压缩。gzip_vary on;:根据请求头中的Accept-Encoding值变化,发送Vary响应头。gzip_proxied any;:在所有代理请求上开启压缩。gzip_comp_level 6;:设置压缩级别(范围是1-9,1压缩比最小/最快,9压缩比最大/最慢)。gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;:定义哪些MIME类型应该被压缩。通常包括HTML、CSS、JavaScript等文件类型。
重启Nginx:配置完成后,需要重启Nginx以使更改生效。可以使用如下命令:
1
sudo systemctl restart nginx
或者如果你不使用systemd,可以使用:
1
sudo service nginx restart
下面是一个配置gzip压缩的示例:
1 | http { |
确保在更改配置之前备份原始文件,并在修改后测试Nginx配置的有效性,可以使用nginx -t命令来检查配置文件的语法是否正确。
Nginx 隐藏版本信息
在Nginx中隐藏版本信息是一个简单但有效的安全措施,可以减少潜在攻击者收集到的信息量,从而降低被攻击的风险。默认情况下,Nginx在错误页面和响应头(Server头)中显示其版本信息。要隐藏这些信息,您需要进行以下配置:
1. 修改Nginx配置
在nginx.conf文件中(通常位于/etc/nginx/nginx.conf),需要添加或修改两个指令:
server_tokens off;:这个指令可以禁止在响应头中显示Nginx的版本号。server_name_in_redirect off;(可选):如果使用了重定向,这个指令可以防止Nginx在重定向的URL中包含服务器名,从而提高安全性。
示例配置
打开nginx.conf文件,然后找到http块,在其中添加或确保存在以下指令:
1 | http { |
2. 重新加载Nginx配置
修改配置后,您需要重新加载Nginx以使更改生效。可以使用以下命令来重新加载配置:
1 | sudo nginx -s reload |
或者,如果您使用的是系统服务管理工具(如systemd),可以使用:
1 | sudo systemctl reload nginx |
注意事项
虽然这些步骤可以有效地隐藏Nginx的版本信息,增加了一定的安全性,但重要的是要记住,安全不仅仅是隐藏信息。确保您的Nginx和所有运行的应用程序都保持最新,定期应用安全补丁,并实施综合的安全策略,才能更有效地保护您的服务器不受攻击。
隐藏版本信息是安全最佳实践的一部分,但不应仅依赖于此。确保定期审查和更新您的安全配置,以应对新出现的威胁。
有时候,你可能会突然收到安全部门或甲方发来的整改报告,提醒你Nginx存在安全漏洞需要修复。你可能会吓得半死,担心出现了严重的漏洞。但查看后发现,原来只是暴露了Nginx的版本信息。为什么Nginx的版本信息这么重要,不能泄露呢?因为Nginx也可能存在一些安全漏洞,官网上可以查看到Nginx最近的一些漏洞信息。如果Nginx版本信息被泄露,黑客可能会根据这些漏洞对你发起攻击。因此,隐藏Nginx的版本信息是为了防止被攻击。
今天,我们将讲解如何隐藏Nginx的版本信息。有两种方法:第一种是通过配置文件直接实现;第二种是通过修改Nginx源码并重新编译实现。首先,我们可以直接编辑Nginx的主配置文件,在http指令集下添加server_tokens off;指令,适用于所有server。这样配置后,Nginx就不会显示版本信息了。
如果Nginx服务已经部署,可以添加这个参数来实现。如果Nginx还没有部署,我们可以修改Nginx源码中定义版本信息的部分,比如将其改为“JD Web Server 2.2”,然后进行编译和安装。这样,不需要添加server_tokens指令,直接重新加载配置文件后,访问时服务器会显示自定义的服务器名称和版本信息,而不再显示Nginx的版本信息。
这就是两种隐藏Nginx版本信息的方法。希望这次的讲解对大家有所帮助。如果有任何疑问或需要更多信息,请随时私信我。
Nginx访问控制模块-应用防火墙
在Nginx中应用防火墙主要起到保护Web应用免受恶意流量和攻击的作用,如SQL注入、跨站脚本攻击(XSS)、文件上传漏洞、DDoS攻击等。这些防火墙通常称为Web应用防火墙(WAF),它们通过一系列的规则来识别和拦截恶意流量,确保Web应用的安全性和可用性。
作用
- 防止恶意软件攻击:防火墙可以检测到恶意软件的尝试性攻击,例如SQL注入或XSS攻击,并阻止这些请求到达应用服务器。
- 减少DDoS攻击的影响:通过限制请求速率或拒绝来自已知恶意IP地址的流量,防火墙可以帮助缓解分布式拒绝服务(DDoS)攻击的影响。
- 提供自定义访问控制:可以配置规则以允许或拒绝特定的用户、IP地址或地理位置访问网站。
- 数据泄露防护:通过监控和过滤敏感数据,防火墙可以帮助防止数据泄露。
如何使用
Nginx本身不内置WAF功能,但可以通过集成第三方模块或服务来实现WAF能力。最常用的Nginx WAF解决方案包括ModSecurity和NAXSI。
ModSecurity
ModSecurity是一个开源的跨平台Web应用防火墙,可以与Nginx一起使用。要在Nginx中使用ModSecurity,需要:
- 安装ModSecurity库:首先,需要在服务器上安装ModSecurity。这可能需要从源代码编译Nginx,以包括ModSecurity依赖项。
- 配置ModSecurity规则:ModSecurity使用一系列的规则来识别和拦截恶意请求。OWASP提供了一个核心规则集(CRS),这是一个很好的起点。
NAXSI
NAXSI是一个高性能、低规则维护需求的WAF模块,专为Nginx设计。使用NAXSI通常涉及:
- 安装NAXSI:与ModSecurity类似,安装NAXSI可能需要从源代码编译Nginx,以包括NAXSI模块。
- 配置NAXSI规则:NAXSI依赖于基本规则集和自定义规则来提供保护。您需要根据应用的具体需求来配置这些规则。
实施建议
- 测试规则:在生产环境中部署新规则之前,先在开发或测试环境中测试规则,以确保它们不会错误地阻止合法请求。
- 持续更新规则:定期更新WAF规则,以保护免受新出现的威胁。
- 监控和日志分析:监控WAF的警报和日志,以便及时发现并响应潜在的安全事件。
使用WAF是提高Web应用安全性的重要措施之一,但它应该与其他安全最佳实践(如定期更新软件、使用HTTPS、最小权限原则等)结合使用,以构建多层防御策略。
我将继续向大家介绍Nginx中的常见功能模块。通过学习这些Nginx的功能模块,我们可以进一步熟悉并了解Nginx的配置文件。今天要介绍的Nginx模块是,它默认已经编译好的Access访问控制模块。这个模块可以为我们实现简单的访问控制功能。我们可以进入Nginx的源码目录,通过./configure --help命令,我们可以过滤出Access模块。这个模块通过--without-http_access_module标识,在编译过程中,如果我们不通过该指令,那么这个模块会被默认编译进Nginx。如果指定了该指令,那么则表示你将禁用该模块。
我们也可以访问Nginx的官网,查看该模块提供了哪些指令。其中,这个模块为我们提供了两个指令:一个是allow(允许),另一个是deny(拒绝)。这两个指令通常可以配合使用。它们的作用域大致是一致的,可以在http、server、location中配置,甚至还能对特定的请求方法进行限制。
下面,我们简单配置一下,来看看它的功能。直接编辑Nginx的配置文件,如果我们直接在http指令块中配置,那么它的作用是针对整个Nginx服务的,即对所有虚拟主机生效。比如,我来添加一个指令deny 192.168.199.1;来限制特定IP访问。配置好之后,重新加载Nginx配置文件。这样,访问192.168.199.100时,就会发现访问被拒绝了。
如果我们将配置项放到特定的server块中,那么该配置只对该server有效。访问该server的任意资源时都将被拒绝,而其他虚拟主机不受影响。同样,如果我们将指令放到location块中,那么限制将更加具体,只有访问特定路径时才会被拒绘。
最后,limit_except指令可以用于限制除了特定请求方法之外的所有请求。例如,如果我们希望仅允许PUT请求,可以使用limit_except PUT { allow all; }来配置。
通过上述示例,我们可以看到,Nginx的Access模块提供了灵活的访问控制策略,既可以实现全局访问控制,也可以针对特定的虚拟主机或路径进行细粒度的访问限制。希望今天的分享对大家有所帮助,如果还有不清楚的地方,欢迎在官网查找相关案例进行测试和学习。
Nginx实用的认证模块
在Nginx中,认证模块用于增加对网站或应用部分区域的访问控制,通过要求用户提供有效的用户名和密码来实现。这可以帮助保护敏感内容不被未经授权的用户访问。Nginx支持多种认证方法,最常见的包括基本认证(Basic Authentication)和第三方认证模块,如LDAP认证。
基本认证
基本认证是最简单的HTTP认证形式,它通过HTTP头部传递未加密的用户名和密码(经过Base64编码)。虽然这种方法简单,但因为密码传输是未加密的,所以只推荐在SSL/HTTPS连接下使用。
如何配置
- 创建密码文件:首先,使用
htpasswd工具创建一个密码文件,该文件将存储用户名和密码。如果系统中没有htpasswd,可以通过安装Apache工具包来获取它。
1 | sudo htpasswd -c /etc/nginx/.htpasswd username |
这将提示您为用户输入密码。-c参数用于创建新文件,如果文件已存在,则不应使用-c参数,以避免覆盖现有文件。
- 配置Nginx:接下来,在Nginx配置文件中(通常是
nginx.conf或站点特定的配置文件),设置需要保护的区域,添加auth_basic和auth_basic_user_file指令。
1 | location /protected/ { |
这里/protected/是需要保护的路径,"Restricted Content"是提示用户的认证请求消息,/etc/nginx/.htpasswd是存储用户名和密码的文件路径。
- 重新加载Nginx配置:更改配置后,重新加载Nginx以使更改生效。
1 | sudo nginx -s reload |
第三方认证
对于更复杂的认证需求,如LDAP、OAuth 2.0或JWT认证,Nginx可以通过第三方模块或与外部认证服务集成来实现。这些方法通常需要安装额外的模块或编写自定义的认证服务。
- LDAP认证:通过第三方模块支持,如
nginx-auth-ldap,可以将Nginx与LDAP服务器集成,进行用户认证。 - OAuth 2.0/JWT:可以通过Nginx的
auth_request模块将请求转发到一个内部服务,该服务负责处理OAuth 2.0或JWT令牌的验证。
配置第三方认证通常涉及更多的步骤,需要根据具体的模块或服务的文档进行设置。
注意事项
- 基本认证虽然易于实现,但安全性较低,建议仅在HTTPS下使用。
- 对于更高的安全需求,应考虑使用更安全的认证方法,如第三方认证服务。
- 保持Nginx及其模块更新,以确保安全性和兼容性。
在上个视频中,我向大家介绍了Nginx的访问控制模块,这个模块可以帮助我们实现简单的防火墙功能。今天,我将继续介绍Nginx的认证模块。这个模块是Nginx默认编译的常规模块,非常实用。我们可以参考官方的用法说明。该模块提供了两个指令:一个用于定义响应报文,另一个用于定义用户认证的文件。当我们访问一个网页时,它会提示我们输入用户名和密码。这些用户名和密码就是在我们指定的文件中定义的。
该模块的作用范围与我们上一个视频介绍的访问控制模块相同。如果在HTTP指令块中配置,则全局有效;如果在Server中配置,则只对该Server有效;Location则只针对某些文件或路径有效;Limit则只针对某些请求方式有效。
下面我们来看一个示例。由于它的作用范围与上一个视频介绍的相同,我们就只举一个例子,不全部演示了。首先,我们打开配置文件,删除上个视频的配置。假设我们在Server或Location中配置,请求任何资源都需要用户认证。我们可以简单定义响应报文,如“用户认证”,然后指定用户认证的文件。这个文件我们放在配置文件同一目录下,文件名可以自定义,如password。然后我们创建这样一个认证文件,使用Apache提供的工具生成。用户名和加密后的密码会被保存在这个文件中。
然后我们启动Nginx服务,访问网站时,它会提示我们输入用户名和密码。如果你希望用户在访问某些目录时需要认证,而访问首页等页面时不需要认证,那么你需要将该指令放到Location中,比如说doc目录。这样,访问doc目录时才需要进行认证,访问首页和其他文件时不需要认证。
这就是Nginx认证模块的用法,简单且实用。希望大家能够尝试在不同作用域下配置和使用,了解其效果。
Nginx 防盗链
Nginx 防盗链如何配置?有何作用?
Nginx的防盗链配置是一种服务器端的技术,用于防止其他网站直接链接到您的静态资源(如图片、视频等),这种行为被称为“盗链”。防盗链可以帮助您减少不必要的带宽消耗,保护您的内容不被未经授权的第三方使用。
配置方法
在Nginx中配置防盗链,主要是通过修改Nginx的配置文件来实现,一般是在server或location块中使用valid_referers指令来定义哪些referer是合法的。以下是一个基本的配置示例:
打开Nginx的配置文件,通常位于
/etc/nginx/nginx.conf或者是站点特定的配置文件中,如/etc/nginx/sites-available/yourdomain.com。找到您想要防盗链的
server或location块,添加类似以下的配置:
1 | location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { |
这个配置的意思是:
- 对于jpg, jpeg, png, gif, ico, css, js等文件类型应用这个规则。
valid_referers指令定义了哪些referer是被允许的:没有referer(直接访问)、被阻止的referer、与服务器名匹配的请求、以及任何以”yourdomain.com”或”trusteddomain.com”结尾的域名。- 如果
$invalid_referer变量为真(即访问者的referer不在允许的列表中),则返回403禁止访问状态码。
作用
- 减少带宽消耗:防止其他网站通过直接链接您的资源来消耗您的服务器带宽。
- 保护内容:确保您的内容(尤其是版权内容)不会被未经授权的第三方轻易使用或显示。
- 提高安全性:通过限制哪些referer可以访问您的资源,可以作为网站安全策略的一部分,减少潜在的恶意行为。
需要注意的是,虽然防盗链能提供一定程度的保护,但它并不是完全无法被绕过的。有些方法,如修改HTTP请求中的Referer头部,仍然可以绕过这种保护。因此,它应该被视为多层次安全策略中的一部分。
在上个视频中,我向大家介绍了Nginx的认证功能。今天,我将继续介绍Nginx的防盗链功能,这是我们在日常运维和服务部署中非常实用的一个功能。有时,我们会发现网站流量异常庞大,但这些流量并没有带来正向的收益。这时,我们就需要考虑是否有人盗用了你的链接。
所谓的盗链,指的是如果你的个人网站是一个图片服务器,用来提供各种图片资讯,每张图片都会有独立的链接。如果有人觉得你的网站图片非常好看,但又不想自己去收集整理这些图片,他们可能通过爬虫等手段抓取你的所有图片链接,然后在自己的服务器上部署,使得用户访问他的网站时可以看到各种图片,但这些图片实际上是直接从你的服务器上拉取的。这就是盗链,即你的网站资源被他人利用,为别人“做嫁衣裳”。
这时候,我们就需要使用Nginx的防盗链功能,禁止别人盗取你的图片或视频链接。假设我们将当前节点的Nginx服务器作为原始的图片服务器来发布图片。首先确保两台服务器都部署了Nginx服务。如果你还不知道如何部署Nginx服务,可以参考我之前的视频。
接下来,我们上传一张图片作为测试。我们随便下载一张壁纸,并将图片上传到Nginx的发布目录,并命名为test.jpg。这样,我们就可以访问这个图片资源了。然后,我们可以把这个图片链接复制下来,在另一台服务器上创建一个网页来引用这个图片资源。
为了防盗链,我们需要在Nginx配置文件中进行相应的配置。我们可以创建一个location块,专门用来匹配媒体资源,如.jpg、.png等文件。然后,我们使用valid_referers指令来添加合法的引用来源,比如直接从我们的网站访问的用户或者一些固定的域名。对于非法的引用,我们可以配置Nginx返回403状态码或者重定向到一个特定的图片,如“盗图.jpg”。
通过这种配置,当有人尝试从非法来源引用我们的图片时,Nginx会阻止这种行为,保护我们的资源不被盗用。这样,我们就实现了防盗链功能,确保了资源的安全。
总的来说,Nginx的防盗链功能是一种非常有效的保护网站资源的方法,通过合理的配置,可以有效防止资源被非法引用,保护网站的流量和资源。
Nginx 防盗链(二)
在上个视频中,我向大家展示了Nginx防盗链的基本功能。有小伙伴可能对其中的几个参数不太了解,并通过私信希望我能做进一步的讲解。今天,我将详细解释这些参数的具体含义。我希望每个视频都足够简短,便于大家在上班途中或空闲时间学习一个知识点。但为了确保每个知识点讲解得清楚透彻,我会尽可能地进行演示,这可能会使视频时长变长,导致视频时长和知识点全面性之间存在一些冲突。如果有我未涉及的知识点,欢迎私信我,我会根据情况补充。
昨天我们提到了一个合法引用参数。这里的none参数表示直接访问资源时不会被拒绝。为了简化讲解,我们将参数直接放到Nginx配置文件的根位置,这样对所有文件的请求都会遵守下面的规则。none参数意味着如果直接访问网站,不会有Referer这个头信息,因此不会被防盗链规则拦截。
在Nginx的日志格式中,$http_referer变量用于获取请求来源。如果是直接访问,则这个变量没有值。我们可以通过查看访问日志验证这一点。清除浏览器缓存后再次访问资源,可以看到请求状态为200,表示从服务器获取资源成功,且Referer字段没有值,说明是直接访问。
另一个参数是valid_referers,它用于定义哪些Referer头信息是被允许的。当从网站首页点击文件时,请求会带有来自自身域名的Referer信息。我们通过设置autoindex on来开启目录索引,以便直观地看到目录中的文件。从网站点击图片时,请求头会包含Referer字段,记录了请求来源,这样的请求被视为合法。
为了测试这一功能,我们可以直接访问图片链接,并观察请求头。如果直接输入完整链接访问,则请求头中不会包含Referer字段。这证明了前面讲解的none和域名参数的作用。
最后,通过配置Nginx的防盗链功能,我们可以有效地防止资源被非法引用,保护网站内容。希望通过这个讲解,大家能对Nginx防盗链中的相关参数有了更深入的理解。如果有任何疑问或需要进一步的讲解,请随时私信我。
Nginx 强大的限速模块
在Nginx中,限速模块(Rate Limiting)用于控制客户端访问网站资源的速率,这有助于防止滥用和确保服务器资源的公平使用。限速可以应用于整个服务器、特定位置或特定的客户端IP地址。通过限制请求的速率,Nginx可以帮助减少恶意或过度的流量对服务器的影响,从而防止服务拒绝攻击(DDoS)和确保服务器资源对所有用户都能公平访问。
作用
- 防止服务器过载:限制到达服务器的请求速率,避免因突发流量或恶意攻击导致的服务器过载。
- 公平资源分配:确保服务器资源被平等地分配给所有用户,防止少数用户占用过多资源。
- 提高服务质量:通过避免过载,保持服务的响应性和可用性。
如何配置
Nginx的限速配置主要依赖于两个指令:limit_req_zone和limit_req。limit_req_zone用于定义限速规则,包括设置允许的请求速率和缓冲区大小;limit_req用于应用这些规则到特定的服务器或位置。
配置步骤
- 定义限速区域:
在http块中定义一个limit_req_zone,指定限速的键(如客户端IP)、速率和缓冲区大小。
1 | http { |
这个例子创建了一个名为mylimit的区域,使用客户端IP作为键,为每个IP地址分配了10MB的内存,限制每秒最多接收1个请求。
- 应用限速规则:
在server或location块中使用limit_req指令应用这些规则。
1 | location / { |
这里,limit_req应用了之前定义的mylimit区域,burst参数允许在超过设定速率时缓冲最多5个请求,nodelay表示不对前5个请求进行延迟处理。
高级配置
- 使用不同的键:除了使用客户端IP(
$binary_remote_addr),还可以根据请求的其他特征,如请求头或cookie,来定义限速键。 - 动态速率限制:通过使用变量设置
rate值,可以根据请求的特定属性动态调整速率限制。 - 处理超限请求:可以通过设置
limit_req的burst和nodelay参数来调整对超出速率限制请求的处理方式,例如,允许短时间内的突发请求或对超出限制的请求进行排队。
注意事项
- 限速设置需要仔细调整,以免过度限制导致合法用户的请求被拒绝。
- 在分布式系统中,如果有多个Nginx实例,需要考虑如何跨多个实例共享限速状态,因为
limit_req_zone的状态是本地于单个Nginx实例的。 - 对于需要高度定制化的限速策略,可能需要考虑使用第三方模块或服务。
今天,我继续为大家分享另一个Nginx模块——限速模块。如果你的服务器带宽有限,或者你需要对某些资源进行限速,那么这个模块可以非常轻松地帮你实现这一功能。我有一台Nginx服务器,先将Nginx服务启动,使用默认的配置。我们可以先看一下正常的下载速率。虽然这是我们内网环境,速率可能更快,但也足以用来测试。我准备了一张图片,随机选择几张图片来做测试,改名为test,然后上传。将图片移动到Nginx的默认发布目录,这样我们的下载服务器就部署好了。
假设这台服务器是我们的客户端,我们通过wget来下载服务器上的资源,速度非常快。现在,我们来看一下限速模块的设置。我们修改Nginx的配置文件,添加限速模块的指令。这个指令可以在http指令块中配置,也可以在server指令块中配置,还可以在location中配置。与之前介绍的模块一样,不同的作用范围会有不同的效果。这里我们直接在location里面配置,这样它将只对这个location有效。我们添加一个限速指令,比如设置为每秒0.5kb。配置完成后,我们重新加载配置文件。
重新下载后,我们可以看到速度明显比之前要慢。尽管刚开始速度可能稍大,但最终会降到我们设置的值大致范围。如果你想实现先下载一定量的数据再开始限速,我们可以在参数后面加上一个指令,比如设置为先下载40kb,达到40kb后开始限速。重新加载配置文件后,再次下载,可以看到先快速下载到40kb,然后速率慢慢降低。
需要注意的是,这个指令针对单个链接、单个请求有效。如果你建立两个链接,那么它会再次以不限速状态下载40kb,然后以设置的速率限速。因此,通过多线程下载可以规避服务器设置的限速。为了避免这种情况,我们可以在http指令块中添加一个限制连接的空间,用于记录客户端的连接请求状态。例如,通过设置限制同一个远程客户端IP地址只能与服务器建立一个链接。这样,客户端只能老老实实用一个线程下载,不能用多线程下载。
通过这种设置,我们可以针对整体流量进行限速,规避一些多线程下载工具,保证网络稳定。这就是今天的分享。希望对大家有所帮助。
nginx location规则详解
Nginx的location指令用于定义处理特定请求URI的方式,它是Nginx配置中非常核心的部分。通过使用location块,可以根据请求的URI来决定如何处理这些请求——比如代理传递到后端应用、重定向到其他地址、返回特定的文件等。
location指令的基本语法:
1 | location [ = | ~ | ~* | ^~ ] uri { |
- uri:这是要匹配的请求URI。
- 修饰符:
location指令可以包含修饰符,用于改变匹配规则的行为:=:进行精确匹配。~:进行区分大小写的正则匹配。~*:进行不区分大小写的正则匹配。^~:如果找到匹配,则不再对正则location进行搜索。- 无修饰符:进行前缀匹配,但优先级低于正则匹配。
匹配优先级:
- 精确匹配(
=)。 - 正则匹配(
~或~*),按它们在配置文件中出现的顺序。 - 前缀匹配(
^~)。 - 普通字符串前缀匹配,最长的匹配优先。
- 如果以上都没有匹配,会使用
/的通用匹配。
举例说明:
- 精确匹配:
1 | location = / { |
- 正则匹配区分大小写:
1 | location ~ /images/ { |
- 正则匹配不区分大小写:
1 | location ~* \.(gif|jpg|png)$ { |
- 前缀匹配并停止正则搜索:
1 | location ^~ /static/ { |
- 普通前缀匹配:
1 | location /docs/ { |
如果请求为/docs/index.html,将会由此location块处理,因为它是最长的前缀匹配。
注意事项:
- 正则表达式
location的匹配顺序是根据它们在配置文件中出现的顺序来决定的,而不是基于匹配的优先级或者特异性。 - 使用
=进行精确匹配可以提高匹配效率,因为一旦匹配成功,Nginx就不会再继续搜索其他location块。 - 当设计复杂的URI匹配规则时,理解各种
location匹配类型及其优先级是非常重要的,以确保请求被正确地处理。
通过合理地配置location块,可以灵活地控制Nginx如何响应不同的请求,实现负载均衡、缓存静态文件、保护敏感资源等多种功能。
今天,我将继续为大家分享Nginx中的location规则。我们之前介绍的Nginx模块还未完全讲完,后续我会继续分享。那么,什么是location呢?简单来说,location的主要功能是匹配用户的请求,定义用户请求的文件资源位于哪里,以及如何处理这些资源。我们可以通过location设置特定参数,决定资源的一些属性。
在Nginx的配置文件中,location指令块是用来配置如何处理特定请求的。如果我们只使用默认配置文件,访问时通常会看到“Welcome to nginx”这样一个页面。我们需要知道这个页面实际位于服务器的哪个位置。这就是通过location配置来定义的。比如,我们可以通过return指令,直接返回一个状态码和自定义内容,而不需要手动创建文件。
Nginx还有几个修饰符,可以决定用户的请求由哪个规则匹配来处理。例如,我们可以使用波浪号(~)来表示正则匹配,匹配以.JPG或.PNG结尾的文件,然后返回特定内容。这些修饰符包括精准匹配(=),非正则匹配(^~),以及大小写不敏感的正则匹配(~*)。
经过这些例子,我们可以得出结论:等号的精准匹配优先级高于非正则匹配的优先级,非正则匹配的优先级又高于正则匹配的优先级。如果没有任何匹配规则,所有请求默认会被根目录下的配置处理。在实际的企业环境中,我们很少会见到所有规则都有的情况。通常可能是匹配特定目录,然后定义资源路径或进行反向代理,这相对比较简单。但是,我们需要熟悉这些规则的用法。
Nginx重定向
Nginx中的重定向是一种服务器端操作,它将客户端请求从一个URL转发到另一个URL。这种操作对于网站维护、URL结构变更、保持SEO优化等方面非常重要。重定向可以通过Nginx配置文件中的rewrite指令或者返回特定的状态码(如301或302)来实现。
作用
- URL结构变更:当网站结构发生变化时,使用重定向可以确保旧链接依然可以访问,通过重定向到新的URL。
- 域名变更:当更换域名时,可以使用重定向将旧域名的访问重定向到新域名。
- 强制使用HTTPS:将HTTP请求重定向到HTTPS,增强网站安全性。
- 避免内容重复:例如,将
www和非www的访问统一到一个版本,有助于搜索引擎优化(SEO)。 - 用户友好:对于已删除或移动的内容,使用重定向可以引导用户到正确的页面,而不是显示404错误。
如何操作
1. 重定向特定页面
使用return指令执行301(永久重定向):
1 | server { |
2. 域名变更重定向
使用server_name匹配旧域名,并使用return指令重定向到新域名:
1 | server { |
3. 强制使用HTTPS
检测$scheme变量,如果不是https则重定向:
1 | server { |
4. 去除或添加www
- 去除www:
1 | server { |
- 添加www:
1 | server { |
5. 使用rewrite指令重定向
rewrite指令可以用于更复杂的重定向规则,如正则表达式匹配:
1 | server { |
这将所有/oldfolder/下的请求重定向到/newfolder/,并保持URL路径的相对位置不变。
注意事项
- 301重定向表示永久移动,而302表示临时移动。选择正确的状态码对SEO非常重要。
- 使用
rewrite进行复杂的重定向时,正则表达式的匹配和重定向逻辑需要仔细测试,以确保按预期工作。 - 在进行重大的URL结构更改或域名更换时,适当地使用重定向可以帮助保持搜索引擎排名和用户体验。
今天,我将继续为大家分享Nginx的重定向功能。我们重点讲解的是rewrite规则的写法。rewrite,顾名思义,就是重写。在Nginx的官网上,我们可以找到rewrite指令的用法,它由正则表达式、替代内容,以及一个或多个标志(flag)组成。正则表达式用来匹配用户的请求,替代内容定义了一旦匹配到用户请求的资源,我们将用哪些新资源来替代,而标志指定了重写操作的具体行为。
这里有四个常用的标志:last、break、redirect和permanent。我将通过实验来验证重定向的用法。首先,我们在Nginx的配置文件中定义几个匹配规则。例如,当用户请求a.html时,我们返回特定的响应。接下来,我们引入重写规则。比如,当请求a.html时,我们将请求重写到b.html。
接下来,我将引入重定向的四个标志,并解释它们的作用。如果我们在重写规则后面添加last标志,这表示终止当前location规则里的动作,并继续匹配其他规则。而break标志表示完全终止匹配过程,不再继续寻找其他匹配的规则。
redirect和permanent主要用于URL的重定向。redirect是临时重定向(302),而permanent是永久重定向(301)。通过这些标志,我们可以灵活地控制请求的重定向行为。
通过实验,我们可以看到重定向功能的强大。在后续的分享中,我会继续为大家介绍Nginx的更多重定向应用场景。希望大家能通过这些内容进一步熟悉和掌握Nginx的配置和使用。
原文链接: https://dashen.tech/2017/01/24/nginx神奇玩法小聚义/
版权声明: 转载请注明出处.