2010-08-03 13 views
9

के साथ उप-यूआरएल के तहत django को तैनात करना मैं अपने जीवन के लिए यह नहीं समझ सकता कि कैसे nginx/fastcgi के साथ एक गैर-रूट स्थान के तहत एक django साइट को तैनात करना है, उदा। http://localhost:8080/myproject/http://localhost:8080/ के बजाय; मैंने देखा है कि सभी उदाहरण अपाचे या साइट की जड़ पर बढ़ते हुए मानते हैं।Nginx/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  $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; 
    } 
} 

और एक न्यूनतम urls.py: यहाँ मेरी nginx.conf के प्रासंगिक हिस्सा है

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

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

)

http://localhost:8080/myproject/hello का उपयोग करने की कोशिश कर रहा एक 404. मैं असफल के सभी संयोजनों की कोशिश की है देता है:

  • टिप्पणी/टिप्पणी fastcgi_param PATH_INFO $fastcgi_script_name;
  • टिप्पणियां/असम्बद्ध fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  • सेटिंग.py में FORCE_SCRIPT_NAME = '/myproject/' सेट करना।

उत्तर

0

आपके प्रश्न पर ठोकर खाई क्योंकि मेरे पास उप-यूआरएल समस्या थी। मेरा सर्वर Apache का मुख्य सर्वर के रूप में उपयोग करता है, इसलिए मेरी कॉन्फ़िगरेशन अलग है, लेकिन यह काम करता है। हो सकता है कि यह किसी को मदद मिलेगी:

  • अपाचे पर पोर्ट 80 (मुख्य वेब सर्वर) स्थानीय होस्ट पर
  • nginx: 3033 (यादृच्छिक बंदरगाह)
  • स्थानीय होस्ट पर manage.py FastCGI: 3034

फिर अपाचे config की तरह (nginx करने के लिए प्रॉक्सी) इस दिखता है:

<Location /blogsite/> 
    Order deny,allow 
    Allow from all 

    ProxyPass http://127.0.0.1:3033/ 
    ProxyPassReverse http://127.0.0.1:3033/ 
</Location> 

और nginx साइट विन्यास है:

server { 
    listen 127.0.0.1:3033; 
    server_name localhost; 

    location/{ 
     fastcgi_pass 127.0.0.1:3034; 
     fastcgi_param PATH_INFO $fastcgi_script_name; 
     fastcgi_param REQUEST_METHOD $request_method; 
     fastcgi_param QUERY_STRING $query_string; 
     fastcgi_param CONTENT_TYPE $content_type; 
     fastcgi_param CONTENT_LENGTH $content_length; 
     fastcgi_pass_header Authorization; 
     fastcgi_intercept_errors off; 
    } 

    access_log /var/log/nginx/blogsite.access_log; 
    error_log /var/log/nginx/blogsite.error_log; 
} 

मुझे लगता है कि आपके पास समस्या है nginx विन्यास के कारण किसी भी तरह, वास्तव में Django परिनियोजन के साथ कोई समस्या नहीं है। यदि आप मेरे पोस्ट समाधान आपके लिए काम करते हैं तो आप यह कोशिश करना चाहेंगे।

7

बस एक ही मुद्दे के माध्यम से धक्का दिया myself- यह पता चला है कि लिंक आप Django change doc को ServerFault पर उपलब्ध कराई गई समस्या को हल करने के लिए महत्वपूर्ण था।

Django> 1.0 SCRIPT_NAME और PATH_INFO का उपयोग करता मार्ग यूआरएल को, के रूप में दस्तावेज़ को समझाया। तो मैंने इसे लिया और इसके साथ भाग गया। 'Myproject' नामक एक प्रोजेक्ट के लिए, जिसे आप mydomain.com/myproject/ पर रूट करना चाहते हैं, इसे आजमाएं।

location ~ /myproject/(.*)$ { 
    fastcgi_pass 127.0.0.1:8080; 
    fastcgi_param PATH_INFO /$1; 
    SCRIPT_NAME /myproject; 
} 

बाकी फास्टसीजी पैराम्स मेरे पास एक और साइट-व्यापी कॉन्फ़िगरेशन फ़ाइल में है। तो अपने उदाहरण ही urls.py. साथ की तरह

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

कुछ ऐसा दिखाई देगा मैंने अभी तक केवल एक ही मुद्दे को DRY रखने में मामूली परेशानीएं हैं, उदाहरण के लिए जहां सेटिंग.py को पूर्ण यूआरएल की आवश्यकता होती है और Django यूआरएल पर SCRIPT_NAME को प्रीपेड करने के लिए नहीं सोचता है (settings.LOGIN_URL, settings.MEDIA_URL सोचें)।

यह स्पष्ट हो सकता है, लेकिन यह भी सुनिश्चित करें कि आपके पास एक और स्थान है जो आपके स्थिर और व्यवस्थापक मीडिया को इंगित करता है।

+0

@gsakkis, आप बिल्कुल इससे सहायता मिली? –

+0

इससे मेरी मदद मिली ... मैंने इस विधि का उपयोग करते हुए nginx.conf में उसी सर्वर {} पर दो वेबपैप्स होस्ट किए। लेकिन मेरी समस्या दोनों को अलग-अलग स्थिर और मीडिया यूआरएल की आवश्यकता है ... यहां क्या करना है ?? – codeVerine

3

, इस conf

location /myproject { 
    fastcgi_split_path_info ^(/myproject)(.*)$; 
    fastcgi_pass 127.0.0.1:8080; 
    include fastcgi_params; 
} 

जहां का प्रयास करें 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; 

यह मेरे लिए काम किया होता है।

देखने प्रलेखन के बारे में fastcgi_split_path_info