关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

修改Apache的超时设置,解决长连接请求超时问题

发布时间:2022/11/5 13:20:19
香港云服务器

某日,组内后台开发找到我,问我们的 WEB 服务器超时设置是多少。他反馈的问题是,有一个 VLAN 切换任务 cgi 接口经常返回 504 网关超时错误,要我分析解决下。image.png

我问了一下,得知这个请求遇到网络设备对象较多的时候,需要小半个小时才能完成,也就是要用到长连接才行。

老规矩,从开发那拿到接口地址,得到接入层服务器 IP,是一台 Haproxy 代理,看了一下 Haproxy 的超时设置:

# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的 haproxy 使用 timeout connect 替代,该参数向后兼容contimeout 3600# 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本 haproxy 使用 timeout client 替代。该参数向后兼容clitimeout 3600# 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本 haproxy 使用 timeout server 替代。该参数向后兼容srvtimeout 3600

各种 1 小时超时,所以排除 Haproxy 的影响,继续往下看。

Haproxy 代理的是 2 台 Apache,也就是部署了 cgi 接口的服务器。第一时间查看了 httpd.conf 和 httpd-vhost.conf 中的配置,居然没找到超时设置。

于是,搜索了下相关教程,发现原来藏在了 httpd-default.conf 当中:

## This configuration file reflects default settings for Apache HTTP Server.## You may change these, but chances are that you may not need to.### Timeout: The number of seconds before receives and sends time out.#Timeout 300## KeepAlive: Whether or not to allow persistent connections (more than# one request per connection). Set to "Off" to deactivate.#KeepAlive On## MaxKeepAliveRequests: The maximum number of requests to allow# during a persistent connection. Set to 0 to allow an unlimited amount.# We recommend you leave this number high, for maximum performance.#MaxKeepAliveRequests 100## KeepAliveTimeout: Number of seconds to wait for the next request from the# same client on the same connection.#KeepAliveTimeout 5## UseCanonicalName: Determines how Apache constructs self-referencing # URLs and the SERVER_NAME and SERVER_PORT variables.# When set "Off", Apache will use the Hostname and Port supplied# by the client. When set "On", Apache will use the value of the# ServerName directive.#UseCanonicalName Off## AccessFileName: The name of the file to look for in each directory# for additional configuration directives. See also the AllowOverride # directive.#AccessFileName .htaccess## ServerTokens# This directive configures what you return as the Server HTTP response# Header. The default is 'Full' which sends information about the OS-Type# and compiled in modules.# Set to one of: Full | OS | Minor | Minimal | Major | Prod# where Full conveys the most information, and Prod the least.#ServerTokens Full## Optionally add a line containing the server version and virtual host# name to server-generated pages (internal error documents, FTP directory # listings, mod_status and mod_info output etc., but not CGI generated # documents or custom error documents).# Set to "EMail" to also include a mailto: link to the ServerAdmin.# Set to one of: On | Off | EMail#ServerSignature On## HostnameLookups: Log the names of clients or just their IP addresses# e.g., www.apache.org (on) or 204.62.129.132 (off).# The default is off because it'd be overall better for the net if people# had to knowingly turn this feature on, since enabling it means that# each client request will result in AT LEAST one lookup request to the# nameserver.#HostnameLookups Off

看了下,这些是 Apache 的默认配置,Apache 也没有 include 到 httpd.conf 当中。因此,编辑 httpd.conf,找到如下参数:

#Include conf/extra/httpd-default.conf

去掉注释,保存文件。然后再编辑 /usr/local/apache2/conf/extra/httpd-default.conf 文件,将 Timeout 的值修改为符合生产环境要求的 1800 秒,最后执行 Apache 平滑重启命令即可:

/usr/local/apache2/bin/apachectl -k graceful或者/usr/local/apache2/bin/httpd -k graceful

Ps:我之前一直以为只有 Nginx 有一个平滑 reload 命令,后面才知道 Apache、Haproxy 都支持平滑重启名称,这个非常棒!

重载之后,就不会出现 504 网关超时设置了。