Apache服务器访问过慢分析及解决

本文分析了一台服务器访问速度变慢的原因,通过监控负载、线程数和连接数,发现是由于访问人数过多导致。通过调整Apache配置,限制单个IP连接数和添加URL重写防止盗链,有效解决了网站访问过慢的问题。

起因:线上的一台服务器,最近总是出现 访问 很慢的情况发生,点击一个链接要2秒钟以上才能打开,按照我们对于访问人数的估计,服务器应该不至于响应这么慢,从而需要针对这个问题进行分析,来解决网站访问过慢。

分析:

1、首先,在页面访问变慢情况发生时,使用 top 命令查看了服务器的负载情况,发现负载并不高,初步估计不是程序的问题。 2、然后,查看了线程中的 httpd 的数量, ps -aux | grep httpd | wc -l 发现,线程数已经达到了 apache 设置的最大值。由此断定是网站访问人数过多造成了访问过慢。 3、为了验证,查看了连接数和当前的连接数,分别是     netstat -ant | grep $ip:80 | wc -l     netstat -ant | grep $ip:80 | grep EST | wc -l     发现果然,连接数特别多,远远超过我们的估计值。 4、刚开始的时候,对于服务器的 MPM 配置方式不是特别的熟悉,认为修改服务器配置可以解决问题。主要的配置部分包括 prefork 模式 或者 work 模式的配置,下面是一些简单的介绍。

    prefork 模式:     以 prefork 模式工作的 apache 的默认配置:     <IfModule mpm_prefork_module>         ServerLimit             2000            StartServers               5    #指定服务器启动时建立的子进程数量         MinSpareServers            5    #指定空闲子进程的最小数量         MaxSpareServers           10    #指定空闲子进程的最大数量         MaxClients               150    #指定同一时间客户端最大接入请求的数量(单个进程并发线程数),任何超过该限制的请求都将进入等候队列,一旦一个连接被释放,队列中的请求将得到服务         MaxRequestsPerChild        0    #指定每个子进程在其生存周期内允许伺服的最大请求数量,默认为10000,0表示子进程永远不结束     </IfModule>     prefork 控制进程在最初建立“StartServers”个子进程后,为了满足 MinSpareServers 设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。     MaxSpareServers 设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比 MinSpareServers小,Apache会自动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。     MaxClients是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep httpd|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。在 apache2 中通过ServerLimit指令无须重编译Apache就可以加大MaxClients。     虽然通过设置ServerLimit,我们可以把MaxClients加得很大,但是往往会适得其反,系统耗光所有内存。以一台服务器为例:内存2G,每个apache进程消耗大约0.5%(可通过ps aux来确认)的内存,也就是10M,这样,理论上这台服务器最多跑200个apache进程就会耗光系统所有内存,所以,设置MaxClients要慎重。     worker 模式:     以 worker 模式工作的 apache 的默认配置为:     <IfModule mpm_worker_module>         StartServers               2         MaxClients               150         MinSpareThreads           25         MaxSpareThreads           75         ThreadsPerChild           25         MaxRequestsPerChild        0     </IfModule>     Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,     MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。     MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。     ThreadsPerChild是worker MPM中与性能相关最密切的指令。     ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。     Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。

    服务器的apache采用的是 prefork 的工作模式,对 MaxClients 进行了相应的调整,发现服务启动后很短时间,连接数就能够达到最大。 5、后来想到需要查看用户都是访问的那些页面,将配置中的 access_log 打开,发现85%以上的访问都是直接访问的资源文件,由此判定,用户可能使用了多线程的下载工具,或者这些资源遭受了盗链。 6、找到了问题所在,进行解决也就比较好办了。想到了两个方法:     A、对单个IP进行连接的线程限制,不允许多线程连接资源。         对于IP限制,我采用了 mod_limitipconn 这个模块。这个模块的好处是比较简单,缺点是不能够针对单独的文件夹或者文件进行设置,而且不支持虚拟主机。         在 apache 中安装了这个模块后,在配置文件中添加如下几段就可以生效了:             ExtendedStatus On             < IfModule mod_limitipconn.c >                 < Location / >   # 所有虚拟主机的/目录                     MaxConnPerIP 3     # 每IP只允许3个并发连接                     NoIPLimit image/*  # 对图片不做IP限制                 < /Location >             < Location /mp3 >  # 所有主机的/mp3目录             MaxConnPerIP 1         # 每IP只允许一个连接请求                OnlyIPLimit audio/mpeg video    # 该限制只对视频和音频格式的文件                 < /Location >             < /IfModule >     B、添加URL重写,防止盗链。         防止盗链,一个重要的方法就是判断请求的 refer,但是如果使用一些浏览器发出请求的时候将 refer 去掉,或者伪装,这个办法就无能为力了。但是貌似还有更高级的方法,还是可以实现这个功能。         安装apache的 mod_rewrite 模块后,在apache配置文件中添加         RewriteEngine On         RewriteCond %{HTTP_REFERER} !^http://abc.com/.*$ [NC]         RewriteCond %{HTTP_REFERER} !^http://abc.com$ [NC]         RewriteCond %{HTTP_REFERER} !^http://www.abc.com/.*$ [NC]         RewriteCond %{HTTP_REFERER} !^http://www.abc.com$ [NC]         RewriteRule .*\.(gif|jpg|swf)$ http://www.abc.com/about/nolink.png [R,NC]         这样盗链的请求会被重定向到一个错误页面,从而减少下载带给服务器的压力。

 

 

转载地址:https://cloud.tencent.com/developer/article/1164542

<think>嗯,用户的问题是"如何在Apache服务器上配置和管理以访问动网论坛的图片",我得仔细理解这个问题。首先,用户提到的是动网论坛,这可能是一个比较老的系统,需要特定的配置来确保图片正常访问。结合用户提供的引用内容,比如引用[1]中关于Apache配置的具体步骤,以及引用[2]中关于chroot环境的问题,需要把这些点整合起来。用户引用的内容里,引用[1]详细列出了配置httpd.conf的关键步骤,比如设置文档根目录DocumentRoot为/var/www/html/bbs,权限设置Allowfromall,还有DirectoryIndex设置index.php。这些配置对于论坛的访问至关重要,尤其是图片路径通常存放在bbs目录下的子文件夹里。所以用户可能需要正确设置DocumentRoot和目录权限,确保图片可以被访问到。另外,引用[2]提到了chroot环境导致的问题,比如mysql.sock无法访问的情况。虽然用户的问题是关于图片的,但如果动网论坛的图片路径涉及到数据库存储(比如图片路径保存在数据库中),那么数据库连接问题也可能间接影响图片显示。不过用户的核心需求是图片访问,可能需要重点放在Apache的目录配置和权限上。用户没有提到具体的问题现象,比如图片无法加载是404错误还是权限问题。这时候需要分情况考虑:路径配置错误、权限不足还是URL重写问题。比如,如果论坛使用了伪静态规则,可能.htaccess中的RewriteRule影响到图片路径,这需要检查是否有覆盖图片扩展名的规则。接下来要考虑常见的配置点。首先是确认论坛的安装目录。根据引用[1]的例子,DocumentRoot设置为/var/www/html/bbs,所以图片应该在类似/var/www/html/bbs/upload的文件夹里。然后检查<Directory>的权限设置,确保AllowOverride和Requireallgranted正确设置,允许访问。同时,如果使用旧版Apache,可能需要处理Orderallow,deny和Allowfromall的配置,新版则是Requireallgranted。然后是检查图片的实际路径是否存在,权限是否正确。例如,Linux的文件权限问题可能导致Apache用户(如www-data)无法读取图片文件,需要chmod调整。可能用户需要检查文件所有权,用chown将图片目录的所有权赋予Apache用户。伪静态配置也是一个重点。动网论坛可能使用URL重写,比如隐藏文件路径。这时候需要检查.htaccess中是否有忽略图片文件的重写规则,例如排除常见的图片扩展名(jpg,png等),防止被重写规则拦截。防盗链设置也是一个常见原因。如果论坛配置了防盗链规则,引用来自其他站点的图片可能会被阻止。不过用户可能不需要处理这点,但如果在不同域名访问时出现问题,可能需要调整防盗链规则,将自身域名加入白名单。引用[3]提到IIS的兼容性问题,虽然和Apache无关,但可能暗示用户过去在IIS上遇到过类似问题。不过用户当前使用Apache,所以重点还是放在Apache的配置上。总结下来,用户的真实需求应该是解决动网论坛图片无法显示的问题,需要从路径配置、目录权限、伪静态规则、文件权限等方面入手。可能需要分步骤指导用户检查这些配置点,并给出具体的命令示例,比如如何编辑配置文件,如何修改文件权限等。同时,应该强调备份配置的重要性,避免误操作导致服务不可用。此外,考虑到用户可能不熟悉具体配置,提供关键项的检查列表会更友好,比如日志文件的位置,错误状态码的含义等。最后,针对常见问题给出相关问题的建议,帮助用户扩展了解其他可能的相关配置,比如静态资源处理或缓存策略。</think> 根据Apache配置原理和动网论坛特性,以下是访问图片的完整配置指南: --- ### **核心配置步骤** 1. **确定图片存储路径** 动网论坛的图片通常存储在`/upload`目录(例:`/var/www/html/bbs/upload`)。确认此路径: ```bash ls -l /var/www/html/bbs/upload # 验证目录存在性 ``` 2. **Apache主配置 (`httpd.conf`)** 修改关键参数(参考引用[1]): ```apache # 设置文档根目录(论坛主程序) DocumentRoot "/var/www/html/bbs" # 开放目录访问权限(引用[1]范例) <Directory "/var/www/html/bbs"> Options Indexes FollowSymLinks AllowOverride All Require all granted # Apache 2.4+语法(替代旧版Order/Allow) # 旧版兼容语法: # Order allow,deny # Allow from all </Directory> ``` 3. **图片目录特殊配置** 若图片单独存放,增加优化指令: ```apache <Directory "/var/www/html/bbs/upload"> # 禁用PHP解析,防止图片被恶意执行 php_flag engine off # 启用长缓存(减少服务器负载) <FilesMatch "\.(jpg|png|gif)$"> Header set Cache-Control "max-age=2592000, public" </FilesMatch> </Directory> ``` 4. **防盗链设置(可选)** 防止外站盗用流量: ```apache <Directory "/var/www/html/bbs/upload"> RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC] RewriteRule \.(jpg|png)$ - [F] </Directory> ``` 5. **路径检查与权限修复** ```bash chown -R apache:apache /var/www/html/bbs/upload # 所有权赋予Apache进程用户 chmod -R 755 /var/www/html/bbs/upload # 开放读执行权限 ``` 6. **重启Apache生效** ```bash systemctl restart httpd # Systemd系统 service httpd restart # SysVinit系统 ``` --- ### **常见问题排查** 1. **404图片不存在** - 检查路径大小写(Linux区分大小写) - 确认`.htaccess`是否覆盖主配置(查看是否有`RewriteRule`屏蔽图片) 2. **403禁止访问** - 运行`getenforce`检查SELinux状态,临时禁用:`setenforce 0` - 检查目录权限:`namei -l /var/www/html/bbs/upload` 3. **图片加载** - 启用`mod_expires`: ```apache ExpiresActive On ExpiresByType image/jpeg "access plus 1 month" ``` --- ### **动网论坛特殊配置** ```apache # 在论坛目录的.htaccess中添加(防盗链白名单) SetEnvIfNoCase Referer "^http://bbs\.yourdomain\.com" local_ref <FilesMatch "\.(jpg|png)$"> Order Allow,Deny Allow from env=local_ref </FilesMatch> ``` > **安全提醒**:若使用chroot环境(如引用[2]),需确保图片目录在jail内: > ```bash > ln -s /real/path/to/upload /var/chroot/apache/var/www/html/bbs/upload > ``` --- **配置文件示例路径** ```bash /etc/httpd/conf/httpd.conf # RedHat系主配置 /etc/apache2/sites-enabled/000-default.conf # Debian系虚拟主机 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值