我应该设置哪些文件来清理 Apache 配置

我应该设置哪些文件来清理 Apache 配置

我对 Apache 并不陌生,但也不是专家(无论如何)。我运行过多个版本的 WAMP 和 XAMP 服务器设置。我的大多数 Apache 配置都很简单。我通常运行默认主配置文件(httpd.confapache.conf)和一个或两个包含文件(例如,使用不同的端口)和一些特定于站点的虚拟主机文件。

最近,我设置了一个使用 HTTPS 的服务器。我购买了证书并进行了设置。这不是太糟糕,但它让我思考。我设置的每个 Apache 配置似乎都有点不同。我没有应用任何最佳实践;只是从默认安装中构建了一些零碎的东西,仅使用这些更改来运行我的应用程序。

这让我很困扰。我目前运行的是 Apache 2.2,我想为自己制定一个可以保持一致的约定,这样我就可以更轻松地以更快的方式将其部署到更多服务器。

所以我的问题是,我应该使用哪些文件以及它们应该如何交互?例如,我认为大多数人都同意,用调整加载您的主 Apache 配置是一个坏主意。那么您是否应该将其精简到最低限度并实现多个包含?您如何正确设置目录sites-availablesites-enabled填充符号链接)?因为有很多方法可以做事情,而且由于 Apache 允许在多个地方使用具有相同效果的指令,我发现零碎的东西分散在所有这些文件中,包括mod_rewrite.htaccess文件中使用类似的东西(我开始相信这是一个坏主意,除非您在共享主机上,这是唯一的方法)。

对于 SSL,您是否设置default-ssl文件或project-ssl。我在一台服务器上运行多少个虚拟主机?

我知道我的问题有些主观。可能没有客观的答案。但我的目标是尽可能接近客观的答案。

然后是 WSGI。如果您部署 Django 站点,这会使事情变得更加复杂。我应该使用/home/user/project/project/wsgi.py还是/var/www/project/index.wsgi?这些文件如何与 Apache 配置交互?

以下是我关心的文件列表:

/etc/apache2/apache.conf
/etc/apache2/httpd.conf
/etc/apache2/ports.conf
/etc/apache2/envvars (mostly self explanatory)
/etc/apache2/conf.d/project.conf
/etc/apache2/conf.d/security
/etc/apache2/sites-available/default
/etc/apache2/sites-available/default-ssl
/etc/apache2/sites-available/project
/etc/apache2/sites-available/project-ssl

为什么有些 Apache 安装具有包含模块的 Apache 主配置,而其他安装具有mods-availablemods-enabled

正如我上面所说的,似乎有很多重叠之处,所以我并不惊讶这是一个难以掌握的话题。

或者,如果有人知道一个好的参考资料可以逐步完成此操作,我会很感兴趣。我有几本较旧的 Apache 书籍,但它们并没有分解。它们假设您是完全的初学者,并且您不用考虑默认设置。Apache 文档非常好,我经常查看它们,但似乎没有我想要的综合来源(或者,我还没有找到最好的搜索词来找到它)。

答案1

我喜欢以下设置。它对我和我的情况以及我所做的大部分工作都很有效。我目前不使用 site-enabled / site-available。如果可能的话,我也不喜欢使用 .htaccess 文件。我的主要目标是使站点的所有配置尽可能接近该站点其余配置。这样,如果我以相同的方式设置另一台服务器,我只需弹出 vhost 文件即可完成。

httpd.conf:我保持它整洁,仅加载模块和包含。

httpd-ssl.conf:我只是添加了任何 ssl 工作所必需的内容。

AddType application/x-x509-ca-cert .crt 
AddType application/x-pkcs7-crl    .crl
SSLPassPhraseDialog  builtin
SSLSessionCache        "shmcb:/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout  300
SSLMutex  "file:/var/run/ssl_mutex"

httpd-vhosts:我尝试将每个站点所需的所有内容完全包含在 VirtualHost 标签中。

Listen 443
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName test.org
SSLEngine on
SSLCertificateFile /etc/ssh/test.org.crt
SSLCertificateKeyFile /etc/ssh/test.key
SSLCertificateChainFile /etc/ssh/test.crt
ErrorLog "/var/log/test.org-error_log
ProxyPreserveHost on
ProxyPass / http://127.0.0.1:2368/ retry=0
</VirtualHost>          

<VirtualHost *:443>
ServerAdmin [email protected]
DocumentRoot /usr/local/www/tinyrss/data             
ServerName test2.domaintest.org
SSLEngine on
SSLCertificateFile /etc/ssh/test2.crt
SSLCertificateKeyFile /etc/ssh/test2.key
ErrorLog "/var/log/test2.domaintest.org-error_log"
</VirtualHost>

答案2

显而易见的参考当然是手册

  • 简而言之:主 apache 配置文件的名称/位置是一个编译时选项,通常名为httpd.conf.
  • -f如果您愿意,可以使用命令行开关覆盖配置文件的默认位置的名称/位置。
  • 配置文件每行包含 1 个指令。
  • 从上到下解析apache配置文件

  • 将用于配置 apache 的所有指令都放在该文件中。

  • 可能使用主 httpd.conf 中的Include或指令来包含来自其他文件的指令。IncludeOptional

    包含的文件在 Include 指令的位置进行解析,并按从上到下的顺序进行解析。在 Include 结束时,apache 将返回到主 httpd.conf 配置,并解析下一个指令。

    如果Include指令包含通配符,则包含的文件将按字典顺序进行解析。

单一配置文件或使用包含文件嵌套都可让您达到相同的最终状态。无论哪种方式对您来说都是最好的。

对比一下单个配置文件:

#httpd.conf
Directive 1
Directive 2
Directive 3 
Directive 4

到主 http.conf

#httpd.conf
Directive 1
Include other.conf 
Directive 4

以及包含的文件:

#other.conf
Directive 2
Directive 3 

两者的配置完全相同,在这方面没有“最佳”的配置。

如果您手动维护单个配置,那么单个文件实际上可能效果最好。您可以轻松地从上到下阅读它,这样您就不太可能因为指令的顺序而感到困惑,从而导致生活变得困难。

如果您有一个配置管理系统,可以轻松删除或部署整个文件,但在更改配置文件的某些部分时遇到困难,那么使用Include dir/*.conf可能更有意义。

单个文件、显式包含或通配符包含主要是个人偏好和/或充分利用您的工具的问题。

sites-available sites-enabled 似乎是 Debian / Ubuntu 的惯例。


最后一部分是AllowOverride指令允许通过使用.htaccess文件。这提供了灵活性,因为您不需要重新启动 apache 即可使配置更改生效,但会产生额外的开销,因为对于每个 Web 请求,都需要扫描 DocumentRoot 和请求的文件之间的所有目录以查找潜在的 .htaccess 文件。

相关内容