好吧,在新的Ubuntu 12.04上,我通过sudo tasksel install lamp-server来安装灯pipe栈
接下来我要做的就是改变apache运行的用户和组并重新启动。 应该很容易吧? 错误。
Apache的安装,使得它从/ etc / apache2 / envvars获得用户和组我编辑这个文件,并更改用户和组,然后执行“apachectl restart”和… nope,旧的用户和组仍在使用(通过phpinfo确认)。 但是,如果我做“apachectl stop”,然后“apachectl start”,那么它的工作。 然而,这很糟糕,因为我试图为Vagrant编写一个bootstrap.sh脚本,而且这两种方法都不能在这种情况下工作(我猜停止/启动发生得太快,所以“stop”工作时,“start”不。
在一个完美的世界里,“重新启动”将会完成它的工作,并且实际上从envvars中重新加载新的值。 有任何想法吗??
在理想的世界里,人们会阅读文档:-)
http://httpd.apache.org/docs/2.2/stopping.html#hup
信号:HUP
apachectl -k重启
发送HUP或重新启动信号给父项导致它像TERM中那样closures其子项,但父项不会退出。 它重新读取其configuration文件,并重新打开所有日志文件。 然后它产生了一组新的儿童,并继续提供点击。
由于父母没有重新启动,您不能使用重新启动来更改它正在运行的用户。
你可以使用/etc/init.d/apache2 restart或者service apache2 restart 。 这些都确实是一个停止和开始,处理一些可能的错误。
你是否绝对肯定在其他Apacheconfiguration文件中没有隐藏其他User或Group指令? 请记住,遇到的最后一个“胜利”。
如果你认为“事情应该是”根本不可能的话,那么这不是Apache的错(至less在Apache中不是)。 用户更改由系统调用setuid()完成。 在root调用了这个函数之后,就没有办法回来了。 正是这个特性使得这个系统调用是安全的。
如果你的Apache正在运行,比如用户www并且你希望它运行为wwwrun那么Apache就不能满足你的愿望,因为缺less技术特权。 如果您restart Apache,则不会发生此问题,因为正在运行的进程被终止并且启动了一个新进程:以root用户身份运行。 作为根可以改变它的用户。
当然,内核可以决定更改进程的用户。 我不知道是否有任何官方的方式来做到这一点。 但只有一个根进程可以让内核做到这一点。 Apache(sudo-like)必须向有特权的进程发出信号,表示希望更改其用户。 但考虑到很less发生这种情况,我怀疑内核人员是否有兴趣实现这样的安全相关function。
好的,所以下面的脚本在我的需求中工作:
sudo apachectl stop sleep 5 sudo apachectl start
这是不完美的,因为我宁愿基于“停止”是否实际完成(而不是暂停5秒),但由于这是build立新的服务器环境的引导脚本,它应该是相当可靠的。 如果有人有更好的答案,请随时给予。 (虽然具体。)