我有一个 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 配置中的域,因为您目前正在泄露您的生产设置。
从已启用站点中删除其他站点。