我遇到了这个错误:
[Mon Dec 05 10:22:23 2011] [warn] mod_rewrite: Running external rewrite maps without defining a RewriteLock is DANGEROUS!
[Mon Dec 05 10:22:23 2011] [error] (13)Permission denied: mod_rewrite: could not start RewriteMap program /etc/httpd/conf.d/upsell_by_id.py
此错误与此行有关:
RewriteMap upsells prg:/etc/httpd/conf.d/upsell_by_id.py
我意识到这可能意味着 apache 的执行用户无法执行这些文件。如何确定 apache 的执行环境是什么?如何使此文件 upsell_by_id.py 对 apache 可执行?
I get this error when I try to run the upsell_by_id.py as apache:
Traceback (most recent call last):
File "/etc/httpd/conf.d/upsell_by_id.py", line 8, in <module>
keyword_groups = pickle.load(open("/home/zumodo/upsell_backup/upsells.pkl", "rb" ) )
IOError: [Errno 13] Permission denied: '/home/zumodo/upsell_backup/upsells.pkl'
尽管文件 upsells.pkl 似乎具有所有必要的权限,但情况仍然如此:
-rwxrwxrwx. 1 skline skline 6.4M Dec 5 08:50 upsells.pkl
答案1
实际上,您有两个错误。首先是权限错误:
Apache 需要在该文件的每个目录upsells.pkl
以及文件本身上具有适当的权限。
尝试以下方法来确定目录具有什么权限(注意空格很重要):
ls -ld /home/ /home/zumodo/ /home/zumodo/upsell_backup/
Apache 用户将需要x
每个目录的权限。 /home
通常具有所需的权限,但其中所有内容都/home/*
具有模式 750 ( ) 甚至模式 700 (rwx------) 的情况很常见。其中任何一个都会导致您的问题。权限问题也rwxr-x---
可能出现在目录中。upsell_backup
将文件移动upsells.pkl
到更合适的路径(例如/var/www/
)或更改限制目录的权限。
关于的错误消息RewriteLock
是正确的;没有一个是危险的。
Apache 要么是多线程的,要么会生成多个子进程,这意味着其中任何两个子进程都可以同时接收请求。Apache 在内部使用 RewriteLock 来确保一次只有一个子进程或线程与外部进程通信。如果您不指定一个,程序的输出可能会混合在一起,完全扰乱您的重写规则,甚至可能扰乱您的整个服务器。最可能的结果是,当您的服务器变得繁忙时,您将生成大量500
响应。结果可能会更糟。
答案2
暂时禁用RewriteMap upsells
线路并查看 apache 是否启动。如果启动,请检查运行 apache 的用户。
运行以下命令。
ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {print $1}'
此命令将为您提供运行 apache 服务器的用户。然后检查文件的所有权和权限。我认为该文件对于运行 apache/httpd 进程的用户来说应该是可执行的。
然后使用以下命令设置文件的适当权限和所有权。
chown root.apache /etc/httpd/conf.d/upsell_by_id.py
chmod +x /etc/httpd/conf.d/upsell_by_id.py