How to recompile Apache,PHP and IMAP with increased value of file descriptors larger than FD_SETSIZE (1024) on RedHat-like system?

Article ID: 260 
Last Review: Oct,6 2008
Author: Bezborodova Anastasiya
Last updated by: system APPLIES TO:
  • Parallels Plesk for Linux/Unix

Symptoms

RPM packages are compiled by vendors with too small (1024) number of file descriptors and it might cause the following messages to appear in /var/log/httpd/error_log:

    Segmentation fault (11)

    [warn] make_sock: problem listening on port 443, file descriptor (1068) larger than FD_SETSIZE (1024)

    Unable to open logs

    Too many open files

This is common Apache issue on the servers with many Virtual Hosts configured, see for more information http://httpd.apache.org/docs/2.0/misc/descriptors.html.

Resolution

NOTE: Since Plesk 8.2.0 up to 900 domains can be hosted on the OS vendor Apache build without  system packages recompilation described in this article if Piped Logs feature is enabled on the Plesk server,  see 2066.

NOTE: This article is for Linux operation systems that have RPM packages structure, such as RHEL, Fedora, CentOS, SUsE.
For the details on Debian system please follow this article.
For the details on FreeBSD system please follow this article.


NOTE: Plesk requires, closely depends on and uses many server applications which are not part of Plesk software actually. For example, apache web server, mysql server, php module and binaries and many others are not compiled by SWsoft and not provided by SWsoft, but standard system RPM packages from operating system vendor are used by Plesk and they are used 'as is'. This allows to upgrade and recompile such packages with the options administrator wish. This article is written to help administrators of Plesk to configure their OS and system packages that are not included into Plesk distributive to use with large amount of hosted domains.

You need to recompile related applications and libraries, such as  openssl, apache, imap, PHP etc from source RPMs with increased FD_SETSIZE value. Please follow through the steps below.

Make sure that the system allows to open enough files:
# /sbin/sysctl fs.file-max
fs.file-max = 131072

If fs.file-max is quite small (several thousands or so), it should be changed by adding the following lines to /etc/sysctl.conf:

fs.file-max = 131072

and running the shell command:
# /sbin/sysctl -w fs.file-max=131072

NOTE: if you are running Virtuozzo you have to adjust fs.file-max on the hardware node and it will be applied to all VEs.

You should have glibc-kernheaders and glibc-headers packages installed, they can be taken from operating system distributive CD or from your operating system download sites. Edit __FD_SETSIZE value in typesizes.h and  posix_types.h files that can be found with:
# find /usr/include/ -name typesizes.h
# find /usr/include/ -name posix_types.h

and set it like:

#define __FD_SETSIZE 65536

Download the following source RPMs that could be found on your operating system download sites or similar places, you may use RPM search engines such as http://rpm.pbone.net or http://rpmfind.net:

openssl-*.src.rpm
httpd-*.src.rpm
imap-*.src.rpm
php-*.src.rpm
libc-client-devel-*.src.rpm (if such RPM is installed)
curl-*.src.rpm

Recompile openssl first. For example:
# /usr/bin/rpmbuild --rebuild openssl-0.9.7a-35.src.rpm

Install compiled openssl RPM with the following command line:
# rpm -Uvh --force /usr/src/redhat/RPMS/i386/openssl-0.9.7a-35.i386.rpm

Repeat the same actions for cURL.

Recompile and install apache:
# rpmbuild --rebuild httpd-2.0.51-2.9.src.rpm
# rpm -Uvh --force /usr/src/redhat/RPMS/i386/httpd-2.0.51-2.9.i386.rpm
# rpm -Uvh --force /usr/src/redhat/RPMS/i386/httpd-devel-2.0.51-2.9.i386.rpm
# rpm -Uvh --force /usr/src/redhat/RPMS/i386/mod_ssl-2.0.51-2.9.i386.rpm

Recompile and install libc-client library which is provided by imap or libc-client-devel packages (it depends on OS) . You have to recompile one that is installed in the system, for example:
# /usr/bin/rpmbuild --rebuild imap-2002d-3.src.rpm
# rpm -Uvh --force /usr/src/redhat/RPMS/i386/imap-devel-2002d-3.i386.rpm

or
# /usr/bin/rpmbuild --rebuild libc-client-devel.src.rpm
# rpm -Uvh --force /usr/src/redhat/RPMS/i386/libc-client-devel.rpm

Recompile and install PHP, for example:
# rpmbuild --rebuild php-4.3.10-2.4.src.rpm
# rpm -Uvh --force /usr/src/redhat/RPMS/i386/php-*

Add `ulimit -n 65536` command to /etc/rc.d/init.d/httpd and /usr/sbin/apachectl apache startup scripts before other commands.

Replace /usr/sbin/suexec with Plesk one:
# cp /usr/local/psa/suexec/psa-suexec /usr/sbin/suexec
# chown root:apache /usr/sbin/suexec
# chmod 4510 /usr/sbin/suexec
# /etc/init.d/httpd restart

Since Plesk 7.5:
# cp /usr/local/psa/suexec/psa-suexec /usr/sbin/suexec
# /etc/init.d/httpd restart


Subscription for this article changesSubscription for this article changes

Please provide feedback on this article

Did this article help you solve your issue?
Yes
No
Partially
I do not know yet
 
Strongly Agree   Strongly Disagree
  9 8 7 6 5 4 3 2 1
The article is easy to understand
The article is accurate
Additional Comments:
*Please provide us with your email address in case we need to contact you.
* - required fields