nginx静态资源服务器 Linux里面为什么nginx要做动静分离
各位老铁们好,相信很多人对nginx静态资源服务器都不是特别的了解,因此呢,今天就来为大家分享下关于nginx静态资源服务器以及Linux里面为什么nginx要做动静分离的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
详解nginx如何代理静态资源(长搜索路径优先)
web服务器重要的的任务之一就是服务静态资源文件,比如网站的图片,还有一些静态的HTML页面,本文的例子还是来自于Nginx官网。在这个用例中我们要配置两个静态资源路径,来处理外部的静态资源请求。我们会更改配置文件中,server块下http下的location。
首先需要创建/data/www目录,然后将index.html文件,文件的内容并不重要,本例只是指引我们观察nginx如何找到和发送静态资源。然后在创建一个/data/images目录,并放置一些图片文件。
下一步打开配置文件,默认的配置文件中已经包含了一些server块,大多数已经注释掉了,官网让我们把server块都注释掉,重写写一个新的空的server块,但注意,一定不要将http注释掉,nginx通过识别它才能知道我们需要处理的是http请求。
通常,配置文件可能会包含多个server块,这些server块可以由端口号区分,也可以由server names来区分。当nginx决定由哪一个server去处理请求的时候,nginx会根据server块中location参数去测试请求头中指定的URI
现在在server块中添加location块
该location块指定了URI请求的根目录前缀,"/"。对于请求来讲,URI被添加在root路径具体指向的目标路径,如果存在的多个匹配的位置块,nginx将选择前缀最长的位置块(可能是因为更加具体)。上方的location块提供的已经是最短前缀了,也就是说,server块中所有的location块如果都没有匹配到,则该location块将会被采用。
官网的说法真的非常绕,我觉得思路就是, nginx首先会优先去具体的location块匹配资源(规则是参数越长,越优先查找),如果都查不到就去根路径查。
我们再加一个location块
这个location块会匹配以/images/开始的请求,但上一个(location块 location/也会匹配该内容,记得吗,Nginx会先匹配长路径location块)
现在为了看的更加清楚,在加过这两部分内容之后的配置文件应该长这样
重新加载nginx之后,配置会更新,使用:
现在该配置文件已经生效了,配置在监听80端口的本地服务器上,我们可以在本地访问 http://localhost/,在此之后例如 http://localhost/images/example.png这样的请求, Nginx会映射到location/images/去,如果请求的资源不存在,Nginx将返回404页面,404页面是可以定制的,一般企业也会定制属于自己的404页面。
后续的内容我还打算针对一些常见场景,记录以下nginx的配置文件针对不同场景和需求该如何去写,以及为什么这么写。Nginx一些模块的详细介绍不打算专门写,大家如果有需求可以看官方文档。
http://nginx.org/en/docs/beginners_guide.html#conf_structure
初识Nginx配置文件以及基本命令
配置文件名为 nginx.conf,Linux放在目录:/usr/local/nginx/conf、/etc/nginx,或/usr/local/etc/nginx中;Windows放在安装目录\conf中。依据实际安装情况决定
nginx由配置文件中指定的指令控制模块组成。指令分为简单指令和块指令:
简单指令由空格分隔的名称和参数组成,并以分号;结尾;
块指令具有与简单指令相同的结构,但是是以大括号{和}包围的一组附加指令。如果块指令在大括号内部有其他指令,则称为上下文(例如: events, http, server和 location);
配置文件中放置在任何上下文之外的伪指令都被认为是主上下文。 events和 http指令驻留在主上下文中, server在 http中的,而 location在 server块中。一个配置文件一个 http,一个及以上个 server,一个 server运行一个工作进程并代表一个虚拟服务器;
#号所在的一行被视为注释;
几个顶级指令将适用于不同流量类型的指令组合在一起:
对于大多数指令,在子上下文中定义的上下文将继承父级中包含的伪指令的值,要覆盖从父进程继承的值,子上下文中需要包含该指令(即子上下文要显式声明)。
打开配置文件(如/usr/local/nginx/conf/nginx.conf),默认的配置文件已经包含了服务器块的几个示例,大部分是注释掉的。现在注释掉所有这样的块,并启动一个新的服务器块:
每个 server上下文都可以指定要监听的端口、server_name,当nginx决定哪个服务器处理请求后,它会根据服务器块内部定义的location指令的参数测试请求头中指定的URI,比如如下配置,系统中创建/data目录及其子目录/www:
第一个 location块指定与请求中的URI比较/前缀。对于匹配请求,URI将被添加到 root指令中指定的路径(即/data/www),形成本地文件系统中的请求文件路径。如果有几个匹配的location块,nginx将选择具有最长前缀来匹配location块。上面第一个 location块提供最短的前缀长度为1,因此只有当所有其他location块不能提供匹配时,才会使用该块。第二个 location,将是以/images/的请求来匹配,位置/也匹配这样的请求,但具有较短前缀,也就是/images/比/长。
这已经是一个在标准端口 80上侦听并且可以在本地机器上访问的服务器 http://localhost/的工作配置,端口 80和 server_name localhost可以省略,它们为默认值。响应以/images/开头的URI的请求,服务器将从/data/images目录发送文件。例如,响应 http://localhost/images/logo.png请求,nginx将发送服务上的/data/images/logo.png文件。如果文件不存在,nginx将发送一个指示 404错误的响应。不以/images/开头的URI的请求将映射到/data/www目录。例如,响应 http://localhost/about/example.html请求时,nginx将发送/data/www/about/example.html文件。
反向代理应该是Nginx做的最多的一件事了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
通过向nginx配置文件添加一个server块来定义代理服务器,其中包含以下内容:
这将是一个监听端口 8080的简单服务器,并将所有请求映射到本地文件系统上的/data/up1目录。请注意,root指令位于server块上下文中,当选择用于服务请求的 location块不包含自己的 root指令时,将使用此root指令。创建/data/up1目录然后可以将一个静态网页比如 index.html文件放入其中,然后访问 http://localhost:8080/即可访问该文件。
目前为止,还是配置的静态资源访问,并不是代理服务器,然后增加或修改现有 location上下文,改为如下:
当用户访问 http://localhost:8080/时,会返回 http://localhost:8181服务器的的资源。
location上下文后面的参数,可以是正则表达式,如果是正则表达式,前面要加~,比如:
以上配置表示,nginx接收到所有以.gif,.jpg或.png结尾的URI,相应的请求将映射到/data/images目录。当nginx选择一个location块来提供请求时,它首先检查指定前缀的location指令,记住具有最长前缀的location,然后检查正则表达式。如果与正则表达式匹配,nginx会选择此location,否则选择之前记住的那一个。
要找到最符合URI的位置,NGINX首先将URI与前缀字符串的位置进行比较。然后用正则表达式搜索位置。除非使用^~修饰符对正则表达式给予更高的优先级。在前缀字符串中,NGINX选择最具体的字符串(也就是最长和最完整的字符串)。下面给出了选择处理请求的位置的确切逻辑:
测试所有URI的前缀字符串。=(等号)修饰符定义了URI和前缀字符串完全匹配。如果找到完全匹配,则搜索停止。如果 ^~(插入符号)修饰符预先添加最长匹配前缀字符串,则不会检查正则表达式。存储最长匹配的前缀字符串。根据正则表达式测试URI。断开第一个匹配的正则表达式并使用相应的位置。如果没有正则表达式匹配,则使用与存储的前缀字符串相对应的位置。
=修饰符的典型用例是/(正斜杠)的请求。如果请求/是频繁的,则指定=/作为location指令的参数加速处理,因为搜索匹配在第一次比较之后停止。
要启动nginx,请运行可执行文件。当nginx启动后,可以通过使用-s参数调用可执行文件来控制它。使用以下语法:
信号(signal)的值可能是以下之一:
当主进程收到要重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果这是成功的,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。否则,主进程回滚更改,并继续使用旧配置。老工作进程,接收关闭命令,停止接受新连接,并继续维护当前请求,直到所有这些请求得到维护。之后,旧的工作进程退出。
两者在 location中,指定一个路径,其中使用 alias做如下配置:
若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。alias是一个目录别名的定义,root则是最上层目录的定义,指的是/var/www/image/img/。还有一个重要的区别是alias后面必须要/结束,否则会找不到文件,而root则可有可无。
另外对于index,含义如下
这样,当用户请求/地址时,Nginx就会自动在 root配置指令指定的文件系统目录下依次寻找 index.htm和 index.html这两个文件。如果 index.htm文件存在,则直接发起“内部跳转”到/index.htm这个新的地址;而如果 index.htm文件不存在,则继续检查 index.html是否存在。如果存在,同样发起“内部跳转”到/index.html;如果 index.html文件仍然不存在,则放弃处理权给 content阶段的下一个模块。
参考地址1
参考地址2:B站
Linux里面为什么nginx要做动静分离
在 Linux系统中,使用nginx做动静分离是用来提高性能和网站的可用性。
动静分离的原理是将网站的静态内容(例如图像,CSS文件和 JavaScript文件)与动态内容(例如由后端 Web应用程序生成的内容)分开存储和传输。
这样做可以提高网站的整体性能,因为它可以让您的 Web服务器专注于处理动态内容,而另一台服务器专注于传输静态内容。这有助于减少 Web服务器的负载,并有助于提高网站的响应速度和可用性。
除此之外,还有别的方案吗?
当然有,除了做动静分离,还有其他一些方法可以提高网站的性能和可用性。例如,可以使用内容分发网络(CDN)来传输静态内容,以减少对 Web服务器的负载。
您还可以使用缓存来减少对后端数据库的访问,从而提高性能。
此外,您还可以使用服务器集群来扩展您的网站的处理能力,以应对高流量。
总之,要提高网站的性能和可用性,您可以根据您的具体情况来选择适合您的方案。
内容分发网络(CDN)是一种分布式网络,它将网站的内容存储在许多不同的服务器上,并从最近的服务器向用户发送内容。这与传统的网站架构不同,其中所有内容都存储在单个服务器上,并由该服务器直接向用户发送。CDN可以提高网站的性能和可用性,因为它可以减少对单个服务器的负载,并使内容更快地传递给用户。CDN通常用于传输静态内容,例如图像,视频和音频文件。
使用 CDN的方式取决于您的网站架构。如果您的网站使用传统的服务器端技术(例如 PHP或 ASP.NET),则可以在您的 Web服务器上安装 CDN插件。该插件会将您的静态内容存储在 CDN上,并在向用户发送内容时从 CDN获取内容。如果您的网站是基于静态网站生成器或静态托管平台构建的,则可以通过将您的内容存储在 CDN上来启用 CDN。此外,您还可以通过配置您的域名解析记录来将流量路由到 CDN。总之,使用 CDN的方式因您的网站架构而异,您需要根据您的具体情况来选择适合您的方法。
关于本次nginx静态资源服务器和Linux里面为什么nginx要做动静分离的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。