Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Nginx/Fastcgi在子URL下部署django_Django_Nginx_Fastcgi - Fatal编程技术网

使用Nginx/Fastcgi在子URL下部署django

使用Nginx/Fastcgi在子URL下部署django,django,nginx,fastcgi,Django,Nginx,Fastcgi,我一辈子都不知道如何使用Nginx/fastcgi在非根位置下部署django站点,例如代替;我看到的所有示例都假设Apache或安装在站点的根目录下。下面是我的nginx.conf的相关部分: server { listen 8080; server_name localhost; location /myproject/ { # host and port to fastcgi server fastcgi_pass 127.0.0.

我一辈子都不知道如何使用Nginx/fastcgi在非根位置下部署django站点,例如代替;我看到的所有示例都假设Apache或安装在站点的根目录下。下面是我的
nginx.conf
的相关部分:

server {
    listen 8080;
    server_name localhost;

    location /myproject/ {
        # host and port to fastcgi server
        fastcgi_pass 127.0.0.1:3030;

        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        #fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  PATH_INFO          $fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;
    }
}
和一个最小的
url.py

from django.http import HttpResponse
from django.conf.urls.defaults import patterns

urlpatterns = patterns('',
    (r'^hello$', lambda request: HttpResponse('Hello world!')),
)

尝试访问会导致404错误。我尝试了以下所有组合,但均未成功:

  • 注释/取消注释
    fastcgi\u参数路径\u信息$fastcgi\u脚本\u名称
  • 注释/取消注释
    fastcgi_参数SCRIPT_NAME$fastcgi_SCRIPT_NAME
  • 在settings.py中设置
    FORCE\u SCRIPT\u NAME='/myproject/'

    • 我自己也遇到了子URL问题,因此被你的问题绊倒了。我的服务器使用Apache作为其主服务器,因此我的配置不同,但它可以工作。也许这会对某人有所帮助:

      • 端口80上的Apache(主web服务器)
      • 本地主机上的nginx:3033(随机端口)
      • 本地主机上的manage.py fastcgi:3034
      然后Apache配置如下所示(nginx的代理):


      我认为您遇到的问题是由于nginx配置造成的,而不是Django部署的问题。您可能想尝试一下我发布的解决方案是否适合您。

      我自己也解决了同样的问题-事实证明,您在ServerFault上提供的指向的链接是解决问题的关键

      Django>1.0使用
      SCRIPT\u NAME
      PATH\u INFO
      路由URL,如文档所述。所以我拿着它跑了。对于一个名为“myproject”的项目,您希望该项目位于mydomain.com/myproject/,请尝试以下操作

      location ~ /myproject/(.*)$ {
          fastcgi_pass 127.0.0.1:8080;
          fastcgi_param  PATH_INFO /$1;
          SCRIPT_NAME /myproject;
      }
      
      其余的fastcgi参数都在另一个站点范围的配置文件中。所以你的例子看起来像

      server {
          listen 8080;
          server_name localhost;
      
          location /myproject/ {
              # host and port to fastcgi server
              fastcgi_pass 127.0.0.1:3030;
      
              fastcgi_param  QUERY_STRING       $query_string;
              fastcgi_param  REQUEST_METHOD     $request_method;
              fastcgi_param  CONTENT_TYPE       $content_type;
              fastcgi_param  CONTENT_LENGTH     $content_length;
      
              fastcgi_param  SCRIPT_NAME        /myproject;
              fastcgi_param  PATH_INFO          /$1;
              fastcgi_param  REQUEST_URI        $request_uri;
              fastcgi_param  DOCUMENT_URI       $document_uri;
              fastcgi_param  DOCUMENT_ROOT      $document_root;
              fastcgi_param  SERVER_PROTOCOL    $server_protocol;
      
              fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
              fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
      
              fastcgi_param  REMOTE_ADDR        $remote_addr;
              fastcgi_param  REMOTE_PORT        $remote_port;
              fastcgi_param  SERVER_ADDR        $server_addr;
              fastcgi_param  SERVER_PORT        $server_port;
              fastcgi_param  SERVER_NAME        $server_name;
          }
      }
      
      使用相同的url.py。到目前为止,我遇到的唯一问题是保持干燥的小问题,例如settings.py需要绝对URL,Django不想在URL上预先添加
      SCRIPT\u NAME
      (想想
      settings.LOGIN\u URL
      settings.MEDIA\u URL

      这可能是显而易见的,但也要确保您有另一个指向静态和管理介质的位置。

      试试这个配置

          location  /myproject {
          fastcgi_split_path_info ^(/myproject)(.*)$;
          fastcgi_pass 127.0.0.1:8080;
          include fastcgi_params;
      }
      
      其中,fastcgi_参数文件包含

          fastcgi_param  QUERY_STRING       $query_string;
          fastcgi_param  REQUEST_METHOD     $request_method;
          fastcgi_param  CONTENT_TYPE       $content_type;
          fastcgi_param  CONTENT_LENGTH     $content_length;
      
          fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
          fastcgi_param  REQUEST_URI        $request_uri;
          fastcgi_param  DOCUMENT_URI       $document_uri;
          fastcgi_param  DOCUMENT_ROOT      $document_root;
          fastcgi_param  SERVER_PROTOCOL    $server_protocol;
      
          fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
          fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
      
          fastcgi_param  REMOTE_ADDR        $remote_addr;
          fastcgi_param  REMOTE_PORT        $remote_port;
          fastcgi_param  SERVER_ADDR        $server_addr;
          fastcgi_param  SERVER_PORT        $server_port;
          fastcgi_param  SERVER_NAME        $server_name;
      
          fastcgi_param  PATH_INFO          $fastcgi_path_info;
      
          # PHP only, required if PHP was built with --enable-force-cgi-redirect
          fastcgi_param  REDIRECT_STATUS    200;
      
      这对我有用


      请参阅有关

      @gsakkis的文档,这对您有帮助吗?它对我有帮助。。。我使用此方法在nginx.conf中的同一服务器{}上托管了两个WebApp。但我的问题是两者都需要不同的静态和媒体url。。。在这里做什么??
          location  /myproject {
          fastcgi_split_path_info ^(/myproject)(.*)$;
          fastcgi_pass 127.0.0.1:8080;
          include fastcgi_params;
      }
      
          fastcgi_param  QUERY_STRING       $query_string;
          fastcgi_param  REQUEST_METHOD     $request_method;
          fastcgi_param  CONTENT_TYPE       $content_type;
          fastcgi_param  CONTENT_LENGTH     $content_length;
      
          fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
          fastcgi_param  REQUEST_URI        $request_uri;
          fastcgi_param  DOCUMENT_URI       $document_uri;
          fastcgi_param  DOCUMENT_ROOT      $document_root;
          fastcgi_param  SERVER_PROTOCOL    $server_protocol;
      
          fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
          fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
      
          fastcgi_param  REMOTE_ADDR        $remote_addr;
          fastcgi_param  REMOTE_PORT        $remote_port;
          fastcgi_param  SERVER_ADDR        $server_addr;
          fastcgi_param  SERVER_PORT        $server_port;
          fastcgi_param  SERVER_NAME        $server_name;
      
          fastcgi_param  PATH_INFO          $fastcgi_path_info;
      
          # PHP only, required if PHP was built with --enable-force-cgi-redirect
          fastcgi_param  REDIRECT_STATUS    200;