1

/var/www/html我有一个在 Web 根目录 ( )中运行 WordPress 的 Apache 服务器。在我的 access_log 中,我看到了许多表单条目:

98.209.16.114 - - [15/Feb/2013:21:19:51 -0500] "GET http://www.twitter.com HTTP/1.1" 301 - "-" "curl/7.28.1"
98.209.16.114 - - [15/Feb/2013:21:19:51 -0500] "GET http://www.twitter.comhttp/www.twitter.com HTTP/1.1" 301 - "-" "curl/7.28.1"
98.209.16.114 - - [15/Feb/2013:21:19:51 -0500] "GET http://www.twitter.comhttphttp/www.twitter.comhttp/www.twitter.com HTTP/1.1" 301 - "-" "curl/7.28.1"
98.209.16.114 - - [15/Feb/2013:21:19:52 -0500] "GET http://www.twitter.comhttphttphttp/www.twitter.comhttphttp/www.twitter.comhttp/www.twitter.com HTTP/1.1" 301 - "-" "curl/7.28.1"

wherewww.twitter.com可以替换为我自己之外的任意数量的奇数域。

编辑:复制的行包括 curl 因为我正在从我自己的命令行测试这种现象。

httpd.conf我文件中的相关行是:

NameVirtualHost *:80

<VirtualHost *:80>
  DocumentRoot /var/www/html
  ServerName www.mydomain.com
  <Directory /var/www/html>
    AllowOverride All
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  ServerName mydomain.com
  RewriteEngine On
  RewriteRule ^/(.*) http://www.mydomain.com/$1 [L,R=301]
</VirtualHost>

.htaccessWordPress 目录中的文件如下所示:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

这种情况每天发生数十次。我有几个问题是:

  • 我应该担心这么多代理尝试吗?我已经关闭了 mod_proxy 并且当 http 请求循环时,https 请求似乎返回301或者400
  • 有什么我应该担心的性能损失吗?
  • 我该如何解决该死的事情?

让我知道您还需要什么其他信息。

4

1 回答 1

2

您需要由 apache 为 wordpress 加载的唯一模块如下......这不包括您的 php 模块,我将在之后解释一下:

LoadModule authz_host_module modules/mod_authz_host.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule env_module modules/mod_env.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule headers_module modules/mod_headers.so

根据您运行的是 php fcgi 还是 php mod_php (prefork),您将包括以下内容之一:

#---- For FPM of PHP Enable both below and disable php5_module
LoadModule fastcgi_module modules/mod_fastcgi.so
LoadModule actions_module modules/mod_actions.so
#---- For standard php5 module enable below and disable 2 above
#LoadModule php5_module  modules/libphp5.so

我根据您的日志输出看到的重定向看起来更像是配置错误的 mod_rewrite 规则,或者 wordpress 中与 apache 上的规则冲突的 301 重定向插件。

现在作为一般经验法则,当我们托管基于 namevirtualhost 的虚拟主机时,我们会创建一个默认的虚拟主机,其服务器名称为default

并将其 doc root 设置为包含 1 个 html 文件的目录并重写规则以将所有流量传输到 index.html (html 文件仅输出托管的) 这样您就可以过滤掉所有不基于的垃圾流量您的域本身,因为它只运行 html 它不需要任何基于 php 的 iops,因为它只是静态 html。

这样,您的虚拟主机将仅处理对其托管的域的请求。现在,这并不能解决正在发生的 301 问题。如果您可以分享您的 mod_rewrite 配置,那么也许我们可以提供一些帮助。

我在社区中看到的基于 SSL 的流量的最大问题是,当开发人员必须与负载均衡器集成时,SSL 证书在负载均衡器而不是 apache 上被截断。话虽如此,您不能再执行重写条件/规则来检查 https != on,将 301 重定向到新位置,因为负载均衡器终止证书并将 http(端口 80)流量发送到您的网络主机,因此 apache 将始终认为它是未加密的,即使它命中了一个安全的虚拟主机

关于您的虚拟主机的附加说明。除非绝对必须,否则最好不要使用 .htaccess 文件。对于 wordpress,vhost 目录元素应该看起来像这样以获得最佳性能。

<VirtualHost *:80>
        ServerName www.example.com
        DocumentRoot /path/to/doc_root
        <Directory /path/to/doc_root/>
                AllowOverride None
                Options SymLinksIfOwnerMatch MultiViews -Indexes
                Order allow,deny
                Allow from all
                RewriteEngine On
                RewriteRule ^index\.php$ - [L]
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule ^.*$ index.php [L]
        </Directory>
</VirtualHost>

我说最佳性能的原因是 .htaccess 文件不会被 apache 读取到它的每个请求。而是将其作为 vhost 配置的一部分读取,并将配置保存在内存中,因此除了不必依赖 .htaccess 文件和覆盖的额外安全性之外,您还可以通过不使用 .htaccess 来节省大量的 iops。

最后使用 RewriteBase 是无关紧要的,有时只会导致问题,除非您在 /blog/ 等特定别名下托管 wordpress 在您的情况下,基于您的 .htaccess 文件,它似乎位于基本域中,因此不需要在那里。作为参考,请参阅我在上面的 vhost 配置中的重写规则。

于 2013-02-26T20:14:57.600 回答