2012-05-19 6 views
0

Застревает с запросом URL-адреса Пирамиды, где request.static_url и request.application_url являются 2 идентифицируемыми подозреваемыми.Неправильно сгенерирован неправильный код пирамиды, поданный на nginx + phusion пассажирском и шаблоны Мако

Сгенерированный запрос 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" 

Другой пример находится на передней URLs страницы должны показать:

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

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

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

Я в настоящее время работает пирамида 1.3 + Мако шаблонов с использованием nginx 0.8.53 + Phusion пассажира 2.2.15 на сервере VPS.

То же самое с 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" 

Я скопировал некоторые настройки 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; 
    } 

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

     } 

ответ

1

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

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/