URL-адрес пирамиды сгенерирован неправильно, обслуживается в шаблонах пассажира nginx + phusion и Mako.

Застрял с проблемой, связанной с URL-адресами запроса Pyramid, где request.static_url и request.application_url — два идентифицируемых подозреваемых.

Сгенерированные URL-адреса запросов в Pyramid каким-то образом включают URL-адрес просмотра, когда я помещаю его на веб-хост, но отлично работает локально, используя pserve.

Например:

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

Внутри шаблона Мако

У меня есть:

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"

Другой пример: URL-адреса главной страницы должны показывать:

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

А вместо этого показывает:

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

В настоящее время я использую шаблоны Pyramid 1.3 + Mako, используя nginx 0.8.53 + пассажир Phusion 2.2.15 на сервере VPS.

То же самое и с request.application_url. В коде просмотра я отправил диктовку (url = request.application_url + '/view/signin')

URL-адрес формы должен отображать:

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

Вместо этого он показывает:

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

Я скопировал некоторые настройки nginx на http://wiki.pylonshq.com/display/pylonscookbook/Running+Pylons+with+NGINX.

особенно:

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

и прокси.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>
            }

        }

person Juan Bill    schedule 19.05.2012    source источник


Ответы (2)


Похоже, ваш веб-сервер (пассажирский? Я им не пользовался) неправильно настраивает среду (request.environ). Вероятно, это параметр конфигурации, но если вы посмотрите на ключи SCRIPT_NAME и PATH_INFO среды при посещении /view/signin, вы должны увидеть SCRIPT_NAME='' и PATH_INFO='/view/signin'. Если это не так, ваш префикс приложения может быть неверным в файле пассажира.

person Michael Merickel    schedule 19.05.2012

Ваш сайт не использует пассажира для обслуживания пирамиды. Вместо этого он использует 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/

файл с именемpassage_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 для развертывания вашего приложения. Имеет смысл развернуть приложение ruby ​​​​с пассажиром, но я не понимаю, что вы получаете от использования пассажира.

вот хороший учебник, вы можете пропустить большую часть, так как здесь есть только часть nginx-uwsgi, которая будет вам полезна.

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

person Loïc Faure-Lacroix    schedule 27.06.2012