我对 Apache 并不陌生,但也不是专家(无论如何)。我运行过多个版本的 WAMP 和 XAMP 服务器设置。我的大多数 Apache 配置都很简单。我通常运行默认主配置文件(httpd.conf
或apache.conf
)和一个或两个包含文件(例如,使用不同的端口)和一些特定于站点的虚拟主机文件。
最近,我设置了一个使用 HTTPS 的服务器。我购买了证书并进行了设置。这不是太糟糕,但它让我思考。我设置的每个 Apache 配置似乎都有点不同。我没有应用任何最佳实践;只是从默认安装中构建了一些零碎的东西,仅使用这些更改来运行我的应用程序。
这让我很困扰。我目前运行的是 Apache 2.2,我想为自己制定一个可以保持一致的约定,这样我就可以更轻松地以更快的方式将其部署到更多服务器。
所以我的问题是,我应该使用哪些文件以及它们应该如何交互?例如,我认为大多数人都同意,用调整加载您的主 Apache 配置是一个坏主意。那么您是否应该将其精简到最低限度并实现多个包含?您如何正确设置目录sites-available
(sites-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-available
和mods-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 文件。