nginx proxy_pass & rewrite exp.

昨天新建的一个站点, phppgadmin, 用于连接pg-xl, greenplum, postgresql , 作为一个数据库demo站点.

参考

http://blog.163.com/digoal@126/blog/static/163877040201462235618643/

原来的做法是新建一个server, server_name和dba.sky-mobi.com相同, 新增一个监听端口8001来区分这个server和老的80端口所在的wiki站点. 这样的话访问db demo站点就是dba.sky-mobi.com:8001.

这样的话, 如果我以后还想用这个域名新增站点的话, 还要加端口, 对外端口就比较多了, 而且如果新增的站点IP地址变更的话, 就需要新增域名, 所以不利于多站点的扩展.

一个比较通俗可行的办法是利用nginx的代理功能和重写功能, 这样对外都是80, 内部可以有多个站点, 也不用局限于1台主机.

修改nginx.conf, 新增一个location.

vi nginx.conf

在80 端口的server下面新增一个location, 注意使用^~来旁路规则表达式的location.

        location ^~ /demo/db {
            rewrite ^/demo/db(.*)$ $1 break;  # 重写uri, break不再继续匹配location.
            proxy_pass http://127.0.0.1:8001;   # http代理
        }

原来配置的8001的server保持不变, (甚至可以架设到其他主机上, 只要这台nginx http代理能访问到即可).

    server {
        listen       0.0.0.0:8001;
        server_name  dba.sky-mobi.com;
        root /site/phppgadmin;
        location / {
            index  index.php index.html index.htm;
        }
        location ~ \.php$ {
                include /opt/nginx1.6.0/conf/fastcgi_params;
                fastcgi_pass   127.0.0.1:9000;   # php-fpm的监听
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
    }

重载配置文件 : 

nginx -s reload

这样的话访问dba.sky-mobi.com/demo/db/* 就会代理到 http://127.0.0.1:8001. (因为代理的数据完全由代理服务器转发, 不需要客户端直接访问后端的web server.)

注意, 如果访问dba.sky-mobi.com/demo/db, 会报错, 因为rewrite后的uri为空, 所以报错如下

2014/07/23 09:19:25 [error] 9300#0: *2713 the rewritten URI has a zero length, client: 172.16.8.29, server: dba.sky-mobi.com, request: "GET /demo/db HTTP/1.1", host: "dba.sky-mobi.com"

务必使用dba.sky-mobi.com/demo/db/ 访问 , 那么rewrite后$uri='/', 就不会报错了.

[后记]

感谢Channer的热心回复, 文档上有相关的说明, 眼拙没有看仔细, 哈. 

对于使用了代理处理的location , 末尾加斜线的处理, 不会导致匹配不到 .

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

If a location is defined by a prefix string that ends with the slash character, and requests are processed by one of proxy_pass,fastcgi_passuwsgi_passscgi_pass, or memcached_pass, then the special processing is performed. In response to a request with URI equal to this string, but without the trailing slash, a permanent redirect with the code 301 will be returned to the requested URI with the slash appended. If this is not desired, an exact match of the URI and location could be defined like this:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

加了斜线后, 如果使用proxy_pass 处理URI的话, 如果请求的URL没有/结束, 则自动添加这个/.

[参考]
1. http://blog.163.com/digoal@126/blog/static/163877040201462235618643/

2. http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

3. http://openresty.org/download/agentzh-nginx-tutorials-en.html

时间: 2024-11-03 20:47:03

nginx proxy_pass & rewrite exp.的相关文章

nginx 伪静态Rewrite正则资源汇总_nginx

本站一个服务器本来是windows 系统,采用ISAPI_Rewrite来进行Url重写,其中有一个规则是 RewriteRule ^/(.{6})(\d{3})(.+)/php/ http://www.xxx.com/qq$2.apk [NC,L,NU] 中间用到了{6}指前面的字符得复6次,然后平移动linux系统下面,采用nginx 的Rewrite来重写url 结果加载nginx的时候提示报错 复制代码 代码如下: rewrite ^/(.{6})(\d{3})(.+)/php/ htt

nginx重写rewrite基础及实例分享_nginx

nginx rewrite 正则表达式匹配 大小写匹配 ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配 -f和!-f用来判断是否存在文件 -d和!-d用来判断是否存在目录 -e和!-e用来判断是否存在文件或目录 -x和!-x用来判断文件是否可执行 flag标记 last 相当于Apache里的[L]标记,表示完成rewrite break 终止匹配, 不再匹配后面的规则. redirect 返回302临时重定向 地址栏会显示

nginx配置rewrite规则的例子

一.伪装动态的地址为静态地址 这种是最常用和最简单的,所谓的动态地址即带有参数的URL 如:真实访问地址是http://www.test.com/a.php?b=test 但想通过rewrite实现地址的静态化,方便用户访问想改为http://www.test.com/test.html Apache: RewriteEngine On RewriteRule /test.html /a.php?b=test [L] Nginx: rewrite "/test.html" /a.php

Nginx实现Rewrite规则详细教程及实例讲解

语法 Nginx的Rewrite相比Apache的要好理解很多,主要使用指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令. rewrite  代码如下 复制代码 语法: rewrite regex replacement [flag]; 默认值: - 上下文: server, location, if 如果指定的正则表达式能匹配URI,此URI将被replacement参数定义的字符串改写.rewrite指令按其在配置文件中出现的顺序执行.flag

浅谈apache和nginx的rewrite的区别_php技巧

1. Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx Rewrite规则语法如下: rewrite ^/b/(.*)\.html /play.php?video=$1 break; 如果加上if语句,示例如下: if (!-f $request_filename) { rewrite ^/img/(.*)$ /site/$host/images/$1

Nginx中 Rewrite规则的学习笔记

路由重写是Web服务器中的一个很重要的基本功能.通过路由重写,可以结构化URL,更具语义化(对SEO有益).另外,分享出去的URL可能会因程序路由变动而导致URL失效,而路由的重写可以很好的解决这类问题. 适当的使用Rewrite功能,可以更我们带来很多的好处.Nginx中Rewrite的功能是基于perl语言兼容的正则表达式,所以在编译安装nginx之前,需要安装PREC库.Nginx中Rewrite功能实现是基于ngx_http_rewrite_module,所以确保安装了此模块. Rewr

Nginx的Rewrite重写规则与apache对比

nginx的rewrite重写规则与apache对比    nginx rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的nginx rewrite规则语法如下:       rewrite ^/b/(.*).html /play.php教程?video=$1 break;       如果加上if语句,示例如下:       if (!-f $request_filename)       {       rewr

nginx 重写 rewrite 基础及实例(转)

nginx rewrite 正则表达式匹配 大小写匹配 ~ 为区分大小写匹配  ~* 为不区分大小写匹配  !~和!~*分别为区分大小写不匹配及不区分大小写不匹配  文件及目录匹配 -f和!-f用来判断是否存在文件  -d和!-d用来判断是否存在目录  -e和!-e用来判断是否存在文件或目录  -x和!-x用来判断文件是否可执行  flag标记 last 相当于Apache里的[L]标记,表示完成rewrite break 终止匹配, 不再匹配后面的规则. redirect 返回302临时重定向

Nginx url rewrite 规则参数与实例介绍

正则表达式匹配,其中: * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配,其中: * -f和!-f用来判断是否存在文件 * -d和!-d用来判断是否存在目录 * -e和!-e用来判断是否存在文件或目录 * -x和!-x用来判断文件是否可执行 flag标记有: * last 相当于Apache里的[L]标记,表示完成rewrite * break 终止匹配, 不再匹配后面的规则 * redirect 返回302临时重