كيفية عمل خوادم nginx الافتراضية + fcgi لـ django؟

StackOverflow https://stackoverflow.com/questions/605173

  •  03-07-2019
  •  | 
  •  

سؤال

أرغب في تشغيل عدة مضيفين افتراضيين عبر nginx، كل منهم يخدم تطبيق Django مختلفًا عبر fcgi.هل هذا ممكن؟إذا كان الأمر كذلك، هل لدى أي شخص موارد جيدة حول أين/كيف تبدأ؟يبدو أن مستندات nginx عبارة عن أمثلة في الغالب، لكن لا يوجد أي من التكوينات المحددة التي أحاولها...

هل كانت مفيدة؟

المحلول

كان هناك منشوران جيدان جدًا على المدونة مؤخرًا حول إعداد nginx، لكن كلاهما يستخدم nginx لخدمة المحتوى الثابت (أو المخبأ) وApache + mod_wsgi لخدمة Django.أفضّل هذا بنفسي لأن mod_wsgi يجعل إدارة العمليات أسهل بكثير من fcgi (من بين المزايا الأخرى).

على أية حال، إليك المشاركات:

يحرر:حسنًا، لقد استخرجت ملف tar قديمًا باستخدام ملفات تكوين المضيف الظاهري nginx + Django + منذ عام مضى قبل أن أتحول إلى Apache + mod_wsgi.لقد كانت هذه آلة تطوير، لذا ستحتاج إلى ضبط عدد العاملين والاتصالات وما إلى ذلك.

nginx.conf:

user nginx nginx;
worker_processes 2;

error_log /var/log/nginx/error_log info;

events {
    worker_connections  1024;
    use epoll;
}

http {
    include         /etc/nginx/mime.types;
default_type    application/octet-stream;

log_format main
            '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
            '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';

client_header_timeout   3m;
client_body_timeout     3m;
send_timeout            3m;

connection_pool_size            256;
client_header_buffer_size       1k;
large_client_header_buffers     4 2k;
request_pool_size               4k;

gzip on;
gzip_min_length 1100;
gzip_buffers    4 32k;
gzip_types      text/plain text/html application/x-javascript text/xml text/css;

output_buffers  4 32k;
postpone_output 1460;

sendfile        on;
tcp_nopush      on;
tcp_nodelay     on;

keepalive_timeout       75 20;

ignore_invalid_headers  on;

include vhosts.d/*.conf;
}

لذلك، يتضمن nginx.conf الرئيسي كل ملف في المجلد الفرعي vhosts.d/.كان أحد ملفاتي مخصصًا لخدمة PHP على المضيف المحلي (ربما كان يعمل على تشغيل phpMyAdmin) مثل هذا:

vhosts.d/00_localhost:

server {

  listen 127.0.0.1:80;
  server_name localhost;

  access_log /var/log/nginx/localhost.access_log main;
  error_log /var/log/nginx/localhost.error_log info;

  root /var/www/localhost/htdocs;
  index index.php index.html index.htm;

    location ~ .php$ {
        fastcgi_pass   127.0.0.1:8888;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/localhost/htdocs$fastcgi_script_name;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
  }
}

ثم خادم تطوير Django محلي مثل هذا:

50_جانغو.المحلية:

server {

  listen  80;
  server_name django.local;

  access_log /var/log/nginx/django.access.log main;
  error_log /var/log/nginx/django.error.log info;

  root /var/www/django.local;

  location ~* ^.+\.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ {
    access_log off;
    break;
  }

  location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|bmp|js)$ {
    expires 30d;
    break;
  }

  location / {
    fastcgi_pass unix:/var/www/django.local/server.sock;
    include fastcgi.conf;
  }

  location ^~ /admin/ {
    fastcgi_pass unix:/var/www/django.local/server.sock;
    include fastcgi.conf;
    access_log off;
    auth_basic "Welcome to admin";
  }
}

وأخيرًا، تضمن كل خادم افتراضي ملف fastcgi.conf لكل موقع.

fastcgi.conf:

fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;

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_param SERVER_PORT       $server_port;
fastcgi_param SERVER_PROTOCOL   $server_protocol;
fastcgi_param SERVER_NAME       $server_name;

fastcgi_param REQUEST_URI       $request_uri;
fastcgi_param DOCUMENT_URI      $document_uri;
fastcgi_param DOCUMENT_ROOT     $document_root;
fastcgi_param SERVER_ADDR       $server_addr;
fastcgi_param REMOTE_USER       $remote_user;
fastcgi_param REMOTE_ADDR       $remote_addr;
fastcgi_param REMOTE_PORT       $remote_port;
fastcgi_param SERVER_SOFTWARE   "nginx";
fastcgi_param GATEWAY_INTERFACE "CGI/1.1";

fastcgi_param UID_SET           $uid_set;
fastcgi_param UID_GOT           $uid_got;

لست متأكدًا من أن كل ما سبق كان مطلوبًا، ولكن هذا كان أحد الأسباب الأخرى التي دفعتني للتحول إلى mod_wsgi...دعم وتوثيق متفوق :)

نصائح أخرى

ومنذ سئل هذا السؤال شخص خلق نقطة حزمة جانغو للتثبيت من شأنها أن تولد ملف اباتشي أو إنجن إكس عشقتك لك من settings.py بك

وpip install django-vhost

والتحقق من ذلك هنا: https://bitbucket.org/djangostars/django-vhost

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top