nginx proxy_pass & rewrite exp.

昨天新建的一个站点, phppgadmin, 用于连接pg-xl, greenplum, postgresql , 作为一个数据库demo站点.
参考
原来的做法是新建一个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 , 末尾加斜线的处理, 不会导致匹配不到 .

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: nginx中的proxy_passrewrite是两个常用的指令。 proxy_pass用于反向代理,将客户端请求转发到后端服务器。例如,当nginx接收到http://example.com的请求时,可以使用proxy_pass将请求转发到http://backend-server:8080。 rewrite用于重写URL,可以将客户端请求的URL重写为另一个URL。例如,当nginx接收到http://example.com/old-url的请求时,可以使用rewrite将请求重写为http://example.com/new-url。 这两个指令在nginx中经常一起使用,例如将客户端请求的URL重写为后端服务器的URL,然后使用proxy_pass将请求转发到后端服务器。 ### 回答2: nginx是一个高性能的Web服务器,它不仅可以作为一个Web服务器使用,还可以作为反向代理服务器使用。在nginx中,proxy_passrewrite都是非常重要的关键字。 proxy_passnginx作为反向代理服务器中的一个重要功能。它允许请求流量进入nginx,然后将请求路由到另一个服务器。通俗点来说,就是来自客户端的请求首先会经过nginx服务器,然后由nginx服务器将请求发送到后端的服务器,后端服务器处理完后再将结果返回给nginx服务器,nginx服务器再返回给客户端。 proxy_pass可以在nginx.conf中配置,例如: location / { proxy_pass http://backend; } 其中,proxy_pass后面的参数http://backend指的是后端服务器监听的地址,可以是一个IP地址,也可以是一个域名地址。 rewrite也是nginx中的一个非常重要的关键字,它可以用于修改URI路径或者重定向某些请求。它的语法比较灵活,可以根据需要进行不同的修改和重定向操作。 例如,以下代码可将URI的最后一个路径修改为.php: location / { rewrite ^/(.*)/$ /$1.php; } 另外,rewrite还可以用于重定向请求。例如下面的代码可以将所有的HTTP请求重定向到HTTPS协议上: server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } 综上所述,nginx中的proxy_passrewrite都是非常重要的关键字,它们可以更加灵活地控制请求的路由和修改。同时,这些关键字也使nginx成为了一个更有力的Web服务器和反向代理服务器。 ### 回答3: Nginx是一款开源的高性能Web服务器和反向代理服务器,它优秀的性能和可扩展性被广泛的应用于互联网行业中,尤其是在Web应用的负载均衡和动态请求转发方面。 在Nginx中,proxy_passrewrite是非常重要的概念,他们在Nginx中扮演着不同的角色,下面我简单的介绍一下: 1. proxy_pass proxy_pass指令是Nginx的一个重要功能,它是用于反向代理的。当浏览器请求Nginx服务器时,proxy_pass会转发这个请求给配置的upstream。 我们可以这样配置proxy_pass: location / { proxy_pass http://backend; } 这里的backend就是一个upstream的配置,upstream中定义了一组后端服务器,这些服务器会被proxy_pass进行选举,最终被选中的服务器负责处理请求并返回响应数据。 2. rewrite rewrite指令是Nginx的另一个重要功能,它是用于URL重写的。在Nginx中,rewrite指令可以帮助我们重写URL,并将请求导向到正确的资源上。 我们可以这样配置rewriterewrite ^/oldurl(.*)$ /newurl$1 permanent; 这里的/oldurl是旧的URL,/newurl是新的URL,$1表示保留原有的参数。这个配置会将/oldurl开头的URL重定向到/newurl开头的URL。 总结一下,proxy_passrewriteNginx中扮演的角色不同,但都是非常重要的。proxy_pass用于反向代理,将请求转发给upstream进行处理;rewrite用于URL重写,将请求导向到正确的资源上。这两个指令合理的应用可以帮助我们实现更加高效、灵活的Web应用架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值