Nginx 反向代理遇上端口转发

  说说这样一个状况,还是用图吧,文字说不清。图中的一点就是路由器的88端口可转发到88,也可以是80。问题来了,倒地该转发到哪一个比较好。
我的树莓派环境
  现在做这样的配置,在树莓派上面,监听88端口过来的请求,也就是在路由器上有88端口直接转发到88端口,这样通过mypi.loveyu.me:88访问就不会有任何问题了。


server {
        listen   88;
        root /home/www-data/www;
        index index.php index.html;
        server_name mypi.loveyu.me;
        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

  正如上面对88端口直接转发到88后,在pi.loveyu.me上做对mypi的88端口的转发,此时的端口为80到88。


server
{
    listen       80;
    server_name pi.loveyu.me;
    index index.html;
    location /
    {
            proxy_redirect off;
            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 http://mypi.loveyu.me:88;
    }
}

  最后在内部建立这样一个配置文件,用户处理来之pi.loveyu.me的请求,同时将88端口设置到80端口。


server {
        listen   80;
        root /home/www-data/www;
        index index.php index.html;
        server_name pi.loveyu.me;
        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SERVER_PORT 80;
        }
}

  现在问题来了,看起来一切都OK了,80端口转发到88端口后设置端口为80,也可以正常访问,事实上大多数情况下可以,但是突然间就不行了,看看下面这个操作。

[root@host ~]# curl -I http://pi.loveyu.me/img_show
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sun, 19 Oct 2014 04:40:45 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: http://pi.loveyu.me:88/img_show/

[root@host ~]# curl -I http://pi.loveyu.me/img_show/
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 19 Oct 2014 04:41:02 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.4-14+deb7u14

[root@host2 vhost]#

  现在问题来了,这里的img_show是一个目录,ngixn在遇到目录时如果未添加斜杠结尾,会自动添加过去,这就是问题,由于这里是通过88端口的请求,ngixn的自动重定向会加上88端口,然后瞬间就右80端口变为88端口了,有一个办法就是告诉ngixn当前你要认为是80端口,而不是真实访问的88端口,PHP可以伪装但nginx似乎不行,有人通过设置proxy_set_header Host $host:$server_port;来解决问题,但是这里似乎不行。

  最后妥协下,既然跳转到88端口了,那么我再添加一个88端口,然后再跳转回去,很无奈的做法了。

4条评论在“Nginx 反向代理遇上端口转发”

写下你最简单的想法