Nginx + apache2的ubuntu服务器与数百名访问者坠毁

我在Linode上有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 proxy.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网站conf:

 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; } 

在my.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 conf:

 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.png和http://ridna.ua/temp/mysite_cpu_rate.png

如何优化我的nginx + apache2 + mysql设置以避免网站崩溃? 谢谢..

我有这些问题,并修正了一些调整在Apache和MySQL

nginx中的“upstream timed out”错误

要么

INFO:task:apache2(或者mysql或者nginx)被阻塞超过120秒。

当你的apache资源使用率太高而不可用时,这个问题就会发生。 如果MySQL不会回复快,并延迟对查询的答复阿帕奇将增加他的脚步和你的记忆将充满… … BoooOOM

你的主要问题是从MYSQL和解决它的一个简单的方法是安装mysqltuner应用程序,并做的build议

你将需要在第二步调整你的Apache! 首先使用“顶部”或类似的东西(在服务器上的交通繁忙),并find最大的活跃线程的Apache大小在MB。 现在你必须通过configurationMaxClients把其余的免费服务器内存到Apache

例如,如果你的内存是12,你的MySQL提取了5GB内存 – 而你的最大apache花费大约是70mb,那么你必须将你的MaxClients设置为70〜80左右,让剩下的内存用于操作系统。 它非常重要,你configuration你的服务一样好,他们没有充分的stream量所有的可用内存!

您需要确定磁盘I / O的实际原因,而不是仅仅猜测它。 第一步是使用sar收集的历史数据(如果你没有在你的机器上安装sysstat ,并调整它以便每分钟收集一次数据,现在就这样做)。 首先寻找交换; 使用的音量和页面input/输出都可能是有用的。

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

如果您能够在问题中发现问题,运行iotop可以帮助确定违规stream程。 不利的一面是,以非交互方式运行它是一种有害生物,因为要获得有用的数据,您实际上需要每秒进行一次轮询,将所有数据写入磁盘可能会导致足够的磁盘I / O,从而使您的机器更快速地进入水下。

一旦你确定谁是罪犯,你需要修复它。 如果MySQL确实是罪魁祸首,那么是的,你需要调整它。 我不打算详细介绍MySQL调优,因为互联网(和本站)已经充满了它们。 只要说,是的,默认的MySQL参数是完全废话,你总是需要调整你的数据库。

在你的设置几个一般的观点:

  • 运行nginx和Apache是​​不必要的,浪费内存,因此不会帮助交换问题或一般的磁盘I / O问题(因为将有更less的内存用于磁盘caching)。 摆脱Apache并运行php-fpm(或老派的PHP FCGI)来为您的dynamic内容提供服务。
  • Linode的磁盘I / O通常很差(我们刚刚把一个大客户从Linode迁移出来,部分是因为磁盘I / O太差,导致性能问题)。 如果你真的要做一个很好的stream量,你应该能够买得起更好的VPS。