【问题标题】:Django mod_wsgi apacheDjango mod_wsgi Apache
【发布时间】:2012-03-17 22:11:01
【问题描述】:

当我尝试访问我的 Django 站点 http://www.satoshi.example.com/mysite 时,我得到了一个 503 Service Temporary Unavailable

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

一件奇怪的事情是我发现我什至不需要自己LoadModule wsgi_module modules/mod_wsgi.sohttpd.conf。我认为我的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

【问题讨论】:

    标签: django apache mod-wsgi


    【解决方案1】:

    此问题记录在:

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

    其他人给出的更改权限的解决方法是错误的。

    正确的解决方案是将套接字文件的保存位置更改为 Apache 用户可以读取它们的位置。

    在保护日志目录的系统上,它们有时会设置一个系统来在您弄乱它们时设置这些权限。因此,任何更改都可能只是暂时的。

    【讨论】:

    • 我的经验是,无论您在哪里设置套接字位置,它们都将始终具有更严格的权限(例如 srwx-------- www-data root ),因此您必须更改套接字权限。
    • 您不需要也无法设置套接字权限,因为套接字文件的名称会根据进程 ID、Apache 配置生成和守护进程组随时间动态变化实例。 IOW,这不是一个不变的名字。只要 Apache 用户可以访问该目录,它就可以正常工作,因为 mod_wsgi 将确保实际的套接字文件具有正确的权限。
    • @GrahamDumpleton 我已经根据您提供的链接更改了配置,但我仍然收到错误“无法连接到 '/var/run/wsgi.12116.0.1 上的 WSGI 守护进程 'wsgi'。多次尝试后的袜子”
    【解决方案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}.*
    

    【讨论】:

      【解决方案3】:

      运行 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已经有读/写权限了吗?
      • 我也对你的chmod 命令感到困惑。您可以将文件权限设置为特定用户,在本例中为 apache??顺便说一下,apache 用户和组是apache。我不知道如何找到我的虚拟 python 环境(或者我们是否正在使用一个)。
      • 如果您没有使用 virtual-env,您可以放心地忽略该部分。如果你不知道,你可能不知道。
      • 感谢您的帮助。 threads=10 部分呢?那么我应该使用user=user 还是在我的情况下您的意思是user=apache?我需要阅读更多关于这个大声笑的信息。
      • "chmod [apache-user]+rw /etc/httpd/logs/" 这不是允许 apache-user 进入目录的方式。它需要 r+x。
      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 2014-11-29
      • 1970-01-01
      • 2012-11-04
      • 2011-07-14
      • 2016-03-15
      • 2014-09-20
      • 2011-11-23
      相关资源
      最近更新 更多