Django mod_wsgi apache

6
当我尝试访问我的Django网站 http://www.satoshi.example.com/mysite 时,出现了“503服务暂时不可用”的错误。
Apache错误日志显示:
[Tue Feb 28 07:11:09 2012] [error] [client 10.0.0.202] (13)Permission denied: mod_wsgi (pid=4756): Unable to connect to WSGI daemon process 'django' on '/etc/httpd/logs/wsgi.17555.4.1.sock' after multiple attempts.

Apache 正确加载 mod_wsgi
root@satoshi:~/html/mysite# apachectl -M | grep wsgi
 wsgi_module (shared)
Syntax OK

Apache 加载的是 /var/www/html/mysite/apache/apache_django_wsgi.conf 文件。
WSGIDaemonProcess django
WSGIProcessGroup django

<Directory "/var/www/html/mysite">
Order allow,deny
Options Indexes
Allow from all 
IndexOptions FancyIndexing
</Directory>

WSGIScriptAlias /mysite "/var/www/html/mysite/apache/django.wsgi"

<Directory "/var/www/html/mysite/apache">
Order deny,allow
Allow from all 
</Directory>

这是 /var/www/html/mysite/apache/django.wsgi
import os
import sys 

paths = [ '/var/www/html/mysite',
          '/usr/lib/python2.6/site-packages/',
]

for path in paths:
    if path not in sys.path:
        sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

一件奇怪的事情是,我发现我甚至不需要在自己的httpd.conf中加载LoadModule wsgi_module modules/mod_wsgi.so。我想我的httpd.conf是另一个已经加载了mod_wsgi的配置文件的扩展。不确定这是否有影响。
到目前为止,我提供的信息有什么问题吗?如果需要更多信息,请告诉我。先谢谢了!
=====================================================
@jpic请求的信息
root@satoshi:/var/www/html# ps aux | grep apache
root      4564  0.0  0.2 207636  5432 pts/9    S+   04:16   0:00 vi apache_django_wsgi.conf
apache    6006  0.0  0.7 365140 14820 ?        S    09:53   0:00 /usr/sbin/httpd
apache    6007  0.0  0.7 365140 14884 ?        S    09:53   0:00 /usr/sbin/httpd
apache    6008  0.0  0.7 365140 14888 ?        S    09:53   0:00 /usr/sbin/httpd
apache    6009  0.0  0.7 365140 14884 ?        S    09:53   0:00 /usr/sbin/httpd
apache    6010  0.0  0.7 365008 14784 ?        S    09:53   0:00 /usr/sbin/httpd
apache    6011  0.0  0.7 365008 14768 ?        S    09:53   0:00 /usr/sbin/httpd
apache    6012  0.0  0.7 365008 14748 ?        S    09:53   0:00 /usr/sbin/httpd
apache    6013  0.0  0.7 365140 14876 ?        S    09:53   0:00 /usr/sbin/httpd
apache    6112  0.0  0.7 365008 14756 ?        S    10:05   0:00 /usr/sbin/httpd
root      6116  0.0  0.2 207700  5492 pts/15   S+   10:06   0:00 vi ../apache/django.wsgi
apache    6181  0.0  1.5 713972 32136 ?        Sl   10:08   0:00 /usr/sbin/httpd
root      8173  0.0  0.0 103300   848 pts/17   S+   23:39   0:00 grep --color=auto apache

用户信息(您是不是想说iduserid未找到)
root@satoshi:/var/www/html# id apache
uid=48(apache) gid=48(apache) groups=48(apache)

"ls -la" 信息
root@satoshi:/var/www/html# ls -la /etc/ | grep httpd
drwxrwxr-x.   4 root 4.0K Feb 16 18:27 httpd/

root@satoshi:/var/www/html# ls -la /etc/httpd/
total 24K
drwxrwxr-x.   4 root 4.0K Feb 16 18:27 ./
drwxr-xr-x. 128 root  12K Feb 28 03:45 ../
drwxr-xr-x.   2 root 4.0K Feb 28 08:07 conf/
drwxr-xr-x.   2 root 4.0K Feb 16 18:28 conf.d/
lrwxrwxrwx    1 root   19 Feb 16 18:27 logs -> ../../var/log/httpd/
lrwxrwxrwx    1 root   29 Feb 16 18:27 modules -> ../../usr/lib64/httpd/modules/
lrwxrwxrwx    1 root   19 Feb 16 18:27 run -> ../../var/run/httpd/

root@satoshi:/var/www/html# ls -la /etc/httpd/logs/
total 528K
drwxrwxr-x.  2 root   4.0K Feb 28 09:53 ./
drwxr-xr-x. 19 root   4.0K Feb 27 06:51 ../
-rw-r--r--   1 root    17K Feb 28 10:08 access_log
-rw-r--r--   1 root    351 Feb  3 10:24 access_log-20120205
-rw-r--r--   1 root   1.8K Feb  7 01:39 access_log-20120212
-rw-r--r--   1 root   278K Feb 18 23:17 access_log-20120219
-rw-r--r--   1 root    85K Feb 22 08:38 access_log-20120226
-rw-r--r--   1 root    50K Feb 28 10:08 error_log
-rw-r--r--   1 root    14K Feb  5 03:28 error_log-20120205
-rw-r--r--   1 root   2.2K Feb 12 03:14 error_log-20120212
-rw-r--r--   1 root   9.4K Feb 19 03:28 error_log-20120219
-rw-r--r--   1 root   4.0K Feb 26 03:20 error_log-20120226
-rw-r--r--.  1 root      0 Oct 14 15:14 ssl_access_log
-rw-r--r--   1 root   3.1K Feb 28 09:53 ssl_error_log
-rw-r--r--   1 root   1.4K Feb  3 03:25 ssl_error_log-20120205
-rw-r--r--   1 root    237 Feb  5 03:28 ssl_error_log-20120212
-rw-r--r--   1 root   1.2K Feb 17 01:52 ssl_error_log-20120219
-rw-r--r--   1 root    237 Feb 19 03:28 ssl_error_log-20120226
-rw-r--r--.  1 root      0 Oct 14 15:14 ssl_request_log
srw-rw-rw-   1 apache    0 Feb 28 09:53 wsgi.17555.14.1.sock
3个回答

10
这个问题已记录在:

http://code.google.com/p/modwsgi/wiki/ConfigurationIssues#Location_Of_UNIX_Sockets

其他人提供的更改权限的解决方案是错误的。 正确的解决方案是将套接字文件存放位置更改为Apache用户可以读取的位置。 在保护日志目录的系统上,它们有时会有一个系统来设置当您与它们搞砸时重置那些权限。因此,任何更改可能只是暂时的。

我的经验是,无论您在哪里设置套接字位置,它们总是具有更严格的权限(例如srwx------ www-data root),因此您必须更改套接字权限。 - Martin Kontsek
1
您不需要也无法设置套接字权限,因为套接字文件名会根据进程ID、Apache配置生成和守护进程组实例而动态更改。换句话说,它不是一个固定的名称。只要目录对Apache用户可访问,mod_wsgi将确保实际的套接字文件具有正确的权限,一切都将正常工作。 - Graham Dumpleton
1
@GrahamDumpleton 我已按照您提供的链接更改了配置,但仍然出现错误:“在多次尝试后无法连接到位于'/var/run/wsgi.12116.0.1.sock'上的WSGI守护进程'wsgi'”。 - Harshdeep

2

我编写了这个脚本来解决在apache2-mpm-itk上处理wsgi套接字权限问题的问题。

#!/bin/sh
# This script will fix apache wsgi socket permissions
# By default use standard socket location /var/run/apache2/wsgi
# 
# You have to add this script after success execute of start|restart|reload 
# commands in next files:
#   /usr/sbin/apache2ctrl
#   /etc/init.d/apache2

WSGISocketPrefix="/var/run/apache2/wsgi"

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

echo "Wait for other processes to start"
sleep 1
echo "Change wsgi socket permissions"
chmod 0766 ${WSGISocketPrefix}.*

0

运行apache进程的用户似乎没有从指定位置读取/写入的权限。

通常可以通过在VirtualHost conf中设置WSGIDaemonProcessWSGIProcessGroup指令来解决这个问题。

WSGIDaemonProcess process-name user=user group=group threads=10 python-path=vitrual-env-path
WSGIProcessGroup process-group

您也可以选择(除非没有其他权限/组问题)仅向运行Apache进程的用户添加相关路径读写访问权限。

chmod [apache-user]+rw /etc/httpd/logs/

实际上,我检查了wsgi日志文件,它是srwx------ 1 apache 0 Feb 28 07:14 wsgi.17555.5.1.sock。这不意味着apache已经拥有读写权限了吗? - hobbes3
另外,我对您的“chmod”命令感到困惑。您可以将文件权限设置为特定用户,例如apache吗??顺便说一下,Apache用户和组是apache。我不知道如何找到我的虚拟Python环境(或者我们是否在使用一个)。 - hobbes3
如果您没有使用virtual-env,您可以安全地忽略该部分。如果您不知道,那么您可能没有使用它。 - lprsd
谢谢你的帮助。那么threads=10部分怎么办?我应该使用user=user还是你在我的情况下意味着user=apache?我需要多了解一下这个lol。 - hobbes3
"chmod [apache-user]+rw /etc/httpd/logs/" 这不是允许 apache-user 进入目录的正确方式。它需要 r+x。 - jpic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接