使用Apache在RHEL上提供Django项目(503错误)

时间:2014-09-04 09:11:16

标签: django apache port mod-wsgi http-status-code-503

我是整个网站的新手......如果你能在这里给予帮助,真的很感激...

我想要做的是在远程服务器上托管一个Django项目(红帽,CentOS版本6.5)

我一直在使用开发服务器和端口8000在远程服务器上运行项目测试:

  python manage.py runserver *.*.*.*:8000 --insecure

在这种情况下,网站可以正常工作并可从其他计算机访问。

   0 errors found
   September 04, 2014 - 08:13:03
   Django version 1.6.4, using settings 'mysite.settings'
   Starting development server at http://*.*.*.*:8000/
   Quit the server with CONTROL-C.

现在我想把它投入生产,我选择使用Apache http服务器和mod_wsgi。我安装并激活了httpd和wsgi。我将httpd.conf配置文件更改为:

   Listen *:80 (I've also tried Listen *:8000 and Listen (IP address):8000)

   #DocumentRoot "/var/www/html"
   DocumentRoot "/testsite"      (I put a plan html file under the directory just for test)

   ServerName <here is the url of the site,with no port number>

但是,当我尝试打开网页时,我总是遇到503错误:

   Service Temporarily Unavailable

   The server is temporarily unable to service your request due to maintenance downtime 
   or capacity problems. Please try again later.

   Apache/2.2.3 (CentOS) Server at <site url> Port 80

我尝试了几件事(1)检查了使用端口80的内容:

  ~# sudo lsof -i :80
  COMMAND   PID   USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
  httpd   28732   root    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  httpd   28734 apache    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  httpd   28735 apache    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  httpd   28736 apache    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  httpd   28737 apache    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  httpd   28738 apache    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  httpd   28739 apache    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  httpd   28740 apache    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  httpd   28741 apache    4u  IPv6 19802111      0t0  TCP *:http (LISTEN)
  ~# service httpd status
  httpd (pid  28732) is running...

(2)重启apache服务器:

  service httpd restart
    Stopping httpd:                                            [  OK  ]
    Starting httpd:                                            [  OK  ]

(3)在/ var / www / html / testsite中放置了一个普通的.html文件,用于测试DocumentRoot目录。

(4)我试图在另一个端口(例如8008,8001和80)上运行django

   e.g. python manage.py runserver *.*.*.*:8008 --insecure
   0 errors found
   September 04, 2014 - 07:56:18
   Django version 1.6.4, using settings 'mysite.settings'
   Starting development server at http://*.*.*.*:8008/
   Quit the server with CONTROL-C.

如上图所示,在终端中看起来它正在工作,但即使使用开发服务器,我甚至无法从远程机器访问网站。我尝试了不同的端口号,但只能使用端口8000。但是,当我更改端口号时,为什么我可以在localhost上打开网页?例如127.0.0.1:8008或127.0.0.1:8080将起作用。

我猜它可以是防火墙设置,然后我去了/ etc / sysconfig / iptables,我在网页部分找到了,只有一行:

   -A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT

然后我添加了另一行进行测试:

   -A INPUT -m state --state NEW -m tcp -p tcp --dport 8001 -j ACCEPT

然后再次尝试使用端口8001进行开发。再次,它看起来像是在远程服务器上工作但无法从远程计算机访问。

很抱歉,如果我让这令人困惑,如果我问了一些非常愚蠢的话。现在,我有三个问题,我真的不明白。首先,503错误真让我烦恼。即使它显示apache服务器正在运行(重启httpd也没关系),实际上没有显示......其次,在使用开发服务器时为什么我只能使用端口8000而不能使用其他任何东西?最后,在503错误消息中,它显示apache在端口80上运行,即使我在配置文件中将Listen端口更改为8000,为什么会这样?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果这是您唯一的配置,我不会看到Apache如何知道运行8000的Django。没有迹象表明您正在使Apache连接或代理运行Django实例的请求。

您需要做的是

您可以自由选择任何带Django开发服务器的端口。您可以使用命令行参数配置开发服务器侦听的IP地址和端口。

您可以让Django开发服务器监听所有IP地址,包括服务器上的公共IP地址,如下所示:

 python manage.py runserver 0.0.0.0:8000 

也可以在/ var / log / apache(或类似的目录)中读取Apache日志,因此它应该解释为什么你会得到503。

我怀疑iptables与你的问题没有任何关系,但不知何故Django开发服务器没有收听公共IP地址。您可以通过服务器上禁用的iptables防火墙轻松尝试此操作。