0

遇到一个涉及 Pyramid 请求 url 的问题,其中request.static_url2request.application_url个可识别的嫌疑人。

Pyramid 中生成的请求 url 在我将其放在网络主机上时以某种方式包含视图 url,但在本地使用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 乘客 2.2.15 运行 Pyramid 1.3 + Mako 模板。

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

表单的 url 应显示:

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>
            }

        }
4

2 回答 2

1

您的网络服务器(乘客?我没用过)似乎没有request.environ正确设置环境 ( )。这可能是一个配置选项,但如果您在访问时查看环境SCRIPT_NAMEPATH_INFO键,/view/signin您应该会看到SCRIPT_NAME=''PATH_INFO='/view/signin'。如果不是这种情况,您的应用程序前缀可能在乘客中是错误的。

于 2012-05-19T09:13:59.747 回答
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

但是,您必须调用pyramid,而不是它,它是您应用程序的入口点。

也就是说,你有什么理由使用乘客。使用 uwsgi 之类的东西来部署您的应用程序不是更容易吗?与乘客一起部署一个 ruby​​ 应用程序是有意义的,但我看不出你从使用乘客中得到了什么。

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

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

于 2012-06-27T14:04:35.243 回答