从命令行在任何目录中启动 apache 服务器

Posted

技术标签:

【中文标题】从命令行在任何目录中启动 apache 服务器【英文标题】:Start an apache server in any directory from command line 【发布时间】:2012-11-21 15:15:02 【问题描述】:

我希望能够从命令行启动 apache 服务器,输入类似 apache site-folderapache . --port=2000 的内容

这应该读取和使用.htaccess 文件。

我知道python -m SimpleHTTPServer,它与我需要的很接近,但并不完全。

理想的解决方案:

    为 apache 本身贡献一个出色的命令行界面 编写一个简单的命令行工具来包装/包含 apache(或其他东西) 链接到 apache 现有 cli 上的文档

我只想输入command <Directory> --port=8000 --other-options

命令名称也可以是pache

在某些时候我可能想在生产中使用它。应该很容易将进程发送到后台,然后停止该实例或所有实例,例如forever

相关链接:http://httpd.apache.org/docs/2.4/programs/httpd.html

还有

任何人都应该只有一个命令来安装脚本以供立即使用

【问题讨论】:

主目录中的 .globalhtaccess 文件会很棒 您为什么要寻找这种方法而不是传统的虚拟主机? 我的意思是你用VirtualHost 指令定义的那些。 500 赏金看起来很诱人,但它并不能回答您的问题。在生产中,您应该使用apachectl 命令来(重新)启动和停止。并使用 VirtualHost 指令正确配置基于端口的主机。如何做到这一点是一个广泛的问题。至少需要一个book 才能回答。在您想出自己的生产配置之前,请研究并了解其他默认配置,例如 Debian 或 OpenBSD。生产的便利性不仅仅是一条线;它不会因为你的服务器宕机而从你的夜间睡眠中被唤醒。 或 init/service 脚本,无论你的平台上的什么,而不是 apachectl。 【参考方案1】:

apache 调试模式 (-X) 怎么样?

apache2 -X -d. -f.htaccess -C"PidFile `mktemp`"  -C"Listen 1025" 
-C"ErrorLog /dev/stdout" -C"DocumentRoot `pwd`"

要在启动后将其置于后台,您可以使用 Ctrl^Z 然后输入“bg”

使用 FOREGROUND 标志,将其包装在 shell 脚本中:

#!/bin/sh
if [ $# -ne 2 ]; then 
    echo "$0 <port> <dir>"
    exit 10 
fi
/usr/sbin/apache2 -DFOREGROUND -d. -f.htaccess -C"PidFile `mktemp`" \ 
-C"Listen $1" -C"ErrorLog /dev/stdout" -C"DocumentRoot $2" -e debug

称它为“pache”,chmod +x,然后就可以运行了

./pache 1026 /tmp/webroot

【讨论】:

真的很酷!我得到了这个输出: $ ./pache 1026 。 –– 用法:mktemp [-d] [-q] [-t 前缀] [-u] 模板... –– mktemp [-d] [-q] [-u] -t 前缀 –– ./pache:第 6 行:/usr/sbin/apache2:没有这样的文件或目录 –– ./pache:第 7 行:-CListen 1026:找不到命令所以我打算从 homebrew 安装最新的 apache.. 在 homebrew-dupes而不是默认的常规自制软件 github.com/Homebrew/homebrew-dupes/blob/master/httpd.rb 我认为这应该更新到 2.4.4,但我不应该在没有 --disable-debug 的情况下安装它来使用你的方法吗? afaik 有三种方法可以将其置于前台。使用 -X(调试标志),使用 -DFOREGOUND,使用 -DNO_DETACH。最新的两个应该独立于 --disable-debug 标志。你可以试试这个pastebin.com/raw.php?i=p7sfyN5c 吗? “apache2”必须指向您本地的 apache 安装二进制文件。 所以,我没有 apache2, 命令而是 httpd 命令。我改变了那个。然后..pastebin.com/PS4qWgRN 不要使用 sudo。只需添加 -C"LockFile foobar" 所以 mktemp fooXXX 不需要是一个变量,然后你会 LockFile ?我不知道该怎么做【参考方案2】:

http-server 是一个比 pache 更简单的 http 服务器,这是我目前使用的! :)

使用 [pache][1]

使用 npm 安装 - 这里带有节点:http://nodejs.org/

sudo npm install pache -g

在当前目录,端口 3000 上运行:

pache

或者指定目录和端口:

pache site-directory 2000

[1]:https://github.com/devinrhode2/pache

【讨论】:

亲爱的其他人 - 我不是想沙包你,我的同事和世界其他地方只需要一个简单的解决方案就可以在终端运行 apache 我确实希望您将赏金提供给最能激发您的 javascript 解决方案的人。你为什么不坚持sh?必须安装 nodejs 并不像使用已经安装的那样容易。 @DevinGRhode 不错的发现。以前没听说过pache,但我喜欢它的简单性。 :) 非常非常酷。可惜没有被别人发现。尽管如此,为了获得更大的灵活性和可能更熟悉 Apache 配置的用户群,具有模板化配置的 shell 包装器解决方案对于更大的部署会更好。好吧,要么这样做,要么自定义补丁代码来做同样的事情。 :) 纯 bash 解决方案会更好,我碰巧更熟悉 node(碰巧也更跨平台) – WingTangWong,我昨晚写了 pache – Chris,我很喜欢向@gpilotino 提供赏金,因为他在弄清楚 apache 命令方面帮助了我最多,但他的回答中还没有简单性(同事、朋友等需要能够轻松安装脚本)跨度> 喜欢这个。对于对 node 比对灯组更满意的开发人员来说,这是一个很好的选择。【参考方案3】:

这行得通:

您的 apache 配置可能指向 /var/www

然后使用:

sudo mount -o bind /home/webcreatorperson/mywebsite /var/www

解除绑定使用:

sudo umount /var/www

如果您需要多个端口,您可以在 apache 中预配置端口以指向 /var/www/8000 等目录。

【讨论】:

您显然可以使用脚本或别名来简化一些事情。 这种方法的问题是端口 80 可能正在用于其他用途,或者您可能想要提供多个分离的目录。但这是解决问题的一个有趣的角度。 它有效!但是我有 .htaccess 并且我的 .htaccess 没有安装到 /var/www 为什么?【参考方案4】:

为什么不使用 Gatling,它可以让你做你想做的事?

http://www.fefe.de/gatling/

【讨论】:

看起来相当低于标准。这应该使用包管理器而不是一次性 tarball。 “El-cheapo .htaccess 支持”并不是我想要的。 “快速而肮脏的 SSL/TLS 支持”听起来也很糟糕。【参考方案5】:

希望您能找到解决方案。我讨厌.htaccess。所以我写了这个:

#!/bin/bash
cat >._apache2_dir_conf << EOF
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
ErrorLog $1/._apache2_dir_error.log
HostnameLookups Off
NameVirtualHost *:$2
ServerName joyeruc
Listen $2
PidFile $1/._apache2_pid
<VirtualHost *:$2>
    ServerAdmin joyer@uc
    DocumentRoot $1
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory $1/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
    </Directory>
    ErrorLog $1/._apache2_dir_error.log
    LogLevel warn
</VirtualHost>

EOF

#apache2 -k $3 -X -f $1/._apache2_dir_conf
apache2 -X -f $1/._apache2_dir_conf

【讨论】:

【参考方案6】:

为了任何遇到同样问题的人的利益,我想要一些与提到的 pache 包一样简单的东西,但不依赖于安装 node.js。

我的用例是寻找替代Jekyll 中使用的 webrick 服务器。 Webrick 与大多数轻量级随处运行的 http 服务器一样,不支持 .htaccess 文件。

所以我接受了 gpilotino 的回答并将其打包了一下。我已经使用它几个星期了,尽管我确信它可以在完成工作后得到改进。它以脚本和最小的 httpd.conf 文件的形式提供,便于扩展以支持 PHP。

您可以在以下位置找到它:https://github.com/julianbrowne/apache-anywhere

基本上,一旦安装(可选的配置调整),您只需运行:

apache -d document_root_directory -p port

和:

apache stop port

当你完成时。

【讨论】:

【参考方案7】:

嗯……很有趣。

我明白为什么您希望能够根据需要在不同的端口等上生成一个单独的 apache 实例。

也就是说,有时,您只想更改一个实例的配置,或者您希望用户能够自助服务,等等。

但更重要的是,您希望能够为您的用户提供 Apache 灵活性,而不会破坏其他所有人的 Apache。这是一个庞大的虚拟主机配置文件无法处理的事情。

我在自己的环境中有类似的设置。

无论哪种情况,要在 Mac 上使用自定义设置启动 Apache,我都是这样做的:

文件夹/文件:

~/site/conf/httpd.conf 〜/网站/日志/ 〜/网站/公共/

httpd.conf 文件内容:

# Can be substituted with an Include statement, which all httpd.conf can pull in.
# Included here for simplicity/single file example.
LoadModule authn_file_module /usr/libexec/apache2/mod_authn_file.so
LoadModule authn_dbm_module /usr/libexec/apache2/mod_authn_dbm.so
LoadModule authn_anon_module /usr/libexec/apache2/mod_authn_anon.so
LoadModule authn_dbd_module /usr/libexec/apache2/mod_authn_dbd.so
LoadModule authn_default_module /usr/libexec/apache2/mod_authn_default.so
LoadModule authz_host_module /usr/libexec/apache2/mod_authz_host.so
LoadModule authz_groupfile_module /usr/libexec/apache2/mod_authz_groupfile.so
LoadModule authz_user_module /usr/libexec/apache2/mod_authz_user.so
LoadModule authz_dbm_module /usr/libexec/apache2/mod_authz_dbm.so
LoadModule authz_owner_module /usr/libexec/apache2/mod_authz_owner.so
LoadModule authz_default_module /usr/libexec/apache2/mod_authz_default.so
LoadModule auth_basic_module /usr/libexec/apache2/mod_auth_basic.so
LoadModule auth_digest_module /usr/libexec/apache2/mod_auth_digest.so
LoadModule cache_module /usr/libexec/apache2/mod_cache.so
LoadModule disk_cache_module /usr/libexec/apache2/mod_disk_cache.so
LoadModule mem_cache_module /usr/libexec/apache2/mod_mem_cache.so
LoadModule dbd_module /usr/libexec/apache2/mod_dbd.so
LoadModule dumpio_module /usr/libexec/apache2/mod_dumpio.so
LoadModule reqtimeout_module /usr/libexec/apache2/mod_reqtimeout.so
LoadModule ext_filter_module /usr/libexec/apache2/mod_ext_filter.so
LoadModule include_module /usr/libexec/apache2/mod_include.so
LoadModule filter_module /usr/libexec/apache2/mod_filter.so
LoadModule substitute_module /usr/libexec/apache2/mod_substitute.so
LoadModule deflate_module /usr/libexec/apache2/mod_deflate.so
LoadModule log_config_module /usr/libexec/apache2/mod_log_config.so
LoadModule log_forensic_module /usr/libexec/apache2/mod_log_forensic.so
LoadModule logio_module /usr/libexec/apache2/mod_logio.so
LoadModule env_module /usr/libexec/apache2/mod_env.so
LoadModule mime_magic_module /usr/libexec/apache2/mod_mime_magic.so
LoadModule cern_meta_module /usr/libexec/apache2/mod_cern_meta.so
LoadModule expires_module /usr/libexec/apache2/mod_expires.so
LoadModule headers_module /usr/libexec/apache2/mod_headers.so
LoadModule ident_module /usr/libexec/apache2/mod_ident.so
LoadModule usertrack_module /usr/libexec/apache2/mod_usertrack.so
LoadModule setenvif_module /usr/libexec/apache2/mod_setenvif.so
LoadModule version_module /usr/libexec/apache2/mod_version.so
LoadModule proxy_module /usr/libexec/apache2/mod_proxy.so
LoadModule proxy_connect_module /usr/libexec/apache2/mod_proxy_connect.so
LoadModule proxy_ftp_module /usr/libexec/apache2/mod_proxy_ftp.so
LoadModule proxy_http_module /usr/libexec/apache2/mod_proxy_http.so
LoadModule proxy_scgi_module /usr/libexec/apache2/mod_proxy_scgi.so
LoadModule proxy_ajp_module /usr/libexec/apache2/mod_proxy_ajp.so
LoadModule proxy_balancer_module /usr/libexec/apache2/mod_proxy_balancer.so
LoadModule ssl_module /usr/libexec/apache2/mod_ssl.so
LoadModule mime_module /usr/libexec/apache2/mod_mime.so
LoadModule dav_module /usr/libexec/apache2/mod_dav.so
LoadModule status_module /usr/libexec/apache2/mod_status.so
LoadModule autoindex_module /usr/libexec/apache2/mod_autoindex.so
LoadModule asis_module /usr/libexec/apache2/mod_asis.so
LoadModule info_module /usr/libexec/apache2/mod_info.so
LoadModule cgi_module /usr/libexec/apache2/mod_cgi.so
LoadModule dav_fs_module /usr/libexec/apache2/mod_dav_fs.so
LoadModule vhost_alias_module /usr/libexec/apache2/mod_vhost_alias.so
LoadModule negotiation_module /usr/libexec/apache2/mod_negotiation.so
LoadModule dir_module /usr/libexec/apache2/mod_dir.so
LoadModule imagemap_module /usr/libexec/apache2/mod_imagemap.so
LoadModule actions_module /usr/libexec/apache2/mod_actions.so
LoadModule speling_module /usr/libexec/apache2/mod_speling.so
LoadModule userdir_module /usr/libexec/apache2/mod_userdir.so
LoadModule alias_module /usr/libexec/apache2/mod_alias.so
LoadModule rewrite_module /usr/libexec/apache2/mod_rewrite.so
LoadModule hfs_apple_module /usr/libexec/apache2/mod_hfs_apple.so

# These can also be turned into an Include. 
PidFile logs/httpd.pid
LockFile logs/httpd.lock

# Can be substituted for a variable in an Include.
Listen 8099
NameVirtualHost *:8099

# Just put this here to stop the startup error. Can be replaced with something else.
ServerName test

Include /etc/apache2/extra/httpd-autoindex.conf
Include /etc/apache2/extra/httpd-default.conf
Include /etc/apache2/extra/httpd-info.conf

<VirtualHost *:8099>
    DocumentRoot /Users/doe/site/public
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    ErrorLog logs/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

</VirtualHost>

这利用了 Apache 的系统范围安装。

启动实例:

export PATH=/usr/sbin:$PATH
httpd -f /Users/doe/site/conf/httpd.conf  -d `pwd` -T  -k start

模块的配置、监听的端口、php、pid 和锁定文件位置等可以移动到外部包含,这将由管理员而不是用户控制。然后,您可以为用户提供一个基线模板 httpd.conf 文件,一个简单的启动/停止/重新加载/等。包装器,并让您的所有用户都能够启动他们自己的网站。

鉴于它是 Mac OS 环境,您需要安装的越少,管理就越简单。

【讨论】:

以上是关于从命令行在任何目录中启动 apache 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何从命令行在 iPhone 上启动 OCUnit 测试

linux系统下apache服务的启动停止重启命令

apache服务器启动关闭脚本的编写

Mac Apache Web 服务器将不再启动并且找不到任何 Web 目录

如何从命令提示符启动 apache tomcat 服务器的调试模式?

Linux启动apache失败怎么办