root
与alias
主要区别在于nginx
如何解释location
后面的uri
,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是:root
路径+location
路径
alias的处理结果是:使用alias
路径替换location
路径
alias是一个目录别名的定义,root则是最上层目录的定义。
root实例:
location ^~ /t/ {
root /www/root/html/;
}
如果一个请求的URI是/t/a.html
时,web服务器将会返回服务器上的/www/root/html/t/a.html
的文件。也就是root路径+location路径
alias实例:
location ^~ /t/ {
alias /www/root/html/new_t/;
}
如果一个请求的URI是/t/a.html
时,web服务器将会返回服务器上的/www/root/html/new_t/a.html
的文件。注意这里是new_t
,因为alias
会把location
后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
注意:
alias
时,目录名后面一定要加/
。alias
在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。alias
只能位于location
块中。(root
可以不放在location
中)先上概括: 就近原则
当直接访问服务器,不加其他路径访问时,并且nginx配置中,含有location /{}配置时,nginx的location会优先匹配到此代码块,会指向此代码块中的root , server中的root, 不会生效。当去掉/ 配置,nginx找不到匹配到的location代码块时候,才会才执行server中的root。----也就是就近原则。
和location中的一样在server中的
如果一个请求的URI是/t/a.html
时,匹配不到location中的url的时候,web服务器将会返回服务器上的/www/root/html/t/a.html
的文件。也就是root路径+请求路径
当第一次访问http://47.105.XXX.XX/
将location / {}去掉再次访问http://47.105.XXX.XX/
这个参数是比较常用的,普通的负载均衡也是使用这个参数来实现的
proxy_pass
后面可以直接写ip
,也可以写upstream的name
。
proxy_pass
最后面如果没有“/”
代表将匹配的location
也转发过去,如果有“/”则不会携带location规则
比如proxy_pass不带“/”
location /aaa/bbb {
proxy_pass http://aaa;
}
则请求/aaa/bbb ->转发 192.168.0.239:9000/aaa/bbb
比如proxy_pass带“/”
location /aaa/bbb {
proxy_pass http://aaa/;
}
则请求/aaa/bbb ->转发 192.168.0.239:9000/
配置demo
upstream aaa {
server 192.168.0.239:9000;
}
server {
listen 80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_header_buffer_size 10m;
location /cloud/ {
proxy_pass http://aaa/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
在使用默认的nginx
配置时,有时候我们的upstream
的命名中带有下划线,这个时候请求时会报400
异常,这是因为nginx
转发的时候默认会把upstream
的name
当成http header
中的host
传递过去。
而且tomcat
是遵循的RFC1-1034
的规范的,所以任务请求不合法。
此时可以修改upstream
名字为驼峰
或者在nginx
中覆盖默认的http header host
#加在location中
proxy_set_header HOST $host;