使用 Nginx、Apache、mod_wsgi 部署 Django 应用

使用 Nginx、Apache、mod_wsgi 部署 Django 应用

我有一个 django 应用程序,可以使用标准开发环境在本地运行。我现在想将其移至 EC2 进行生产。django 文档建议使用 apache 和 mod_wsgi 运行,并使用 nginx 加载静态文件。

我在 Ec2 机器上运行 Ubuntu 12.04。我的 Django 应用程序“ddt”包含一个带有 ddt.wsgi 的子目录“apache”

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()

我已经从 apt 安装了 mod_wsgi。我的 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 上接受请求,然后将请求直接发送到在端口 8080 上运行 django 应用程序的 apache。如果我访问 mysite.com,我看到的只是欢迎使用 Nginx!

关于如何调试这个问题有什么建议吗?

答案1

请注意,您应该使用www.mysite.com 或者我的站点在您的请求中(如配置文件中所定义):

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

但看起来,您正在通过本地主机或 IP 地址请求网站

答案2

首先,请确保您可以通过 127.0.0.1:8080 访问您的应用程序,并发布 nginx_error.log 的内容。尝试复制粘贴以下 nginx conf 文件并检查它是否正常工作。我对我的 python 应用程序使用了相同的配置。

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/*;

}

答案3

在你的 NGINX 配置中,你已将配置文件的路径 ( /etc/nginx/proxy.conf) 包含在 中location。我相信它属于外部

答案4

首先,出于对一切神圣事物的热爱,请不要同时使用 nginx 和 httpd。这将是一件非常麻烦的调试工作。

其次,我没有在文档中看到他们推荐这种设置。

使用 apache 或 nginx,这将消除一半的问题。

另外,请检查您的 nginx.conf 是否不包含来自其他目录的文件,这些目录可能有一个覆盖您的全局虚拟主机。

您还应该编辑您的帖子以删除 WSGI 参数附近的 apache 配置中的域,因为您目前正在泄露您的生产设置。

从已启用站点中删除其他站点。

相关内容