【问题标题】:Apache httpd doesn't load .bashrcApache httpd 不加载 .bashrc
【发布时间】:2012-04-06 14:57:28
【问题描述】:

我在 Apache 2.2 下将 Python 脚本作为 CGI 运行。这些脚本依赖于我的 .bashrc 中设置的环境变量才能正常运行。 .bashrc 永远不会加载,我的脚本失败了。

我不想通过使用一堆 SETENV 命令来复制我的 bashrc;配置文件很容易不同步并导致难以发现的错误。

我以我的用户身份运行 apache,而不是以 root 身份运行。我正在手动启动/停止它,所以 /etc/init.d 脚本根本不重要(我认为)。

鉴于这些限制,当调用 CGI 时,我可以做些什么来加载我的 .bashrc?

编辑:我使用 /usr/sbin/apache2ctl 进行重启。

【问题讨论】:

    标签: python bash cgi apache


    【解决方案1】:

    什么?当然,您并不是说您的脚本依赖于某个帐户的个人主目录中的配置。

    Apache 配置文件可以将环境变量导出到 CGI 脚本等。

    也许你的程序过于依赖太多的环境变量。支持配置文件怎么样:/etc/mypythonprogram.rc。为了灵活性,可以有一个环境变量告诉程序使用替代配置文件。

    【讨论】:

    • 描述或链接可能会有所帮助。这是后者:stackoverflow.com/questions/2941136/… 标记为 php,但我认为该原则适用。不过,这就是 OP 说他不想做的事情。也许是一个减轻他恐惧的解释?
    • @Kaz:我有一堆我通常在命令行中使用的脚本,我正在为其中的一些创建一个私有 Web 界面。这些命令行工具依赖于环境变量——这是不可协商的。
    • @Wilduck:实际上,该链接有帮助。 PassEnv 是一个不错的解决方案,尽管并不理想。环境变量集不会经常更改,尽管它们的值会更改。告诉 Apache 使用来自外部环境的任何值至少可以避免在我更改值时出现问题,尽管在我添加新参数时不会出现问题。
    【解决方案2】:

    您为什么要手动启动/停止它?似乎使用 init 脚本会有所帮助。您可以在 httpd.conf 文件中指定运行 httpd 进程的用户名,也可以指定环境设置。对于 RedHat/CentO,这看起来像:

    将环境设置添加到文件 /etc/sysconfig/httpd 中(或者,您可以设置一个命令从另一个文件中读取这些环境变量,并在必要时在您的 .bashrc 中设置相同的命令 -- 所以只有一个文件包含您需要的环境设置)。

    修改 /etc/httpd/conf/httpd.conf 文件,使运行 httpd 进程的用户为非 root 用户(在 RedHat/CentOs 中默认为 apache)。

    完成后,使用 /etc/init.d/httpd 启动和停止进程,您应该处于良好状态。

    针对发帖人的评论进行了更新:

    你不想从你的 bashrc 中读取...并使用 /usr/init.d/httpd 重启(它就像 apache2ctl 一样简单)... 至于如何做到这一点,请将环境变量放入一个新文件。在下面的示例中,我假设您正在使用文件“/etc/httpd/envconfig”。然后将这些行添加到您的 bashrc 和 /etc/sysconfig/httpd:

    如果 [ -f /etc/httpd/envconfig ];然后 . /etc/httpd/envconfig 菲

    现在,您的 bash 和 httpd 脚本都应该可以使用更新的环境变量。

    另一个注意事项是 CGI 环境变量在 Apache 中的处理方式不同,您可能需要查看此 URL:

    http://httpd.apache.org/docs/2.2/env.html

    特别是,“...变量也可以从使用 PassEnv 指令启动服务器的 shell 环境中传递...”

    我相信您需要在 httpd.conf 文件中放置适当的“PassEnv”指令,指定您希望传递给 CGI 脚本的环境变量的名称。好消息是您不必指定值,因此只要您不更改变量本身的名称,您就不必管理两个配置。

    【讨论】:

    • 我正在手动启动/停止它,因为我正在调试它:)。每次更改 httpd.conf 时,我都会重新启动它(我使用 /usr/sbin/apache2ctl)。 “设置一个命令从另一个文件中读取这些环境变量” - 我实际上已经有了这个另一个文件,并且我从我的 .bashrc 中读取了它。我该怎么做?
    猜你喜欢
    • 2010-10-14
    • 2017-11-08
    • 2023-03-18
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多