文章目录
nginx版本: 1.18.0
location命中后
如果是root,会把请求url的 ip/域名+port替换为root指定的目录,访问资源
如果是alias,会把请求url的ip/域名+port+匹配到的路径替换为alias指定的目录,访问资源
以请求http://example.com/foo/bar/hello.html 为例,location配置如下
location /foo {
root /home/hfy/;
}
匹配到/foo,url的域名+port替换为root指定的目录,即url中的examp.com被替换为了/home/hfy,所以实际访问的路径为/home/hfy/foo/bar/hello.html
为了更好理解,再来一个例子,请求的url不变,location配置更改为
location /foo/bar {
root /home/hfy/;
}
匹配到/foo/bar,url的域名+port替换为root指定的目录,即url中的examp.com被替换为了/home/hfy,所以实际访问的路径仍然为/home/hfy/foo/bar/hello.html。root在替换时不会替换匹配到的路径。
location会从url最左边的路径匹配,如果一致则命中该location。只有中间匹配到不会命中。
比如请求的url为http://example.com/foo/bar/hello.html ,location为
location /bar {
root /home/hfy/;
}
不会命中该location,因为从url中的/foo开始匹配,与location /bar不一致,不会命中,如果url更改为http://example.com/bar/hello.html 才会命中该规则
在location内部其实默认配置了一条规则index index.html,补全后的规则如下
location /foo {
root /home/hfy/;
index index.html;
}
假设我们访问的url为http://example.com/foo/bar ,匹配到/foo,实际访问的路径为/home/hfy/foo/bar。如果我们的bar是一个文件夹,其中如果包含index.html文件,则会把该文件返回。所以index的作用是,当实际访问的是一个目录时,会返回该目录中index指定的文件,如果该目录中不存在index指定的文件,则会返回403。
在访问http://example.com/foo/bar ,时我们打开浏览器的控制台,查看发送的请求,会发现发生了一个301重定向,http://example.com/foo/bar 被重定向为http://example.com/foo/bar/ ,由此引发了新的问题,为什么会发生重定向,url末尾的/,location 匹配路径末尾的/,以及root 指定目录末尾的/都表示什么意思
经过我的多次测试,发现解析url工作流程图如下

上述的工作流程,假设了url末尾没有加/,如果末尾包含/,解析流程为上图中绿色部分。例如url为http://example.com/foo/ ,如果foo不存在或者是文件,则直接返回404,如果是foo是目录,则进入到绿色部分流程。如果foo目录中存在index指定的文件,则返回该文件。如果不存在返回403。从这个例子可以看出,url末尾加/表示要访问一个目录,如果实际是个文件,nginx会返回404。
根据上述的流程图,我们看一下2.3中的重定向问题,在访问http://example.com/foo/bar 为什么发生了301重定向。
首先命中如下规则
location /foo {
root /home/hfy/;
index index.html;
}
根据上述的流程图,先替换域名+port,实际访问的路径为/home/hfy/foo/bar,然后nginx发现bar不是文件而是个目录(文件夹),所以重定向为了http://example.com/foo/bar/ 访问bar这个目录中的index.html文件
然后再看一下2.3中的另一个问题,末尾的/分别是什么含义
事先声明,仅是我个人粗浅的理解,根据对不同情况的测试,尝试总结 '/'的含义
http://example.com/foo/bar 表示我们把bar当成一个文件,想要访问bar文件
http://example.com/foo/bar/ 表示我们把bar当成一个目录,想要访问bar目录下index指定的文件
location /foo {
root /home/hfy/;
index index.html;
}
/foo 既能匹配http://example.com/foo 也能匹配 http://example.com/foo/
location /foo/ {
root /home/hfy/;
index index.html;
}
/foo/只能匹配http://example.com/foo/
location /foo {
root /home/hfy/;
index index.html;
}
/home/hfy 表示把hfy当成目录或者文件
/home/hfy/ 表示只把hfy当成目录
root后面指定的都应该是目录 (不过alias有种特殊情况,后面会提到)
对于这三个斜杠,在实践中可以有如下使用方案
以请求http://example.com/foo/bar/hello.html为例,location配置如下
location /foo {
alias /home/hfy/;
}
匹配到/foo,url的ip/域名+port+匹配到的路径替换为alias指定的目录,即url中的example.com/foo被替换为了/home/hfy,所以实际访问的路径为/home/hfy/bar/hello.html
同样再来一个例子,请求的url不变,如果location配置更改为
location /foo/bar {
alias /home/hfy/;
}
匹配到/foo/bar,url的ip/域名+port+匹配到的路径替换为alias指定的目录,即url中的example.com/foo/bar被替换为了/home/hfy,所以实际访问的路径为/home/hfy/hello.html。alias在替换时会替换匹配到的路径。
alias其余特性,最左匹配、index、location解析url工作流程、末尾’/'与root一致。
url http://example.com/foo
/home/hfy/foo是一个文件
location配置如下
location /foo {
alias /home/hfy/foo;
}
实际访问路径/home/hfy/foo,nginx返回foo文件。
这就是上面说的特例,alias也可以指定文件,并且正常返回了要访问的文件。但是实际一般不会用alias指定文件。
url http://example.com/foo
/home/hfy/foo是一个文件
location配置如下
location /foo {
alias /home/hfy/foo/;
}
实际访问路径/home/hfy/foo,alias指定 /home/hfy/foo/是一个目录,而foo是一个文件,返回404。
/home/hfy/foo是一个文件
location配置如下
location /foo/ {
alias /home/hfy/foo;
}
实际访问路径/home/hfy/foo/要访问目录,alias指定/home/hfy/foo是目录或文件,而foo是一个文件,返回了500。
url http://example.com/foo/
/home/hfy/foo是一个文件
location配置如下
location /foo/ {
alias /home/hfy/foo/;
}
实际访问路径/home/hfy/foo/,alias指定/home/hfy/foo/是一个目录,而foo是一个文件,返回了404。
url http://example.com/
/home/hfy/foo是一个文件
location配置如下
location / {
alias /home/hfy/foo;
}
实际访问路径/home/hfy/foo,但是返回了500。
url http://example.com/
/home/hfy/foo是一个文件
location配置如下
location / {
alias /home/hfy/foo/;
}
实际访问路径/home/hfy/foo,返回404。
url http://example.com/foo
/home/hfy/foo是一个文件
location配置如下
location /foo {
root /home/hfy/foo;
}
实际访问路径/home/hfy/foo/foo,不存在,返回404。
url http://example.com/foo
/home/hfy/foo是一个文件
location配置如下
location /foo {
root /home/hfy/;
}
实际访问路径/home/hfy/foo,返回foo文件。
url http://example.com/foo/
/home/hfy/foo是一个文件
location配置如下
location /foo {
root /home/hfy/;
}
或
location配置如下
location /foo/ {
root /home/hfy/;
}
实际访问路径/home/hfy/foo/要访问目录,/home/hfy/foo是文件,返回404。
url http://example.com/
/home/hfy/foo是一个文件
location配置如下
location / {
root /home/hfy/foo;
}
实际访问路径/home/hfy/foo,foo是一个文件,但是却返回404。
url http://example.com/
/home/hfy/foo是一个文件
location配置如下
location / {
root /home/hfy/foo/;
}
实际访问路径/home/hfy/foo,foo是一个文件,但是却返回404。
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(
我想在共享服务器上建立一个jekyll博客。当我尝试安装Jekyll时,我得到“您没有写权限”。我该如何在没有root或sudo的情况下解决这个问题?更多细节:我在共享服务器上有空间,但没有根访问权限。我无法安装Ruby,尽管托管公司应我的要求安装了它。当我尝试安装Jekyll时我使用user@hosting.org[~]#geminstalljekyll这是我得到的回应:ERROR:Whileexecutinggem...(Gem::FilePermissionError)Youdon'thavewritepermissionsintothe/usr/lib/ruby/gems/1.
我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
我正在尝试使用ruby脚本进行一些headless测试。本质上,我在显示器:1上执行Xvfb,然后使用watir-webdriver启动Watir::Browser.new(:firefox)。如果您以root身份运行脚本,效果会很好-我可以运行x11vnc并观察脚本执行浏览器并与之交互。问题是,我需要能够从Rails应用程序调用这个ruby脚本,而不是以root身份运行它...如果我尝试以普通用户身份从命令行运行脚本,Xvfb会启动on:1像往常一样,但Watir不会启动浏览器......它最终会在60秒后超时。通过VNC连接会显示带有鼠标光标的黑屏。我可以从命令行完成所有操
我有带有gemwebsocket-rails0.7的Rails3.2应用程序。在开发机上,一切正常在生产环境中,我使用Nginx/1.6作为代理服务器,Unicorn作为http服务器。Thin用于独立模式(在https://github.com/websocket-rails/websocket-rails/wiki/Standalone-Server-Mode之后)。nginx配置:location/websocket{proxy_passhttp://localhost:3001/websocket;proxy_http_version1.1;proxy_set_headerUp
Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect
我目前正在运行Foreman在暂存(Ubuntu)上,一旦我开始工作,就会切换到使用upstart。我的Procfile.staging看起来像这样:nginx:sudoservicenginxstartunicorn:bundleexecunicorn-c./config/unicorn.rbredis:bundleexecredis-serversidekiq:bundleexecsidekiq-v-C./config/sidekiq.yml我可以使用以下方法成功启动nginx:$sudoservicenginxstart然而,当我运行$foremanstart时,当其他三个进程成