在我摸不着头脑试图弄清楚为什么我的站点响应如此缓慢即使服务器资源很好之后,我终于检查了 Apache 状态并发现:
78 requests/sec - 0.7 MB/second - 8.5 kB/request
256 requests currently being processed, 0 idle workers
Run Code Online (Sandbox Code Playgroud)
看来我的 apache 连接数已经达到极限了。任何试图访问我的网站的人都会被列入“等待名单”,直到 Apache 再次免费。
看来我有两个选择。
A) 将最大连接数限制提高到 256 以上。虽然根据这篇文章这并不容易:
默认情况下,MaxClients 参数的编译硬限制为 256。然而,这可以通过重新编译 Apache 来更改。一些发行版或托管公司将此限制提高到非常高的值,例如 512 甚至 1024,以应对大负载。
B) 找到占用太多时间的脚本。这对我来说似乎更棘手,因为大多数 apache 进程只是出现然后又消失了。此外,我的网站 PHP 脚本优化得很好……而且,服务器资源也很好:
Server load 2.69 (8 CPUs)
Memory Used 25.33% (2,039,108 of 8,048,804)
Swap Used 1.32% (54,156 of 4,095,992)
Run Code Online (Sandbox Code Playgroud)
我应该选择哪个选项(如果有任何一个),我应该怎么做?
编辑
更多信息:服务器版本:Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
HTTP 会议:http : //pastebin.com/yBeLt6mP
Parital 请求示例:http …
我只想对 1 个子域而不是整个域强制执行 HSTS,这可能吗?
xxx.yyy.com -> HSTS on
zzz.yyy.com -> HSTS off
yyy.com -> HSTS off
Run Code Online (Sandbox Code Playgroud) 我希望 nginx 停止侦听端口 80。我只发现有错误的人,但没有关于故意这样做的文档。我无法禁用它,我也阅读了:
#listen 80; ## listen for ipv4; this line is default and implied
Run Code Online (Sandbox Code Playgroud)
英语不是我的母语,但我明白“隐含”意味着不需要声明,所以即使它在评论中,服务器仍然听 80。我怎样才能禁用它?谢谢你。
我正在一个新站点上设置 monit,在此问题中我将其称为 mywebsite.com。我已经设置了访问 monit 的 Web 界面页面的配置,但我无法连接到它。我有一个运行 iptables 的基本防火墙,我想我为 monit 开了一个洞,但我无法连接到 monit 的 Web 界面,我不知道为什么。
我还没有设置任何要监控的东西:我的 monit 配置如下所示:
## Start monit in the background (run as a daemon):
set daemon 120 # check services at 2-minute intervals
set httpd port 2812 and
use address mywebsite.com
allow localhost
allow admin:password
Run Code Online (Sandbox Code Playgroud)
我已经用这些规则重新启动了 monit。
我在我的 iptables 配置中为 monit 制定了一条规则,如下所示:
#monit interface
-A OUTPUT -p tcp --dport 2812 -j ACCEPT
-A INPUT -p tcp --dport 2812 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
然后我将这些规则导入到/sbin/iptables-restore. 当我这样做时,我可以看到 monit 条目 …
我目前有一个服务器,它会自动将所有 HTTP 请求重定向到等效的 HTTPS 站点。问题是有些浏览器似乎不接受 SSL 证书 (StartSSL.com) 或不支持 SNI,因此它们会收到证书警告,用户将无法继续在网站上冲浪。
是否有任何机制试图让浏览器使用 HTTPS 而不是普通的 HTTP,当它不起作用时(例如不接受证书或不支持 SNI),它会继续使用 HTTP。
目前,我将 Apache 2.4 与多个虚拟主机一起使用,这些虚拟主机都使用Redirect / https://domain.example/.
我正在amazon aws ec2微实例Ubuntu 14.04用apache 2.4.9。之所以有这个实例,只是为了在项目上线前测试和解决一些bug。目前只有少数人(<10)不定期地使用该项目(每天<20次)。在我的项目中,我使用了缩小,所以我只有很少的静态内容:比如 1 个 css 文件,可能是 3 个 js 文件。它们并不是很大,所有文件的总和低于 300Kb。
查看瀑布图,从加载我的项目,

我注意到等待阶段花费了大量时间(如果我将其删除,很可能网站的加载速度将提高 2 倍以上)。我也知道每个阶段对应什么(我什至在这里回答了高度相关的问题),我不知道我到底能做些什么来减少等待时间。在我的例子中,像 css/js/img 这样的静态资源增加了大量的等待时间,所以它与编写更高效的代码无关。
我还在这里发现了另一个高度相关的问题(这实际上是我遇到的同一个问题)并尝试通过切换来遵循建议,HostnameLookups Off但它根本没有改变任何东西。
我没有/etc/httpd/conf/httpd.conf,因此我将其添加到/etc/apache2/sites-available/000-default.conf. LogFormat我的配置中也没有类似的东西,因此我跳过了这一部分。
那么我能做些什么来减少这个时间吗?当我查看从服务器位置收集的相同图表时,我看到等待时间略有改善,但情况仍然相同。
我知道我可以迁移到更好的服务器,具有更好的 HDD/RAM/CPU,但这是显而易见的。知道apache有这么多配置参数,我想可能是有一些东西可以调优。
PS感谢 JakeGould 我调查apache2.conf并修改了它(不像000-default.conf我之前提到的那样)。我还修改KeepAliveTimeOut为 3 和MaxKeepAliveRequests20,这更适合我的网站。
因此,为了后代的缘故,我正在尝试配置我的服务器,以便即使有人尝试访问 http://domain.com:443,他们也会被正确重定向到该站点的 https 版本(https://域名.com)。
在测试诸如 http://domain.com:443 之类的内容时,它没有正确重定向到 https://domain.com,而是被一个包含以下内容的 400 Bad Request 页面击中:
错误的请求
您的浏览器发送了此服务器无法理解的请求。原因:您对启用 SSL 的服务器端口使用纯 HTTP。请改用 HTTPS 方案访问此 URL。
Apache/2.4.18 (Ubuntu) 服务器在 sub.domain.com 端口 443
我尝试在我的000-default.confin 中包含以下几行<VirtualHost *:80>:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)
但它没有用。
此问题发生在所有域、子域和服务器 IP 本身上。
可能相关,尝试对 letencrypt 进行试运行会返回以下信息:
Domain: domain.com
Type: connection
Detail: Failed to connect to 123.123.123.123:443 for TLS-SNI-01
challenge
Run Code Online (Sandbox Code Playgroud)
对于启用站点的文件夹中列出的每个域。
用户请求: https://www.example.com/test
HTTPS requests --> AWS ELB HTTPS Listener --> Apache HTTP
阿帕奇获取 http://www.example.com/test
http://www.example.com/test/由于默认情况下DirectorySlash 处于开启状态,Apache 将其重定向到。
用户以 HTTP 请求结束: http://www.example.com/test/
AWS 提供了一个 HEAD 来检测原始请求协议:%{HTTP:X-Forwarded-Proto},但是我如何告诉 Apache mod_dir DirectorySlash 使用该标头?
在这种情况下,请告知您的解决方案或解决方法。
这可能是一个非常基本的问题,所以请原谅我的无知
服务器使用哪种方法来响应它收到的请求?
我正在制作一个网络应用程序,并且有一个特定的路线返回一个大的(比如 .iso 图像)文件。因此,当用户单击下载按钮时,我让 JavaScript 请求带有{method: "GET"}.
当下载在用户机器上开始时,服务器使用哪种 HTTP 方法发送文件?
我真的很困惑:
全部。我有语法问题。我尝试过遵循其他来源,但它不起作用。
我已成功创建无条件 HTTP 到 HTTPS 重定向。访问http://www.robjvargas.com,以 HTTPS 结束。那里一切都很好。
但现在我的证书似乎需要HTTP。它使用 Let's Encrypt,因此需要每 90 天更新一次。重定向生效后,试运行会失败。关闭重定向后,试运行就会成功。
所以我尝试放入 RewriteCond 来免除证书续订流量:
# HTTP to HTTPS redirect
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{Request_URI} !^./acme-challenge/*
RewriteRule (.*) https://www.robjvargas.com$1 [R,L]
Run Code Online (Sandbox Code Playgroud)
只是它不起作用。我想我错过了一些值得我一看到就拍额头的东西,但我没有看到它。通过上面的代码,HTTP 到 HTTPS 的重定向似乎仍然是通用的。因此,显然 RewriteCond 是不正确的。URI 之前的句点可能是错误的,但我已经尝试过使用和不使用它。
我还将完整的 URI 放入 RewriteCond 中,但这也没有免除它。
快到了。我没有收到任何错误。它只是永远不会满足预期的条件。
我缺少什么?
http ×10
apache-2.4 ×4
apache-2.2 ×3
ssl ×3
https ×2
redirect ×2
amazon-elb ×1
http-headers ×1
http-method ×1
httpd.conf ×1
iptables ×1
lamp ×1
latency ×1
linux ×1
monit ×1
nginx ×1
performance ×1
php ×1
sni ×1