我在 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.png和http://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。