我在〜600 MB RAM的EC2微型实例上运行apache2。 该实例运行了近一年没有问题,但在过去的几个星期,它只是不断崩溃,因为服务器到达MaxClients。
服务器基本上只运行几个网站,一个WordPress的博客(不经常使用),公司网站(最常用)和2个小型网站,这只是内部。
博客的数据库在RDS上运行,所以在这个Web服务器上没有运行Mysql。
当我来到公司时,服务器已经安装好了,正在运行apache + mod_php + prefork。 我们希望在未来将其迁移到nginx + php-fpm,但是仍然需要进一步的testing。 所以现在我必须坚持旧的设置。
我还在服务器前使用CloudFlare DDOS保护,因为它在过去几周遭到了几次攻击。
我的公司现在不想为更好的networking服务器付钱,所以我也必须坚持使用微型实例。 另外,我们运行的网站代码非常糟糕,速度很慢,有时单页面加载可能需要15秒。 整个网站是dynamic的,用PHP写的,所以caching在这里不是一个真正的select。 这是一个定制的search用户。
我已经closures了KeepAlive,这有点改善了性能。
我的preforkconfiguration如下所示:
StartServers 2 MinSpareServers 2 MaxSpareServers 5 ServerLimit 10 MaxClients 10 MaxRequestsPerChild 100
服务器在运行一段时间后变得没有反应,我运行了下面的命令来查看有多less个连接:netstat | grep http | wc -l 75
尝试重新启动apache有助于短暂的时间,但之后,apache进程(es)再次变得无法响应。
我已经启用了以下模块(输出apache2ctl -M)
加载模块: core_module(静态) log_config_module(静态) logio_module(静态) version_module(静态) mpm_prefork_module(静态) http_module(静态) so_module(静态) alias_module(共享) authz_host_module(共享) deflate_module(共享) dir_module(共享) expires_module(共享) mime_module(共享) negotiation_module(共享) php5_module(共享) rewrite_module(共享) setenvif_module(共享) ssl_module(共享) status_module(共享) 语法OK
apache2.conf
# Security ServerTokens OS ServerSignature On TraceEnable On ServerName "web.example.com" ServerRoot "/etc/apache2" PidFile ${APACHE_PID_FILE} Timeout 30 KeepAlive off User www-data Group www-data AccessFileName .htaccess <Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy all </Files> <Directory /> Options FollowSymLinks AllowOverride None </Directory> DefaultType none HostnameLookups Off ErrorLog /var/log/apache2/error.log LogLevel warn EnableSendfile On #Listen 80 Include /etc/apache2/mods-enabled/*.load Include /etc/apache2/mods-enabled/*.conf Include /etc/apache2/ports.conf LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent Include /etc/apache2/conf.d/*.conf Include /etc/apache2/sites-enabled/*.conf
主站点的Vhost
<VirtualHost *:80> ServerName www.example.com ## Vhost docroot DocumentRoot /srv/www/jenkins/Web ## Directories, there should at least be a declaration for /srv/www/jenkins/Web <Directory /srv/www/jenkins/Web> AllowOverride All Order allow,deny Allow from all </Directory> ## Load additional static includes ## Logging ErrorLog /var/log/apache2/www.example.com.error.log LogLevel warn ServerSignature Off CustomLog /var/log/apache2/www.example.com.access.log combined ## Rewrite rules RewriteEngine On RewriteCond %{HTTP_HOST} !^www.example.com$ RewriteRule ^.*$ http://www.example.com%{REQUEST_URI} [R=301,L] ## Server aliases ServerAlias www.example.invalid ServerAlias example.com ## Custom fragment <Location /srv/www/jenkins/Web/library> Order Deny,Allow Deny from all </Location> <Files ~ "^\.(.+)"> Order deny,allow deny from all </Files> </VirtualHost>
我知道你不想听到它。 我知道你的客户不想听到它。 但这是你需要听到的! 如果客户运行4个网站(生产不less),他们应该分出一些现金,以更好的服务器。
微型实例不是为生产使用而devise的(AWS自己也这么说),它们受到争用的困扰,不要期望CPU,networking或磁盘I / O中的任何优秀或可预测的东西。
如果你必须使用mirco,考虑t2而不是t1
T1 = http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts_micro_instances.html
t1.micro是上一代的实例,它已被replace为t2.micro,具有更好的性能configuration文件。 我们build议使用t2.micro实例types而不是t1.micro。 有关更多信息,请参阅T2实例。
T2 = http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/t2-instances.html
它们适用于那些不经常使用或一直使用完整的CPU,但偶尔需要破解的工作负载。 T2实例非常适合通用目的工作负载,如Web服务器,开发人员环境和小型数据库。
有时你可以通过停止EC2并重新启动来解决争用问题(CPU窃取,坏邻居症等)。 这将导致您的EC2所在的底层主机发生变化。
该实例运行了近一年没有问题,但在过去的几个星期,它只是不断崩溃,因为服务器到达MaxClients。
你为什么认为服务器已经达到MaxClients? 更多的stream量? 你可以增加这个数字,但是我怀疑微型实例不能处理太多的并发连接。
博客的数据库在RDS上运行,所以在这个Web服务器上没有运行Mysql。
我爱RDS,并build议人们使用它。 但为什么贵公司为RDS提供现金,却不愿意升级EC2实例呢? 为什么不放弃RDS并升级EC2? (在理想的世界里,我会说保持RDS并升级EC2)。
整个网站是dynamic的,用PHP写的,所以caching在这里不是一个真正的select。
你确定APC在这种情况下不会有帮助吗? 在尝试之前,可能很难确定APC可以提供多less帮助。 http://php.net/manual/en/intro.apc.php
尝试重新启动apache有助于短暂的时间,但之后,apache进程(es)再次变得无法响应。
这听起来像你(可能)获得太多的stream量?
它迟到了,但另一个解决scheme是减less你的EC2的工作量。 在这个实例前面使用一个云端分布。 如果caching策略是正确的,将减less服务器上的负载,并通过正确的caching策略AFAIK您的服务器可以扩展到数以千计的读者(而不是编辑,pipe理员等)
使用wordpress设置CDN的教程