การปรับใช้แอป Django ด้วย Nginx, Apache, mod_wsgi


13

ฉันมีแอพ django ที่สามารถเรียกใช้ในเครื่องโดยใช้สภาพแวดล้อมการพัฒนามาตรฐาน ตอนนี้ฉันต้องการย้ายสิ่งนี้ไปยัง EC2 เพื่อการผลิต เอกสาร django แนะนำให้รันด้วย apache และ mod_wsgi และใช้ nginx สำหรับการโหลดไฟล์คงที่

ฉันใช้ Ubuntu 12.04 บนกล่อง Ec2 แอพ Django ของฉัน "ddt" มีไดเรกทอรีย่อย "apache" พร้อม ddt.wsgi

import os, sys
apache_configuration= os.path.dirname(__file__)
project = os.path.dirname(apache_configuration)
workspace = os.path.dirname(project)
sys.path.append(workspace)
sys.path.append('/usr/lib/python2.7/site-packages/django/')
sys.path.append('/home/jeffrey/www/ddt/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'ddt.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

ฉันมี mod_wsgi ติดตั้งจาก apt apache / httpd.conf ของฉันมี

NameVirtualHost *:8080

WSGIScriptAlias / /home/jeffrey/www/ddt/apache/ddt.wsgi
WSGIPythonPath /home/jeffrey/www/ddt

<Directory /home/jeffrey/www/ddt/apache/>
<Files ddt.wsgi>
Order deny,allow
Allow from all
</Files>
</Directory>

ภายใต้ apache2 / sites-enabled

<VirtualHost *:8080>
ServerName www.mysite.com
ServerAlias mysite.com
<Directory /home/jeffrey/www/ddt/apache/>
    Order deny,allow
    Allow from all
</Directory>
LogLevel warn
ErrorLog  /home/jeffrey/www/ddt/logs/apache_error.log
CustomLog /home/jeffrey/www/ddt/logs/apache_access.log combined
WSGIDaemonProcess datadriventrading.com user=www-data group=www-data threads=25
WSGIProcessGroup datadriventrading.com
WSGIScriptAlias / /home/jeffrey/www/ddt/apache/ddt.wsgi
</VirtualHost>

ถ้าฉันถูกต้องเหล่านี้3 ไฟล์ดังกล่าวข้างต้นอย่างถูกต้องจะช่วยให้แอปพลิเค Django ของฉันทำงานบนพอร์ต8080

ฉันมีไฟล์ nginx / 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 / sites-enabled

server {
  listen 80;
  server_name www.mysite.com mysite.com;
  access_log /home/jeffrey/www/ddt/logs/nginx_access.log;
  error_log /home/jeffrey/www/ddt/logs/nginx_error.log;
  location / {
    proxy_pass http://127.0.0.1:8080;
    include     /etc/nginx/proxy.conf;
  }
  location  /media/ {
   root /home/jeffrey/www/ddt/;
  }
}      

หากฉันแก้ไขไฟล์ทั้งสองควรตั้งค่า nginx ให้รับคำร้องขอบน HTTP พอร์ต 80 แต่จากนั้นส่งคำขอโดยตรงไปยัง apache ซึ่งใช้แอพ django บนพอร์ต 8080 ถ้าฉันไปที่ mysite.com สิ่งที่ฉันเห็นคือยินดีต้อนรับสู่ Nginx !

คำแนะนำสำหรับวิธีการแก้ไขข้อบกพร่องนี้?


คุณช่วยโพสต์ไฟล์ nginx.conf ของคุณได้ไหม มีปัญหาบางอย่างกับ nginx ที่ไม่ได้เปิดใช้งานโฮสต์ของคุณอาจมีการรวมบรรทัดเหมือน include /etc/nginx/conf.d/*.conf; และไฟล์กำหนดค่าของคุณไม่ใช่. config วิธีใดก็ตามถ้าคุณเห็นหน้าต้อนรับของ nginx หมายความว่าการกำหนดค่าของคุณไม่ได้ถูกนำไปใช้
Andrei Mikhaltsov

สำหรับผู้ใช้ในอนาคตฉันควรพูดถึงว่าด้วยแอดเวนต์ของ mod_wsgi-express เราไม่จำเป็นต้องทำการกำหนดค่าApache ใด ๆไม่มีคำนิยาม VirtualHost ไม่มีอะไรในโฟลเดอร์ conf และไซต์ มันทำในวิธีที่ดีที่สุดโดย mod_wsgi-express โดยอัตโนมัติ ดูโพสต์บล็อกของ Graham สำหรับรายละเอียด
Anupam

คำตอบ:


1

โปรดทราบว่าคุณควรใช้www.mysite.com หรือmysite.comในคำขอของคุณ (ตามที่กำหนดไว้ในไฟล์ปรับแต่ง):

server {
  listen 80;
  server_name www.mysite.com mysite.com;

แต่ดูเหมือนว่าคุณกำลังขอไซต์จาก localhost หรือที่อยู่ IP


0

ก่อนอื่นโปรดตรวจสอบให้แน่ใจว่าคุณสามารถเข้าถึงใบสมัครของคุณได้ที่ 127.0.0.1:8080 และโปรดโพสต์เนื้อหาของ nginx_error.log ลองคัดลอกวางตามไฟล์ nginx conf และตรวจสอบว่ามันใช้งานได้ ฉันใช้การตั้งค่าเดียวกันสำหรับแอพพลิเคชั่น

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

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

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";


    ##
    # Virtual Host Configs
    ##

    server {
        listen 80;

        location / {
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_pass http://127.0.0.1:8080;
        }

    location /static {
        root /home/ubuntu/www/myproject/webapp;
    }

    }


    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

}

0

ในการกำหนดค่า NGINX ของคุณคุณได้รวมเส้นทางไปยังแฟ้ม conf นี้ ( /etc/nginx/proxy.conf) locationภายใน ผมเชื่อว่ามันเป็นของนอก


0

ประการแรกโปรดความรักของทุกสิ่งที่ศักดิ์สิทธิ์อย่าใช้ทั้ง nginx และ httpd นี่จะเป็นความเจ็บปวดในลาเพื่อดีบั๊ก

ประการที่สองไม่มีที่ไหนในเอกสารที่ฉันเห็นว่าพวกเขาแนะนำการตั้งค่าประเภทนี้

ใช้ apache หรือ nginx ซึ่งจะเป็นการขจัดปัญหาครึ่งหนึ่งของคุณ

ตรวจสอบ nginx.conf ของคุณด้วยหากไม่รวมไฟล์จาก dirs อื่น ๆ ที่อาจมี vhost ทั่วโลกที่แทนที่ของคุณ

คุณควรแก้ไขโพสต์ของคุณเพื่อลบโดเมนใน apache config ใกล้กับ WSGI params เนื่องจากคุณกำลังรั่วการตั้งค่าการผลิต

ลบเว็บไซต์อื่น ๆ ออกจากเว็บไซต์ที่เปิดใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.