6

我已经在运行 ML 的 MacBook 上使用 PHP-FPM 设置了 Nginx。它工作正常,但当我在浏览器中运行页面时,连接需要 5 到 10 秒。甚至以下 PHP 脚本:

<?php
die();

连接大约需要 5 秒钟。我正在使用 Chrome,我在状态栏中收到“正在发送请求”消息大约 7 秒。如果我再次刷新它似乎立即工作,但如果我离开它大约 10 秒,它会再次“睡眠”。就好像 nginx 或 PHP 会进入休眠状态,然后需要很长时间才能再次醒来。

编辑:这也会影响服务器上的静态文件,因此这似乎是 DNS 或 nginx 的问题。

谁能帮我弄清楚是什么原因造成的?

nginx.conf

worker_processes 2;

events {
   worker_connections 1024;
}

http {
    include mime.types;
   default_type text/plain;
   server_tokens off;
   sendfile on;
   tcp_nopush on;
   keepalive_timeout 1;
   gzip on;
   gzip_comp_level 2;
   gzip_proxied any;
   gzip_types text/plain text/css text/javascript application/json application/x-javascript text/xml application/xml application/xml+rss;

   index index.html index.php;

   upstream www-upstream-pool{
      server unix:/tmp/php-fpm.sock;
   }

  include sites-enabled/*;
}

php-fpm.conf

[global]
pid = /usr/local/etc/php/var/run/php-fpm.pid
; run in background or in foreground?
; set daemonize = no for debugging
                         daemonize = yes

include=/usr/local/etc/php/5.4/pool.d/*.conf

池.conf

[www]
user=matt
group=staff
pm = dynamic
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500
listen = /tmp/php-fpm.sock
;listen = 127.0.0.1:9000
php_flag[display_errors] = off

网站可用/cft

server {
   listen 80;
   server_name cft.local;
   root /Users/matt/Sites/cft/www;
   access_log /Users/matt/Sites/cft/log/access.log;
   error_log /Users/matt/Sites/cft/log/error.log;
   index index.php;

   location / {
      try_files $uri $uri/ /index.php?$args;
   }

   include fastcgi_php_default.conf;
}

fastcgi_php_default.conf

fastcgi_intercept_errors on;

location ~ .php$
    {
    fastcgi_split_path_info ^(.+.php)(/.+)$;

    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  HTTPS              $https if_not_empty;

    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;

    fastcgi_param PATH_INFO         $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED   $document_root$fastcgi_path_info;

    fastcgi_read_timeout 300;

    fastcgi_pass www-upstream-pool;

    fastcgi_index index.php;
}

fastcgi_param  REDIRECT_STATUS    200;
4

4 回答 4

12

一个原因可能是 - 正如上面已经怀疑的那样 - 您的服务器运行良好,但 DNS 查找有问题。

这么长的时间通常是由try + timeout引起的,然后以其他方式重试,工作,缓存。

缓存工作请求将解释为什么您的第二个 http 请求很快。

我几乎可以肯定,这是由 DNS 查找引起的,它尝试查询无法访问的服务,在超时后放弃,然后尝试工作服务并将结果缓存几分钟。

Apple 最近对操作系统处理“.local”名称解析请求的方式进行了重大更改,这可能会对 Active Directory 身份验证和 DFS 解析产生不利影响。

在处理“.local”请求时,Mac OS 现在会发送多播 DNS (mDNS) 或广播,然后等待该请求超时,然后才能将信息正确发送到 DNS 服务器。在大多数情况下,由此引起的延迟会导致身份验证失败。

http://www.thursby.com/local-domain-login-10.7.html

他们提供将超时设置为尽可能小的值,显然仍然是 1 秒 - 并不真正令人满意。

我建议使用 localhost 或 127.0.0.1 或尝试http://test.dev作为本地域

/etc/hosts

127.0.0.1 localhost test.dev

编辑 在 OSX.local中似乎确实是为 LAN 设备保留的 tld。使用上面建议的另一个域将定义。解决这个问题

http://support.apple.com/kb/HT3473

编辑 2 找到这篇很棒的文章,它准确地描述了您的问题以及如何解决它

http://www.dmitry-dulepov.com/2012/07/os-x-lion-and-local-dns-issues.html?m=1

于 2013-01-13T14:07:49.380 回答
3

我在您的配置中看不到任何会导致此行为的内容。由于 Nginx 的配置看起来不错,并且这会影响静态和 CGI​​ 请求,我怀疑这是系统问题。

一个可能值得调查的问题是问题是否是由服务器上的 IPv6 协商引起的。

如果您使用环回 (127.0.0.1) 作为侦听地址,请查看/etc/hosts并确保存在以下行:

::1    localhost6.localdomain6 localhost6
::1    site.local cft.local

如果这不能解决问题,恐怕您需要查看更高级的诊断,可能在 Nginx 实例上使用strace或类似的。

于 2013-01-12T16:17:24.280 回答
0

(这开始是一个评论,但它有点长)

这里有一些非常糟糕的东西 - 但我在你的配置中没有看到任何明显的东西来解释它。我首先会在请求进行时查看 top 和 netstat,并在处理请求后检查您的日志(网络服务器和系统)。如果这仍然没有显示任何内容,那么下一站将是捕获所有网络流量 - 如此长的延迟最有可能的原因是 ident / DNS 查找失败。

于 2013-01-08T09:25:12.537 回答
0

除非有任何与配置相关的问题,否则它可能是编译问题。

我建议你从 OS X 开源包管理器 homebrew 安装 nginx。

如果您还没有自制软件(每个开发人员都应该!),您可以从这里获取它,或者只是在终端中运行它:

ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"

然后运行

brew install ngnix

并且 ngnix 将从 homebrew 存储库中部署。显然,您需要确保首先删除了旧的 nginx 副本。

我推荐这个的原因是 homebrew 为每个需要它的开源库提供了许多 OS X 特定的补丁,并且被社区大量使用和测试。我过去在 OS X 上使用过 homebrew 的 nginx,没有任何问题可言。

于 2013-01-12T17:07:11.180 回答