Apache Common Problems and Solutions

Question: Why won't Apache compile with my system's cc?

Answer: If the server won't compile on your system, it is probably due to one of the following causes:

The Configure script doesn't recognize your system environment.

This might be either because it's completely unknown or because the specific environment (include files, OS version, et cetera) isn't explicitly handled. If this happens, you may need to port the server to your OS yourself.
Your system's C compiler is garbage.

Some operating systems include a default C compiler that is either not ANSI C-compliant or suffers from other deficiencies. The usual recommendation in cases like this is to acquire, install, and use gcc.
Your include files may be confused.

In some cases, we have found that a compiler installation or system upgrade has left the C header files in an inconsistent state. Make sure that your include directory tree is in sync with the compiler and the operating system.

Your operating system or compiler may be out of revision.

Software vendors (including those that develop operating systems) issue new releases for a reason; sometimes to add functionality, but more often to fix bugs that have been discovered. Try upgrading your compiler and/or your operating system.

Question: Why do I get complaints about redefinition of "struct iovec" when compiling under Linux?

Answer: This is a conflict between your C library includes and your kernel includes. You need to make sure that the versions of both are matched properly. There are two workarounds, either one will solve the problem:

Remove the definition of struct iovec from your C library includes. It is located in /usr/include/sys/uio.h. Or,
Add -DNO_WRITEV to the EXTRA_CFLAGS line in your Configuration and reconfigure/rebuild. This hurts performance and should only be used as a last resort.

Question: I'm using gcc and I get some compilation errors, what is wrong?

Answer: GCC parses your system header files and produces a modified subset which it uses for compiling. This behaviour ties GCC tightly to the version of your operating system. So, for example, if you were running IRIX 5.3 when you built GCC and then upgrade to IRIX 6.2 later, you will have to rebuild GCC. Similarly for Solaris 2.4, 2.5, or 2.5.1 when you upgrade to 2.6. Sometimes you can type "gcc -v" and it will tell you the version of the operating system it was built against.

If you fail to do this, then it is very likely that Apache will fail to build. One of the most common errors is with readv, writev, or uio.h. This is not a bug with Apache. You will need to re-install GCC.

Question: Why do I get "setgid: Invalid argument" at startup?

Answer: Your Group directive (probably in conf/httpd.conf) needs to name a group that actually exists in the /etc/group file (or your system's equivalent). This problem is also frequently seen when a negative number is used in the Group directive (e.g., "Group #-1"). Using a group name -- not group number -- found in your system's group database should solve this problem in all cases.

Question: Why am I getting "httpd: could not set socket option TCP_NODELAY" in my error log?

Answer: This message almost always indicates that the client disconnected before Apache reached the point of calling setsockopt() for the connection. It shouldn't occur for more than about 1% of the requests your server handles, and it's advisory only in any case.

Question: Why am I getting "connection reset by peer" in my error log?

Answer: This is a normal message and nothing about which to be alarmed. It simply means that the client canceled the connection before it had been completely set up - such as by the end-user pressing the "Stop" button. People's patience being what it is, sites with response-time problems or slow network links may experiences this more than high-capacity ones or those with large pipes to the network.

Question: The errorlog says Apache dumped core, but where's the dump file?

Answer: In Apache version 1.2, the error log message about dumped core includes the directory where the dump file should be located. However, many Unixes do not allow a process that has called setuid() to dump core for security reasons; the typical Apache setup has the server started as root to bind to port 80, after which it changes UIDs to a non-privileged user to serve requests.

Dealing with this is extremely operating system-specific, and may require rebuilding your system kernel. Consult your operating system documentation or vendor for more information about whether your system does this and how to bypass it. If there is a documented way of bypassing it, it is recommended that you bypass it only for the httpd server process if possible.

The canonical location for Apache's core-dump files is the ServerRoot directory. As of Apache version 1.3, the location can be set via the CoreDumpDirectory directive to a different directory. Make sure that this directory is writable by the user the server runs as (as opposed to the user the server is started as).

Question: When I run it under Linux I get "shmget: function not found", what should I do?

Answer: Your kernel has been built without SysV IPC support. You will have to rebuild the kernel with that support enabled (it's under the "General Setup" submenu)

Question: Server hangs, or fails to start, and/or error log fills with "fcntl: F_SETLKW: No record locks available" or similar messages

Answer: These are symptoms of a fine locking problem, which usually means that the server is trying to use a synchronization file on an NFS filesystem.

Because of its parallel-operation model, the Apache Web server needs to provide some form of synchronization when accessing certain resources. One of these synchronization methods involves taking out locks on a file, which means that the filesystem whereon the lockfile resides must support locking. In many cases this means it can't be kept on an NFS-mounted filesystem.

To cause the Web server to work around the NFS locking limitations, include a line such as the following in your server configuration files:

LockFile /var/run/apache-lock

The directory should not be generally writable (e.g., don't use /var/tmp).

How do I prevent Web access to a newly created domain, not yet resolving in the nameservers, from showing a listing of the directories of all domains on my server?

Place an index file in the DocumentRoot, /www/htdocs, of your server.

Does Apache on my server support Server Side Includes?

Yes. If you are having difficulty getting Server Side Includes (SSI's) to work, add the following directives to /www/htdocs/.htaccess, creating that file if it does not exist:

Options +Indexes +Includes +ExecCGI
AddType application/x-httpd-cgi .cgi .pl