Building nginx with TCP_FASTOPEN enabled

Hello,

I’ve tried to use “fastopen” in the listen directive but nginx gave me
an
error that the option is unkown.

I’m using nginx 1.7.4 on Debian Wheezy 3.14.13 kernel.

I’ve compiled nginx myself.
When I run the configure command, I get:
“checking for TCP_FASTOPEN … not found”

‘cat /proc/sys/net/ipv4/tcp_fastopen’ gives me “3” - I also tried it
with
the value “2”.

Why does my system not support TCP fastopen? My kernel is recent
enough…

thank you,
Can

Posted at Nginx Forum:

Hello!

On Sat, Aug 09, 2014 at 02:19:32PM -0400, mastercan wrote:

‘cat /proc/sys/net/ipv4/tcp_fastopen’ gives me “3” - I also tried it with
the value “2”.

Why does my system not support TCP fastopen? My kernel is recent enough…

Try looking into objs/autoconf.err, it has details about configure
test failures. Most likely, the TCP_FASTOPEN constant isn’t
defined since your glibc isn’t recent enough, something like 2.18+
is needed.


Maxim D.
http://nginx.org/

Maxim D. Wrote:

Try looking into objs/autoconf.err, it has details about configure
test failures. Most likely, the TCP_FASTOPEN constant isn’t
defined since your glibc isn’t recent enough, something like 2.18+
is needed.

Yes, you’re right. glibc was the problem. I tried to build an nginx deb
package on a development machine with updated glibc libs and installed
it on
the production server.
Unfortunately I get this error when trying to start nginx:
“/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14’ not found
(required
by /usr/sbin/nginx)”

So I guess I must upgrade glibc on the production server as well…which
might break dependencies…

Posted at Nginx Forum:

Lukas T. Wrote:

Don’t upgrade libc because of this (it will mess your system up).

Just define it manually when compiling nginx by passing it to the
compiler:
-DTCP_FASTOPEN=23

Which command accepts the -D flag?
Where exactly do I set this option?

Thanks in advance

Posted at Nginx Forum:

Yes, you’re right. glibc was the problem. I tried to build an nginx deb
package on a development machine with updated glibc libs and installed it
on the production server.

Don’t upgrade libc because of this (it will mess your system up).

Just define it manually when compiling nginx by passing it to the
compiler:
-DTCP_FASTOPEN=23

Regards,

Lukas

❦ 10 août 2014 07:59 -0400, “mastercan” [email protected] :

“/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14’ not found (required
by /usr/sbin/nginx)”

So I guess I must upgrade glibc on the production server as well…which
might break dependencies…

There is nothing in this feature that needs a recent glibc except the
definition of TCP_FASTOPEN constant. On the machine where you compile,
you can just add the constant in /usr/include/linux/tcp.h and
/usr/include/netinet/tcp.h. The resulting binary will work on another
machine without this modification.

nginx should just define this symbol when not available. The remaining
of the code is already detecting at runtime if this feature is available
or not.

Localise input and output in subroutines.
- The Elements of Programming Style (Kernighan & Plauger)

Lukas T. Wrote:

Don’t upgrade libc because of this (it will mess your system up).

Just define it manually when compiling nginx by passing it to the
compiler:
-DTCP_FASTOPEN=23

Thank you! This seems to define the constant. I simply added
–with-cc-opt=“-DTCP_FASTOPEN=23”
to my configure command.

I think this will work (I’m compiling it right now…)

Posted at Nginx Forum: