金字塔网址生成错误,在nginx + phusion乘客和Mako模板上提供服务

时间:2012-05-19 02:33:17

标签: nginx passenger pylons pyramid mako

遇到涉及金字塔请求网址的问题,其中request.static_urlrequest.application_url是2个可识别的嫌疑人。

Pyramid中生成的请求网址在某种程度上包含了我放置时的视图网址 在Web主机上,但使用pserve在本地工作正常。

例如:

config.add_route('signin','/view/signin')

在Mako模板中

我有:

href="${request.static_url('project:static/blueprint/css/screen.css')}" 

应显示(使用pserve):

href="http://www.site.com/static/blueprint/css/screen.css"

但它显示:

href="http://www.site.com/view/signin/static/blueprint/css/screen.css"

另一个例子是首页网址应该显示:

src = "http://www.site.com/static/img/foo.jpg"

而是显示:

src = "http://www.site.com//static/img/foo.jpg"

我目前在VPS服务器上使用nginx 0.8.53 + Phusion passenger 2.2.15运行Pyramid 1.3 + Mako模板。

这与request.application_url相同。在视图代码中,我发送了一个dict(url = request.application_url + '/view/signin'

表格的网址应显示:

action="http://www.site.com/view/signin"

相反它显示:

action="http://www.site.com/view/signin/view/signin"

我在http://wiki.pylonshq.com/display/pylonscookbook/Running+Pylons+with+NGINX上复制了一些nginx设置。

特别是:

    #site runs on Pylons 
    location / {
        include /usr/local/nginx/conf/proxy.conf;
        proxy_pass  http://127.0.0.1:8080;
        proxy_redirect  default; 
    }

和proxy.conf:

    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;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffer_size       4k;
    proxy_buffers           4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;

我独自留下的其他人是我不想碰的东西。

服务器上的nginx.conf看起来像这样。 (我不使用PHP,但那是我不想触摸的东西)。

有人建议将应用程序提供/安装在/,但我不知道该怎么做。

    server {
            listen <ip>:80;

            server_name site.com www.site.com;

            access_log /<path>/access.log combined;
            error_log /<path>/error.log error;

            root /home/<path>/public;

            index index.html index.htm index.php index.php5;
            include /home/<path>/nginx/site.com/*;

            # No mirrors - using strict redirects
            #if ($http_host != site.com) {
            rewrite ^(.*)$ http://site.com$1 permanent;
            #}

            autoindex on;

            passenger_enabled on;
            passenger_base_uri /;

            # Disallow access to config / VCS data
            location ~* /\.(ht|svn) {
                deny all;
            }

            #site runs on Pylons 
            location / {
                include /<path to conf file>/proxy.conf;
                proxy_pass  http://127.0.0.1:8080;
                proxy_redirect  default; 
            }

            # Statistics
            location /stats/ {
                alias /home/<path>/html/;
                auth_basic "Statistics Area";
                auth_basic_user_file /home/<path>/html/.htpasswd;
            }

            location /doc/analog/ {
                alias /usr/share/analog/;
            }

            # PHPMyAdmin
            rewrite ^/dh_phpmyadmin/([^/]*)/(.*)$ /dh_phpmyadmin/$2;

            location /dh_phpmyadmin/ {
                alias /dh/web/phpmyadmin/;
            }

            location ~ /dh_phpmyadmin/(.+)\.php {
                alias /dh/web/phpmyadmin/;
                fastcgi_param SERVER_PORT 80;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include /dh/nginx/etc/fastcgi_params;
                set $relpath "index.php";
                if ($uri ~ ^/dh_phpmyadmin/(.+)$) {
                    set $relpath $1;
                }
                fastcgi_param SCRIPT_FILENAME /dh/web/phpmyadmin/$relpath;
                fastcgi_pass unix:/home/<path>/.php.sock;
            }

            # PHP
            location ~* \.(php|php5|php4)($|/) {
                fastcgi_param SERVER_PORT 80;
                fastcgi_split_path_info ^(.+\.(?:php|php5|php4))(/.*)$;
                if (!-e $document_root$fastcgi_script_name) {
                    return 404;
                }
                include /dh/nginx/etc/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass unix:/home/<path>/.php.sock;
                #pragma php_launch <path>
            }

        }

2 个答案:

答案 0 :(得分:1)

好像你的网络服务器(乘客?我还没有使用过它)没有正确设置环境(request.environ)。这可能是一个配置选项,但如果您在访问SCRIPT_NAME时查看环境的PATH_INFO/view/signin密钥,则会看到SCRIPT_NAME=''PATH_INFO='/view/signin'。如果不是这种情况,则乘客的申请前缀可能有误。

答案 1 :(得分:0)

您的网站没有使用乘客服务金字塔。它确实使用了reverse_proxy。除非有办法在8080端口上运行乘客,否则你的nginx配置中的乘客部分是无用的。

那就是说,你可以看看那里:

http://kbeezie.com/view/using-python-nginx-passenger/5/

您必须删除此块以使其与乘客一起使用:

        location / {
            include /<path to conf file>/proxy.conf;
            proxy_pass  http://127.0.0.1:8080;
            proxy_redirect  default; 
        }

然后你必须创建你的可调用wsgi函数,它将调用金字塔。

您必须为乘客定义根路径:

root /path/to/app/public/;

并输入/path/to/app/

一个名为passenger_wsgi.py的文件,其内容与此文件类似

import sys
import os

def application(environ, start_response):
    start_response("200 OK", [])
    ret = ["%s: %s\n" % (key, value)
        for key, value in environ.iteritems()]
    return ret

但不是那样你必须调用金字塔,它是你的应用程序的入口点。

那就是说,你有没有理由使用乘客。使用像uwsgi这样的东西来部署你的应用程序会不会更容易。与乘客一起部署红宝石应用程序是有意义的,但我不知道你使用乘客获得了什么。

这是一个很好的教程,你可以跳过大部分的部分,因为这里只有nginx-uwsgi部分对你有意义。

http://liangsun.org/2012/02/pyramid-nginx-uwsgi-mysql/