Nginx+apache2 ubuntu 服务器在数百名访客的情况下崩溃

Nginx+apache2 ubuntu 服务器在数百名访客的情况下崩溃

我在 Linode 上有一个 768mb RAM 的服务器。并且我有 Wordpress 博客。在我的服务器上安装了 ubuntu、nginx 作为前端,apache2 作为后端。并且我有 APC 和 memcache 模块。有时网站会崩溃。但服务器的 CPU 使用率低于临界水平(仅最高 60-70)。然而,在网站崩溃期间,我可以看到硬盘 I/O 使用率的临界水平。我读到这可能与 mysql 的设置不正确有关。

我的nginx.conf:

worker_processes 2;
events {
    worker_connections  1024;
    # multi_accept on;
}
http {
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  12;
    tcp_nodelay        on;
    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

我的 nginx 代理.conf:

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
#client_header_buffer_size 64k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size   16k;
proxy_buffers       32   16k;
proxy_busy_buffers_size 64k;

我的 nginx 站点配置:

server {
        listen   80;
        server_name mysite.org;

        location / {
                proxy_pass  http://127.0.0.1:8080;
                include     /etc/nginx/conf.d/proxy.conf;
                root   /home/mysite/www/;
                index  index.html index.htm index.php;
        }

        location ~* ^.+\.(jpg|jpeg|cur|flv|avi|gif|png|ico|zip|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf)$ {
            root   /home/mysite/www/;
        }

        location ~* ^.+\.(htm|html|js|htc|css|tgz|gz|rar|bz2)$ {
           root   /home/mysite/www/;
           gzip_static on;
       }

我的cnf

#
# * Fine Tuning
#
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10
#
# * Query Cache Configuration
#
query_cache_limit       = 1M
query_cache_size        = 16M

硬件:

cpu (4x): Intel(R) Xeon(R) CPU L5520  @ 2.27GHz, 2260 MHz 
storage: Xen Virtual Storage 0, Xen Virtual Storage 1
memory: 768mb

Apache 会议:

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>
<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>
<IfModule mpm_event_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

Linode 统计链接:http://ridna.ua/temp/mysite_io_rate.pnghttp://ridna.ua/temp/mysite_cpu_rate.png

如何优化我的 nginx+apache2+mysql 设置以避免网站宕机?谢谢。

答案1

我遇到了这些问题,并通过对 apache 和 mysql 进行一些调整解决了它

nginx 中的“上游超时”错误

或者

信息:任务:apache2(或mysql或nginx)阻塞超过120秒。

当你的 apache 资源使用率过高且不可用时,就会发生此问题。如果 mysql 无法快速回复并延迟响应查询,apache 将增加其线程数,你的内存将被占满...BoooOOM

你的主要问题来自 MYSQL,修复它的一个简单方法是安装mysqltuner应用程序并执行建议

您还需要在第二步调整您的 apache!首先使用“top”或类似命令(在服务器流量很大的情况下),找到 apache 的最大活动线程大小(以 mb 为单位)。现在您必须通过配置 MaxClients 将剩余的可用服务器内存分配给 apache

比如如果你的 RAM 是 12,你的 mysql 占用了 5GB 的 RAM - 而你发现的最大 apache 线程大约是 70mb,那么你必须将 MaxClients 配置为大约 70~80,并将其余的 RAM 用于操作系统。配置好你的服务非常重要,这样它们就不会在流量很大的时候占满所有可用的内存!

答案2

您需要确定磁盘 I/O 的实际原因,而不是仅仅猜测。第一步是使用收集的历史数据sar(如果您尚未sysstat在机器上安装并调整它以每分钟收集数据,请立即执行此操作'''现在''')。首先查找交换;使用的卷和页面输入/输出都可能有用。

如果交换似乎不是这种情况,请仔细检查哪个块设备存在磁盘 I/O 问题。如果您有多个分区,这将有助于缩小系统的哪个部分可能导致磁盘 I/O。

如果您可以实时发现问题,运行iotop可以真正帮助您识别有问题的进程。它的缺点是,以非交互方式运行它很麻烦,因为要获取有用的数据,您真的需要每秒轮询一次,而将所有数据写入磁盘可能会导致足够的磁盘 I/O,从而使您的机器更快地陷入困境。

一旦你找出了罪魁祸首,你就需要修复它。如果 MySQL 确实是罪魁祸首,那么是的,你需要对其进行调整。我不会写一篇关于 MySQL 调整的详细文章,因为互联网(和这个网站)上已经有很多这样的文章了。可以肯定地说,是的,默认的 MySQL 参数完全是垃圾,你总是需要调整你的数据库。

关于您的设置,有几点需要注意:

  • 运行 nginx 和 Apache 是不必要的,会浪费内存,因此不会解决交换问题或一般磁盘 I/O 问题(因为可用于磁盘缓存的内存会减少)。摆脱 Apache 并运行 php-fpm(或老式 PHP FCGI)来提供动态内容。
  • Linode 的磁盘 I/O 通常很差(我们刚刚将一个大客户从 Linode 迁移出去,部分原因是可用的磁盘 I/O 太差,导致性能问题)。如果您实际上要处理相当数量的流量,您应该能够负担得起更好级别的 VPS。

相关内容