我应该为干净的Apacheconfiguration设置什么文件

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

最近,我build立了一个使用HTTPS的服务器。 我买了证书,并设置了它。 这不是太糟糕,但它让我思考。 我设置的每个Apacheconfiguration似乎有点不同。 我不应用任何最佳做法; 只是使用这些更改来构build默认安装,使我的应用程序运行。

这现在困扰我了。 我目前运行Apache 2.2,并且希望为自己制定一个可以保持一致的约定,我可以更快地部署到更多的服务器上。

所以我的问题是,我应该使用什么文件,他们应该如何互动? 例如,我认为大多数人都同意用调整加载你的主Apacheconfiguration是一个坏主意。 那么你应该把它剥离到最低限度,并实施多个包括? 你如何正确设置sites-available目录( sites-enabled符号链接)? 因为有许多方法可以做,而且由于Apache允许在多个地方使用相同的影响,所以我发现在所有这些文件中都会散布出来,包括在.htaccess文件中使用类似mod_rewrite东西(我开始相信这是一个坏主意,除非你是共享主机,这是唯一的方法)。

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

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

然后是WSGI。 如果你部署Django的网站,这进一步复杂的事情。 我应该使用/home/user/project/project/wsgi.py还是/var/www/project/index.wsgi ? 这些文件如何与Apacheconfiguration交互?

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

 /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主configuration,其中包含模块,其他的有mods-availablemods-enabled

就像我上面所说,似乎有很多重叠,所以我不惊讶这是一个棘手的话题要掌握。

另外,如果有人知道一个很好的参考步骤,我会有兴趣看到它。 我有几本旧的阿帕奇书籍,他们只是没有把它分解。 他们认为你是完整的初学者,并且只保留默认值。 Apache的文档是相当不错的,我经常去他们,但我所寻找的一个全面的来源似乎并不存在(或者,我还没有find最好的search条件来find它)。

我喜欢以下设置。 这对我和我的情况以及我所做的大部分工作都很有帮助。 我目前不使用网站启用/网站可用。 我也不喜欢使用.htaccess文件,如果可能的话。我的主要目标是保持一个网站的所有configuration尽可能接近其余的网站configuration。 这样,如果我以相同的方式设置另一台服务器,我可以在vhost文件中popup并完成。

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> 

明显的参考当然是手册 。

  • 简单地说:主要apacheconfiguration文件的名称/位置是一个编译时间选项,通常是一个名为httpd.conf的文件。
  • 如果你愿意,configuration文件默认位置的名称/位置可以被-f命令行开关覆盖。
  • configuration文件每行包含1个指令。
  • Apacheconfiguration文件从上到下被parsing

  • 可以把所有用于configurationApache的指令放在这个文件中。

  • 可以在主httpd.conf中使用IncludeIncludeOptional指令来包含来自其他文件的指令。

    包含的文件在Include指令的位置进行parsing,并按从上到下的顺序进行parsing。 Include apache的结尾将返回到主要的httpd.confconfiguration,下一个指令将被parsing。

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

单个configuration文件或嵌套使用包括允许您达到相同的最终状态。 无论什么最适合你。

比较单个configuration文件:

 #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 

两者的结果完全相同,在这方面没有“最好的”。

如果您手动维护单个configuration,那么单个文件实际上可能效果最好。 您可以轻松地从上到下读取它,这使得您不太可能因为使您的生活困难的指令顺序而感到惊讶。

如果你有一个configurationpipe理系统,可以很容易地删除部署整个文件,但是在更改configuration文件的某些部分时遇到了困难,那么使用Include dir/*.conf可能会更有意义。

单个文件,明确包含或通配符包括它主要是个人偏好问题和/或充分利用您的工具。

启用网站的站点似乎是Debian / Ubuntu的惯例。


最后一节是AllowOverride指令,允许使用.htaccess文件本地取代上面的Apacheconfiguration文件中所做的设置。 这提供了灵活性,因为您不需要重新启动Apache以使configuration中的更改生效,但会为每个Web请求生成额外的开销,因此需要扫描DocumentRoot和所请求的文件之间的所有目录,以查找是否存在潜在的.htaccess文件。