SGTMS

做事情
我们是认真的
您的位置:SGTMS>速记>Nginx配置总结

Nginx配置总结

正文

Nginx在日常工作中使用很频繁,成为WEB发布中重要的中间件,讲一讲我在Nginx使用中的一些问题。

一、alias和root

使用alias时里面加/,外面就要加/;里面不加外面也不能加;alias代理的是整个完整路径,包括最后的/。

location /user {  
                alias       /opt/webapps;  
                try_files $uri $uri/ /index.html
                index  index.html index.htm; 
            }    
#或者
     location /user/ {  
                alias       /opt/webapps/;  
                try_files $uri $uri/ /index.html
                index  index.html index.htm; 
            }

用root时外面有没有/,和里面有没有/无所谓;外面的路径最后会拼接在里面路径的后面。

二、proxy_pass和rewrite

proxy_pass后面加不加 / 匹配有所不同,一般整站代理最精简的proxy_pass即可跑起来。

代理不带项目名称,没有 /

server {
		
	listen      7001;
	
	  server_name locahost;
	
	  location /proxy/ {
	
	    proxy_pass  http://127.0.0.1:7000;
	    proxy_set_header Host   $host;
            proxy_set_header X-Real-IP      $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	  }
}

代理不带项目名称,但是有 /

server {

  listen      7002;

  server_name locahost;

  location /proxy/ {

    proxy_pass  http://127.0.0.1:7000/;
    proxy_set_header Host   $host;
    proxy_set_header X-Real-IP      $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

}

结论:

proxy_pass 后面不带 /,我们自定义的路径名会当成url的一部分拼接到后端url里。

7001端口实际访问http://127.0.0.1:7000/proxy/index.html proxy_pass

后面带 /,我们的自定义的路径名就不会被视作url的一部分去拼接到后端url。

7002端口实际访问http://127.0.0.1:7000/index.html

proxy_pass带后缀斜杠,如果此处写成/proxy 那么后端接收到的路由就是//,前面会有两个斜杠,所以alais后面要加/。

如果是带 / 这种情况,location后面只能用 =、^~、/ 匹配方式,也就是精确匹配、开头匹配及通配,不能使用~正则匹配这种方式,会报错:nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /usr/local/nginx/conf/nginx.conf:69

Nginx提供了rewrite指令,用于对地址进行重写,语法规则:

rewrite "用来匹配路径的正则" 重写后的路径 [指令];
# 去除前缀rewrite重写路由
location /proxy {
        # rewrite指令重写路由:通过正则匹配取出proxy之外的部分,然后用捕获子组重设了请求URI
        # 传递给后端的URI是已经被重设过的
        rewrite ^/proxy/(.*)$ /$1 break;
 
        proxy_pass http://127.0.0.1:7000;
 
        # 因为URI经过rewrite指令 请求/proxy/apidate/2022实际已经被重写成了/apidate/2022
        # 所以传递给后端时proxy_pass带不带后缀斜杠已经不影响,也就是说重写前提下述这种带后缀斜杠的写法也是没有问题的,但是并不推荐这样写
        # "^/proxy/(.*)$":匹配路径的正则表达式,用了分组语法,把/proxy/以后的所有部分当做1组
        # /$1:重写的目标路径,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始),即/proxy/后面的所有。这样新的路径就是除去/proxy/以外的所有,就达到了去除/proxy前缀的目的
        # break:重写路径结束后,不再重新匹配路径。
        # 这里有一个调试技巧,通过return 204仅返回头部,以及添加自定义header头来返回需要调试的内容进行debug
        # 利用add_header指令将当前的参数输出到header,然后返回204就可以看到$uri、$query_string当前的值
        location /cc {
                add_header 'X-Request-Uri' $uri;
                add_header 'X-Request-Uri' $request_uri;
                add_header 'X-Request-Query' $query_string;
                return 204;
        }

三、try_files

try_files $uri $uri/ /index.html

try_files,尝试访问对应的资源,在第一个资源访问不到时,访问第二个资源,以次向后。

$uri 表示一个文件,$uri/ 表示一个目录。

所以以上配置的规则为当 $uri 和 $uri/ 均不是对应资源时,则返回 /index.html页面。

本文最后更新于2022-5-22,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Nginx配置总结》
文章链接: https://www.sgtms.com/shorthand/87.html
本站资源仅供个人学习交流,转载或者引用本文内容请注明来源及作者,不允许用于商业用途。
分享到:

相关推荐

网友评论抢沙发

路人甲 表情
Ctrl+Enter快速提交