blob: 03bba74f89070c095ffc8a89fc0456afa7fea617 [file] [log] [blame]
Willy Tarreau7f332732018-12-16 22:27:15 +01001Installation instructions for HAProxy
2=====================================
3
Willy Tarreaub9b6e942023-05-31 16:23:56 +02004HAProxy 2.8 is a long-term supported version, which means that it will get
5fixes for bugs as they are discovered till around Q2 2028 and will not receive
6new features. This version is suitable for general deployment as it is expected
7to receive less frequent updates than regular stable branches which have an odd
8digit in the minor version number. New users are encouraged to use long-term
9supported versions such as the ones provided by their software vendor, Linux
10distribution, or by a trusted package maintainer. Experienced users who manage
11a fleet of load balancers are encouraged to deploy at least one node with the
12latest weekly development version to get familiar with upcoming changes and
13possibly detect unwelcome changes or bugs before the release. This is also a
14great way to get new features implemented exactly as desired.
Willy Tarreaud705b852022-12-01 15:15:24 +010015
Willy Tarreaub9b6e942023-05-31 16:23:56 +020016If for any reason you would prefer a different version than the one packaged
Willy Tarreau3b068c42021-11-23 15:48:35 +010017for your system, you want to be certain to have all the fixes or to get some
18commercial support, other choices are available at http://www.haproxy.com/.
Willy Tarreau7f332732018-12-16 22:27:15 +010019
20
21Areas covered in this document
22==============================
23
241) Quick build & install
252) Basic principles
263) Build environment
274) Dependencies
285) Advanced build options
296) How to install HAProxy
30
31
321) Quick build & install
33========================
34
35If you've already built HAProxy and are just looking for a quick reminder, here
36are a few build examples :
37
38 - recent Linux system with all options, make and install :
39 $ make clean
Willy Tarreaud254aa82019-06-14 18:40:48 +020040 $ make -j $(nproc) TARGET=linux-glibc \
Abhijeet Rastogi9b8c8ce2024-02-07 18:47:42 -080041 USE_OPENSSL=1 USE_LUA=1 USE_PCRE2=1 USE_SYSTEMD=1
Willy Tarreau7f332732018-12-16 22:27:15 +010042 $ sudo make install
43
44 - FreeBSD and OpenBSD, build with all options :
Abhijeet Rastogi9b8c8ce2024-02-07 18:47:42 -080045 $ gmake -j 4 TARGET=freebsd USE_OPENSSL=1 USE_LUA=1 USE_PCRE2=1
Willy Tarreau7f332732018-12-16 22:27:15 +010046
47 - embedded Linux, build using a cross-compiler :
Abhijeet Rastogi9b8c8ce2024-02-07 18:47:42 -080048 $ make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_PCRE2=1 \
Willy Tarreaud254aa82019-06-14 18:40:48 +020049 CC=/opt/cross/gcc730-arm/bin/gcc ADDLIB=-latomic
Willy Tarreau7f332732018-12-16 22:27:15 +010050
51 - Build with static PCRE on Solaris / UltraSPARC :
Abhijeet Rastogi9b8c8ce2024-02-07 18:47:42 -080052 $ make TARGET=solaris CPU=ultrasparc USE_STATIC_PCRE2=1
Willy Tarreau7f332732018-12-16 22:27:15 +010053
54For more advanced build options or if a command above reports an error, please
55read the following sections.
56
57
582) Basic principles
59===================
60
61HAProxy uses a single GNU Makefile which supports options on the command line,
62so that there is no need to hack a "configure" file to work on your system. The
63makefile totally supports parallel build using "make -j <jobs>" where <jobs>
64matches the number of usable processors, which on some platforms is returned by
65the "nproc" utility. The explanations below may occasionally refer to some
66options, usually in the form "name=value", which have to be passed to the
67command line. This means that the option has to be passed after the "make"
68command. For example :
69
70 $ make -j $(nproc) TARGET=generic USE_GZIP=1
71
72One required option is TARGET, it must be set to a target platform name, which
73provides a number of presets. The list of known platforms is displayed when no
74target is specified. It is not strictly required to use the exact target, you
75can use a relatively similar one and adjust specific variables by hand.
76
77Most configuration variables are in fact booleans. Some options are detected and
78enabled by default if available on the target platform. This is the case for all
79those named "USE_<feature>". These booleans are enabled by "USE_<feature>=1"
Willy Tarreau1efe6892021-04-02 15:53:34 +020080and are disabled by "USE_<feature>=" (with no value). An exhaustive list of the
81supported USE_* features is located at the top of the main Makefile. The last
82occurrence of such an option on the command line overrides any previous one.
83Example :
Willy Tarreau7f332732018-12-16 22:27:15 +010084
85 $ make TARGET=generic USE_THREAD=
86
87In case of error or missing TARGET, a help screen is displayed. It is also
88possible to display a list of all known options using "make help".
89
Willy Tarreau1efe6892021-04-02 15:53:34 +020090Some optional components which may depend on third-party libraries, are used
91with popular tools which are not necessarily standard implementations, or are
92maintained at slower pace than the core of the project, are located in the
93"addons/" directory. These ones may disappear in a future version if the
94product they depend on disappears or if their maintainers do not assign enough
95resources to maintain them any more. For this reason they are not built by
96default, but some USE_* options are usually provided for them, and their build
97is routinely tested anyway.
98
Willy Tarreau7f332732018-12-16 22:27:15 +010099
1003) Build environment
101====================
102
103HAProxy requires a working GCC or Clang toolchain and GNU make :
104
105 - GNU make >= 3.80. Note that neither Solaris nor OpenBSD's make work with
106 the GNU Makefile. If you get many syntax errors when running "make", you
107 may want to retry with "gmake" which is the name commonly used for GNU make
108 on BSD systems.
109
Willy Tarreau30985402023-05-24 22:32:46 +0200110 - GCC >= 4.2 (up to 13 tested). Older versions can be made to work with a
Willy Tarreau7f332732018-12-16 22:27:15 +0100111 few minor adaptations if really needed. Newer versions may sometimes break
112 due to compiler regressions or behaviour changes. The version shipped with
113 your operating system is very likely to work with no trouble. Clang >= 3.0
114 is also known to work as an alternative solution. Recent versions may emit
Willy Tarreau4ced4bd2020-07-07 16:17:00 +0200115 a bit more warnings that are worth reporting as they may reveal real bugs.
Willy Tarreauc22747d2020-11-05 16:56:37 +0100116 TCC (https://repo.or.cz/tinycc.git) is also usable for developers but will
117 not support threading and was found at least once to produce bad code in
118 some rare corner cases (since fixed). But it builds extremely quickly
119 (typically half a second for the whole project) and is very convenient to
120 run quick tests during API changes or code refactoring.
Willy Tarreau7f332732018-12-16 22:27:15 +0100121
122 - GNU ld (binutils package), with no particular version. Other linkers might
123 work but were not tested.
124
125On debian or Ubuntu systems and their derivatives, you may get all these tools
126at once by issuing the two following commands :
127
128 $ sudo apt-get update
129 $ sudo apt-get install build-essential
130
131On Fedora, CentOS, RHEL and derivatives, you may get the equivalent packages
132with the following command :
133
134 $ sudo yum groupinstall "Development Tools"
135
136Please refer to your operating system's documentation for other systems.
137
138It is also possible to build HAProxy for another system or platform using a
139cross-compiler but in this case you probably already have installed these
140tools.
141
Willy Tarreauc5aa0602021-05-14 08:03:00 +0200142Building HAProxy may require between 60 and 80 MB of free space in the
Willy Tarreau7f332732018-12-16 22:27:15 +0100143directory where the sources have been extracted, depending on the debugging
144options involved.
145
146
1474) Dependencies
148===============
149
150HAProxy in its basic form does not depend on anything beyond a working libc.
151However a number of options are enabled by default, or are highly recommended,
152and these options will typically involve some external components or libraries,
Ilya Shipitsin2a950d02020-03-06 13:07:38 +0500153depending on the targeted platform.
Willy Tarreau7f332732018-12-16 22:27:15 +0100154
155Optional dependencies may be split into several categories :
156
157 - memory allocation
158 - regular expressions
159 - multi-threading
160 - password encryption
161 - cryptography
162 - compression
163 - lua
164 - device detection
165 - miscellaneous
166
167
1684.1) Memory allocation
169----------------------
170By default, HAProxy uses the standard malloc() call provided by the libc. It
Willy Tarreauc3643512019-03-27 14:20:43 +0100171may also be built to use jemalloc, which is fast and thread-safe. In order to
172use it, please add "-ljemalloc" to the ADDLIB variable. You may possibly also
173need to append "-lpthread" and/or "-ldl" depending on the operating system.
Willy Tarreau7f332732018-12-16 22:27:15 +0100174
175
1764.2) Regular expressions
177------------------------
178HAProxy may make use regular expressions (regex) to match certain patterns. The
179regex engine is provided by default in the libc. On some operating systems, it
180might happen that the original regex library provided by the libc is too slow,
181too limited or even bogus. For example, on older Solaris versions up to 8, the
182default regex used not to properly extract group references, without reporting
183compilation errors. Also, some early versions of the GNU libc used to include a
184regex engine which could be slow or even crash on certain patterns.
185
186If you plan on importing a particularly heavy configuration involving a lot of
Ilya Shipitsin01881082021-08-07 14:41:56 +0500187regex, you may benefit from using some alternative regex implementations such as
Abhijeet Rastogi9b8c8ce2024-02-07 18:47:42 -0800188PCRE. HAProxy natively supports PCRE and PCRE2 (recommended), both in standard
189and JIT flavors (Just In Time). The following options are available depending on
190the library version provided on your system :
Willy Tarreau7f332732018-12-16 22:27:15 +0100191
192 - "USE_PCRE=1" : enable PCRE version 1, dynamic linking
193 - "USE_STATIC_PCRE=1" : enable PCRE version 1, static linking
194 - "USE_PCRE_JIT=1" : enable PCRE version 1 in JIT mode
195 - "USE_PCRE2=1" : enable PCRE version 2, dynamic linking
196 - "USE_STATIC_PCRE2=1" : enable PCRE version 2, static linking
197 - "USE_PCRE2_JIT=1" : enable PCRE version 2 in JIT mode
198
199Both of these libraries may be downloaded from https://www.pcre.org/.
200
201By default, the include and library paths are figured from the "pcre-config"
202and "pcre2-config" utilities. If these ones are not installed or inaccurate
203(for example when cross-compiling), it is possible to force the path to include
204files using "PCRE_INC" and "PCRE2_INC" respectively, and the path to library
205files using "PCRE_LIB" and "PCRE2_LIB" respectively. For example :
206
207 $ make TARGET=generic \
208 USE_PCRE2_JIT=1 PCRE2_INC=/opt/cross/include PCRE2_LIB=/opt/cross/lib
209
210
2114.3) Multi-threading
212--------------------
213On some systems for which positive feedback was reported, multi-threading will
214be enabled by default. When multi-threading is used, the libpthread library
215(POSIX threading) will be used. If the target system doesn't contain such a
216library, it is possible to forcefully disable multi-threading by adding
217"USE_THREAD=" on the command line.
218
219
2204.4) Password encryption
221------------------------
222Many systems provide password encryption functions used for authentication. On
223some systems these functions are part of the libc. On others, they're part of a
224separate library called "libcrypt". The default targets are pre-configured
225based on which system needs the library. It is possible to forcefully disable
226the linkage against libcrypt by adding "USE_LIBCRYPT=" on the command line, or
227to forcefully enable it using "USE_LIBCRYPT=1".
228
229
2304.5) Cryptography
231-----------------
232For SSL/TLS, it is necessary to use a cryptography library. HAProxy currently
Willy Tarreau2b4dc5c2022-05-08 10:59:00 +0200233supports the OpenSSL library, and is known to build and work with branches
William Lallemandf9c0bca2023-05-26 14:44:33 +02002341.0.0, 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0 and 3.1. It is recommended to use at
235least OpenSSL 1.1.1 to have support for all SSL keywords and configuration in
236HAProxy. OpenSSL follows a long-term support cycle similar to HAProxy's, and
237each of the branches above receives its own fixes, without forcing you to
238upgrade to another branch. There is no excuse for staying vulnerable by not
239applying a fix available for your version. There is always a small risk of
240regression when jumping from one branch to another one, especially when it's
241very new, so it's preferable to observe for a while if you use a different
242version than your system's defaults. Specifically, it has been well established
243that OpenSSL 3.0 can be 2 to 20 times slower than earlier versions on
244multiprocessor systems due to design issues that cannot be fixed without a
245major redesign, so in this case upgrading should be carefully thought about
246(please see https://github.com/openssl/openssl/issues/20286 and
Willy Tarreau30985402023-05-24 22:32:46 +0200247https://github.com/openssl/openssl/issues/17627). If a migration to 3.x is
248mandated by support reasons, at least 3.1 recovers a small fraction of this
249important loss.
Willy Tarreau7f332732018-12-16 22:27:15 +0100250
Amaury Denoyellead3683b2021-11-03 18:14:44 +0100251Three OpenSSL derivatives called LibreSSL, BoringSSL and QUICTLS are reported
252to work as well. While there are some efforts from the community to ensure they
253work well, OpenSSL remains the primary target and this means that in case of
254conflicting choices, OpenSSL support will be favored over other options. Note
255that OpenSSL is not compatible when building haproxy with QUIC support. In this
Willy Tarreau30985402023-05-24 22:32:46 +0200256case, QUICTLS is the preferred alternative. As of writing this, the QuicTLS
257project follows OpenSSL very closely and provides update simultaneously, but
258being a volunteer-driven project, its long-term future does not look certain
259enough to convince operating systems to package it, so it needs to be build
260locally. See the section about QUIC in this document.
261
262A fifth option is wolfSSL (https://github.com/wolfSSL/wolfssl). It is the only
263supported alternative stack not based on OpenSSL, yet which implements almost
264all of its API and natively supports QUIC. At the time of writing, the vast
William Lallemand44c73ce2023-05-25 17:17:29 +0200265majority of SSL features are well supported by wolfSSL though not everything is
266exposed in haproxy yet, advanced users might notice tiny differences that the
267wolfSSL and HAProxy teams are working on together to address in the wolfSSL
268code base. Features like SSL resume, crt-list and client auth might not work as
269expected. As of May 2023, wolfSSL support is considered experimental. This
270stack is not affected by OpenSSL's design issue regarding multi-processor
271systems and is viewed by the HAProxy team as the most promising mid-term
272solution for general deployments and QUIC deployments.
Willy Tarreau7f332732018-12-16 22:27:15 +0100273
274In order to enable SSL/TLS support, simply pass "USE_OPENSSL=1" on the command
275line and the default library present on your system will be used :
276
277 $ make TARGET=generic USE_OPENSSL=1
278
279If you want to use a different version from the one provided by your system
280(which is not recommended due to the risk of missing security fixes), it is
281possible to indicate the path to the SSL include files using SSL_INC, and the
282SSL library files using SSL_LIB. Example :
283
284 $ make TARGET=generic \
285 USE_OPENSSL=1 SSL_INC=/opt/ssl-1.1.1/include SSL_LIB=/opt/ssl-1.1.1/lib
286
William Lallemand44c73ce2023-05-25 17:17:29 +0200287To use HAProxy with WolfSSL, WolfSSL must be built with haproxy support, at
288least WolfSSL 5.6.0 is needed, but a development version migh be needed for
289some of the features:
290
Willy Tarreau9afc4172023-05-31 15:35:29 +0200291 $ cd ~/build/wolfssl
William Lallemand44c73ce2023-05-25 17:17:29 +0200292 $ ./configure --enable-haproxy --enable-quic --prefix=/opt/wolfssl-5.6.0/
Willy Tarreau9afc4172023-05-31 15:35:29 +0200293 $ make -j $(nproc)
294 $ make install
295
296Please also note that wolfSSL supports many platform-specific features that may
297affect performance, and that for production uses it might be a good idea to
298check them using "./configure --help". Please refer to the lib's documentation.
William Lallemand44c73ce2023-05-25 17:17:29 +0200299
Willy Tarreau9afc4172023-05-31 15:35:29 +0200300Building HAProxy with wolfSSL requires to specify the API variant on the "make"
Willy Tarreau30985402023-05-24 22:32:46 +0200301command line, for example:
302
Willy Tarreau9afc4172023-05-31 15:35:29 +0200303 $ cd ~/build/haproxy
Willy Tarreau30985402023-05-24 22:32:46 +0200304 $ make -j $(nproc) TARGET=generic USE_OPENSSL_WOLFSSL=1 USE_QUIC=1 \
305 SSL_INC=/opt/wolfssl-5.6.0/include SSL_LIB=/opt/wolfssl-5.6.0/lib
306
Willy Tarreau7f332732018-12-16 22:27:15 +0100307In order to link OpenSSL statically against HAProxy, first download OpenSSL
308from https://www.openssl.org/ then build it with the "no-shared" keyword and
309install it to a local directory, so your system is not affected :
310
311 $ export STATICLIBSSL=/tmp/staticlibssl
312 $ ./config --prefix=$STATICLIBSSL no-shared
313 $ make && make install_sw
314
315Then when building haproxy, pass that path via SSL_INC and SSL_LIB :
316
317 $ make TARGET=generic \
318 USE_OPENSSL=1 SSL_INC=$STATICLIBSSL/include SSL_LIB=$STATICLIBSSL/lib
319
320When building with OpenSSL on some systems, you may also need to enable support
321for the "libz" library, which is visible if the linker complains about function
322"deflateInit()" not being found. In this case, simply append "ADDLIB=-lz" to
323the command line.
324
325It is worth mentioning that asynchronous cryptography engines are supported on
326OpenSSL 1.1.0 and above. Such engines are used to access hardware cryptography
Willy Tarreauf985f032022-04-11 19:00:27 +0200327acceleration that might be present on your system. Due to API changes that
328appeared with OpenSSL 3.0 and cause lots of build warnings, engines are not
329enabled by default anymore in HAProxy 2.6. It is required to pass USE_ENGINE=1
330if they are desired.
Willy Tarreau7f332732018-12-16 22:27:15 +0100331
Willy Tarreau30985402023-05-24 22:32:46 +0200332If for any reason you are forced to use OpenSSL 3.x and the performance is not
333acceptable at all, you may want to try replacing the pthread locks that OpenSSL
334uses with HAProxy's much lighter locks that are able to emulate them:
335
336 $ make TARGET=generic \
337 USE_OPENSSL=1 USE_PTHREAD_EMULATION=1
338
339On large multi-processor systems, this may result in a performance increase of
34050 to 100% on OpenSSL 3.0 depending on the level of contention, but this will
341of course not recover everything. It should not be used by distro packagers as
342it is a bit less observable.
343
Willy Tarreau7f332732018-12-16 22:27:15 +0100344
3454.6) Compression
346----------------
347HAProxy can compress HTTP responses before delivering them to clients, in order
348to save network bandwidth. Two compression options are available. The first one
Willy Tarreau12840be2021-04-22 14:14:22 +0200349relies on the libslz library (http://libslz.org) that is embedded in haproxy.
350It is enabled by default as it is very fast and does not keep a copy of the
351contents in memory. It is possible to disable it, for example for very small
352systems, by passing "USE_SLZ=" to the "make" command.
353
354Please note that SLZ will benefit from some CPU-specific instructions like the
355availability of the CRC32 extension on some ARM processors. Thus it can further
Willy Tarreau40a871f2021-05-12 09:47:30 +0200356improve its performance to build with "CPU=native" on the target system, or
357"CPU=armv81" (modern systems such as Graviton2 or A55/A75 and beyond),
358"CPU=a72" (e.g. for RPi4, or AWS Graviton), "CPU=a53" (e.g. for RPi3), or
359"CPU=armv8-auto" (automatic detection with minor runtime penalty).
Willy Tarreau12840be2021-04-22 14:14:22 +0200360
361A second option involves the widely known zlib library, which is very likely
362installed on your system. In order to use zlib, simply pass "USE_ZLIB=1" to the
363"make" command line, which will also automatically disable SLZ. If the library
364is not installed in your default system's path, it is possible to specify the
365path to the include files using ZLIB_INC, and the path to the library files
366using ZLIB_LIB :
Willy Tarreau7f332732018-12-16 22:27:15 +0100367
368 $ make TARGET=generic \
369 USE_ZLIB=1 ZLIB_INC=/opt/zlib-1.2.11/include ZLIB_LIB=/opt/zlib-1.2.11/lib
370
Willy Tarreau7f332732018-12-16 22:27:15 +0100371Zlib is commonly found on most systems, otherwise updates can be retrieved from
372http://www.zlib.net/. It is easy and fast to build, and new versions sometimes
Willy Tarreau12840be2021-04-22 14:14:22 +0200373provide better performance so it might be worth using an up-to-date one.
Willy Tarreau7f332732018-12-16 22:27:15 +0100374
Willy Tarreau12840be2021-04-22 14:14:22 +0200375Zlib compresses a bit better than libslz but at the expense of more CPU usage
376(about 3.5 times more minimum), and a huge memory usage (~260 kB per compressed
377stream). The only valid reason for uzing Zlib instead of SLZ here usually is to
378deal with a very limited internet bandwidth while CPU and RAM are abundant so
379that the last few percent of compression ratio are worth the invested hardware.
380
Willy Tarreau7f332732018-12-16 22:27:15 +0100381
3824.7) Lua
383--------
Ilya Shipitsin2a950d02020-03-06 13:07:38 +0500384Lua is an embedded programming language supported by HAProxy to provide more
Willy Tarreau7f332732018-12-16 22:27:15 +0100385advanced scripting capabilities. Only versions 5.3 and above are supported.
386In order to enable Lua support, please specify "USE_LUA=1" on the command line.
387Some systems provide this library under various names to avoid conflicts with
Christian Ruppert3214b442022-06-28 10:03:00 +0200388previous versions. By default, HAProxy looks for "lua5.4", "lua54", "lua5.3",
389"lua53", "lua". If your system uses a different naming, you may need to set the
390library name in the "LUA_LIB_NAME" variable.
Willy Tarreau7f332732018-12-16 22:27:15 +0100391
392If Lua is not provided on your system, it can be very simply built locally. It
393can be downloaded from https://www.lua.org/, extracted and built, for example :
394
Willy Tarreau30985402023-05-24 22:32:46 +0200395 $ cd /opt/lua-5.4.6
Willy Tarreau7f332732018-12-16 22:27:15 +0100396 $ make linux
397
398The path to the include files and library files may be set using "LUA_INC" and
399"LUA_LIB" respectively. For example :
400
401 $ make TARGET=generic \
Willy Tarreau30985402023-05-24 22:32:46 +0200402 USE_LUA=1 LUA_INC=/opt/lua-5.4.6/src LUA_LIB=/opt/lua-5.4.6/src
Willy Tarreau7f332732018-12-16 22:27:15 +0100403
404
4054.8) Device detection
406---------------------
407HAProxy supports several device detection modules relying on third party
408products. Some of them may provide free code, others free libs, others free
409evaluation licenses. Please read about their respective details in the
410following files :
411
412 doc/DeviceAtlas-device-detection.txt for DeviceAtlas
413 doc/51Degrees-device-detection.txt for 51Degrees
Willy Tarreaub3cc9f22019-04-19 16:03:32 +0200414 doc/WURFL-device-detection.txt for Scientiamobile WURFL
Willy Tarreau7f332732018-12-16 22:27:15 +0100415
416
4174.9) Miscellaneous
418------------------
419Some systems have specificities. Usually these specificities are known and/or
420detected and properly set for you. If you need to adjust the behaviour, here
421are the extra libraries that may be referenced at build time :
422
423 - USE_RT=1 build with librt, which is sometimes needed on some systems
424 when using threads. It is set by default on Linux platforms,
425 and may be disabled using "USE_RT=" if your system doesn't
Willy Tarreau4703fdd2019-06-16 19:39:44 +0200426 have one. You may have to set it as well if you face an error
427 indicating that clock_gettime() was not found.
Willy Tarreau7f332732018-12-16 22:27:15 +0100428
429 - USE_DL=1 build with libdl, which is usually needed for Lua and OpenSSL
430 on Linux. It is automatically detected and may be disabled
431 using "USE_DL=", though it should never harm.
432
433 - USE_SYSTEMD=1 enables support for the sdnotify features of systemd,
434 allowing better integration with systemd on Linux systems
435 which come with it. It is never enabled by default so there
436 is no need to disable it.
437
Willy Tarreau4ced4bd2020-07-07 16:17:00 +0200438
Willy Tarreau4703fdd2019-06-16 19:39:44 +02004394.10) Common errors
440-------------------
441Some build errors may happen depending on the options combinations or the
442selected target. When facing build errors, if you know that your system is a
443bit special or particularly old, start from TARGET=generic, it is easier to
444start from there and fix the remaining issues than trying to degrade another
445target. Common issues may include:
446
447 - clock_gettime() not found
448 => your system needs USE_RT=1
449
Willy Tarreau4703fdd2019-06-16 19:39:44 +0200450 - many __sync_<something> errors in many files
Willy Tarreau6fd04502021-06-15 16:11:33 +0200451 => your gcc is too old, build without threads.
Willy Tarreau4703fdd2019-06-16 19:39:44 +0200452
453 - many openssl errors
454 => your OpenSSL version really is too old, do not enable OpenSSL
455
Willy Tarreau30985402023-05-24 22:32:46 +0200456 - quic_conn-t.h: field 'level' has incomplete type
457 => you tried to build QUIC with the legacy OpenSSL library, which does
458 not support QUIC. Either disable QUIC with "USE_QUIC=" or use any
459 other supported compatible library.
460
Willy Tarreau4f634a22023-05-31 15:27:01 +0200461 - many "dereferencing pointer 'sa.985' does break strict-aliasing rules"
462 => these warnings happen on old compilers (typically gcc-4.4), and may
463 safely be ignored; newer ones are better on these.
464
Willy Tarreau7f332732018-12-16 22:27:15 +0100465
Amaury Denoyellead3683b2021-11-03 18:14:44 +01004664.11) QUIC
467----------
468QUIC is the new transport layer protocol and is required for HTTP/3. This
469protocol stack is currently supported as an experimental feature in haproxy on
470the frontend side. In order to enable it, use "USE_QUIC=1 USE_OPENSSL=1".
471
472Note that the OpenSSL library is not compatible with QUIC. The preferred option
473is to use QUICTLS. This is a fork of OpenSSL with a QUIC-compatible API. Its
474repository is available at https://github.com/quictls/openssl. You can use the
475following instruction to build a functional QUICTLS.
476
Ilya Shipitsin85417482022-04-10 12:09:31 +0500477 $ ./config --libdir=lib [--prefix=/opt/quictls]
Amaury Denoyellead3683b2021-11-03 18:14:44 +0100478 $ make
479 $ make install
480
481On a development environment, use SSL_INC and SSL_LIB when building haproxy to
482point to the correct cryptographic library. It may be useful to specify QUICTLS
483location via rpath for haproxy execution. Example :
484
Willy Tarreau9afc4172023-05-31 15:35:29 +0200485 $ make -j $(nproc) TARGET=generic \
Amaury Denoyellead3683b2021-11-03 18:14:44 +0100486 USE_QUIC=1 \
487 USE_OPENSSL=1 SSL_INC=/opt/quictls/include SSL_LIB=/opt/quictls/lib \
488 LDFLAGS="-Wl,-rpath,/opt/quictls/lib"
489
Willy Tarreau9afc4172023-05-31 15:35:29 +0200490Alternately, building against wolfSSL is supported as well, for example this
491way assuming that wolfSSL was installed in /opt/wolfssl-5.6.0 as shown in 4.5:
492
493 $ make -j $(nproc) TARGET=generic \
494 USE_QUIC=1 \
495 USE_OPENSSL_WOLFSSL=1 \
496 SSL_INC=/opt/wolfssl-5.6.0/include SSL_LIB=/opt/wolfssl-5.6.0/lib
497 LDFLAGS="-Wl,-rpath,/opt/wolfssl-5.6.0/lib"
498
499
Willy Tarreau7f332732018-12-16 22:27:15 +01005005) How to build HAProxy
501=======================
502
503This section assumes that you have already read section 2 (basic principles)
504and section 3 (build environment). It often refers to section 4 (dependencies).
505
506To build haproxy, you have to choose your target OS amongst the following ones
507and assign it to the TARGET variable :
508
Lukas Tribuscc1eb162019-09-01 16:48:36 +0200509 - linux-glibc for Linux kernel 2.6.28 and above
510 - linux-glibc-legacy for Linux kernel 2.6.28 and above without new features
Willy Tarreau39b2fda2020-04-16 15:14:17 +0200511 - linux-musl for Linux kernel 2.6.28 and above with musl libc
Brad Smith7c503bb2020-09-30 15:46:16 -0400512 - solaris for Solaris 10 and above
Brad Smith3f1977c2020-10-02 18:36:58 -0400513 - freebsd for FreeBSD 10 and above
Brad Smith382001b2020-10-08 01:15:06 -0400514 - dragonfly for DragonFlyBSD 4.3 and above
Brad Smith0fdfe412020-10-08 16:24:52 -0400515 - netbsd for NetBSD 8 and above
Lukas Tribuscc1eb162019-09-01 16:48:36 +0200516 - osx for Mac OS/X
Brad Smith3f1977c2020-10-02 18:36:58 -0400517 - openbsd for OpenBSD 6.3 and above
Lukas Tribuscc1eb162019-09-01 16:48:36 +0200518 - aix51 for AIX 5.1
519 - aix52 for AIX 5.2
Christian Lachnerc1322302020-02-10 10:29:13 +0100520 - aix72-gcc for AIX 7.2 (using gcc)
Lukas Tribuscc1eb162019-09-01 16:48:36 +0200521 - cygwin for Cygwin
522 - haiku for Haiku
523 - generic for any other OS or version.
524 - custom to manually adjust every setting
Willy Tarreau7f332732018-12-16 22:27:15 +0100525
526You may also choose your CPU to benefit from some optimizations. This is
527particularly important on UltraSparc machines. For this, you can assign
528one of the following choices to the CPU variable :
529
530 - i686 for intel PentiumPro, Pentium 2 and above, AMD Athlon (32 bits)
531 - i586 for intel Pentium, AMD K6, VIA C3.
532 - ultrasparc : Sun UltraSparc I/II/III/IV processor
Christian Lachnerc1322302020-02-10 10:29:13 +0100533 - power8 : IBM POWER8 processor
534 - power9 : IBM POWER9 processor
Willy Tarreau40a871f2021-05-12 09:47:30 +0200535 - armv81 : modern ARM cores (Cortex A55/A75/A76/A78/X1, Neoverse, Graviton2)
536 - a72 : ARM Cortex-A72 or A73 (e.g. RPi4, Odroid N2, AWS Graviton)
537 - a53 : ARM Cortex-A53 or any of its successors in 64-bit mode (e.g. RPi3)
538 - armv8-auto : support both older and newer armv8 cores with a minor penalty,
539 thanks to gcc 10's outline atomics (default with gcc 10.2).
Willy Tarreau7f332732018-12-16 22:27:15 +0100540 - native : use the build machine's specific processor optimizations. Use with
541 extreme care, and never in virtualized environments (known to break).
542 - generic : any other processor or no CPU-specific optimization. (default)
543
544Alternatively, you may just set the CPU_CFLAGS value to the optimal GCC options
545for your platform. A second variable named SMALL_OPTS also supports passing a
546number of defines and compiler options usually for small systems. For better
547clarity it's recommended to pass the options which result in a smaller binary
548(like memory limits or -Os) into this variable.
549
550If you are building for a different system than the one you're building on,
551this is called "cross-compiling". HAProxy supports cross-compilation pretty
552well and tries to ease it by letting you adjust paths to all libraries (please
553read section 4 on dependencies for more details). When cross-compiling, you
554just need to pass the path to your compiler in the "CC" variable, and the path
555to the linker in the "LD" variable. Most of the time, setting the CC variable
556is enough since LD points to it by default.
557
558By default the build process runs in quiet mode and hide the details of the
559commands that are executed. This allows to more easily catch build warnings
560and see what is happening. However it is not convenient at all to observe what
561flags are passed to the compiler nor what compiler is involved. Simply append
562"V=1" to the "make" command line to switch to verbose mode and display the
563details again. It is recommended to use this option when cross-compiling to
Willy Tarreau2fefab62023-05-07 07:10:55 +0200564verify that the paths are correct and that /usr/include is never involved.
Willy Tarreau7f332732018-12-16 22:27:15 +0100565
566You may want to build specific target binaries which do not match your native
567compiler's target. This is particularly true on 64-bit systems when you want
568to build a 32-bit binary. Use the ARCH variable for this purpose. Right now
569it only knows about a few x86 variants (i386,i486,i586,i686,x86_64), two
570generic ones (32,64) and sets -m32/-m64 as well as -march=<arch> accordingly.
571This variable is only used to set ARCH_FLAGS to preset values, so if you know
572the arch-specific flags that your system needs, you may prefer to set
573ARCH_FLAGS instead. Note that these flags are passed both to the compiler and
574to the linker. For example, in order to build a 32-bit binary on an x86_64
575Linux system with SSL support without support for compression but when OpenSSL
576requires ZLIB anyway :
577
Willy Tarreaud254aa82019-06-14 18:40:48 +0200578 $ make TARGET=linux-glibc ARCH=i386 USE_OPENSSL=1 ADDLIB=-lz
Willy Tarreau7f332732018-12-16 22:27:15 +0100579
580Recent systems can resolve IPv6 host names using getaddrinfo(). This primitive
581is not present in all libcs and does not work in all of them either. Support in
582glibc was broken before 2.3. Some embedded libs may not properly work either,
583thus, support is disabled by default, meaning that some host names which only
584resolve as IPv6 addresses will not resolve and configs might emit an error
585during parsing. If you know that your OS libc has reliable support for
586getaddrinfo(), you can add USE_GETADDRINFO=1 on the make command line to enable
587it. This is the recommended option for most Linux distro packagers since it's
588working fine on all recent mainstream distros. It is automatically enabled on
589Solaris 8 and above, as it's known to work.
590
591If your system supports PCRE (Perl Compatible Regular Expressions), then you
592really should build with libpcre which is between 2 and 10 times faster than
593other libc implementations. Regex are used for header processing (deletion,
594rewriting, allow, deny). Please see section 4 about dependencies to figure
595how to build with PCRE support.
596
597It is possible to add native support for SSL, by passing "USE_OPENSSL=1" on the
598make command line. The libssl and libcrypto will automatically be linked with
599HAProxy. Some systems also require libz, so if the build fails due to missing
600symbols such as deflateInit(), then try again with "ADDLIB=-lz". Please check
601section 4 about dependencies for more information on how to build with OpenSSL.
602
603HAProxy can compress HTTP responses to save bandwidth. Please see section 4
604about dependencies to see the available libraries and associated options.
605
Willy Tarreaue97b04b2022-03-01 07:40:24 +0100606By default, the DEBUG_CFLAGS variable is set to '-g' to enable debug symbols.
607It is not wise to disable it on uncommon systems, because it's often the only
608way to get a usable core when you need one. Otherwise, you can set DEBUG to
609'-s' to strip the binary.
Willy Tarreau7f332732018-12-16 22:27:15 +0100610
611If the ERR variable is set to any non-empty value, then -Werror will be added
612to the compiler so that any build warning will trigger an error. This is the
613recommended way to build when developing, and it is expected that contributed
614patches were tested with ERR=1.
615
Willy Tarreau0dd8dd62022-03-01 08:31:50 +0100616The DEBUG variable is used to extend the CFLAGS and is preset to a list of
617build-time options that are known for providing significant reliability
618improvements and a barely perceptible performance cost. Unless instructed to do
619so by some project developers, or trying to save the last ounce of performance,
620these options should not be changed. Among the usable ones are:
621 - -DDEBUG_STRICT: enable some runtime assertions at key places in the code.
622 The goal is to emit a warning or stop the program if certain expected
623 conditions are not met, and whose violation will result in a misbehaving
624 process due to memory corruption or other significant trouble, possibly
625 caused by an attempt to exploit a bug in the program or a library it relies
626 on. The option knows 3 values: 0 (disable all such assertions, the default
627 when the option is not set), 1 (enable all inexpensive assertions), and
628 2 (enable all assertions even in fast paths). Setting the option with no
629 value corresponds to 1, which is the recommended value for production.
630
631 - -DDEBUG_STRICT_ACTION: indicates how to react to a check violation. There
632 are 3 types of checks: BUG (condition that is known to have serious
633 consequences), WARN (warning about a highly suspicious condition which the
634 process may recover from, but whose unknown cause may also have serious
635 consequences), CHECK (verification whether a condition that developers now
636 consider impossible still happens). The variable takes a value from 0 to 3,
637 that adjusts the behavior on these 3 violations:
638
639 BUG WARN CHECK
640 0 warn warn warn
641 1 stop warn warn
642 2 stop stop warn
643 3 stop stop stop
644
645 The default value is 1, which is the best balance for production in that it
646 will do its best to prevent a known bogus process from running away, but
647 will let it run if it believes it can recover. Users running the process in
648 sensitive environments (finance etc) may prefer to run at level 2 to make
649 sure to stop any detected anomaly before it may have an impact. Level 3
650 should only be used at the request of developers. In any case, any emitted
651 warning should be reported to developers.
652
653 - -DDEBUG_MEMORY_POOLS: this enables by default extra controls around memory
654 allocation that will help detect coding errors such as double-frees and
655 freeing a bad memory location. It will also detect earlier risks of memory
656 overflows, which may have security implications. The cost is extremely low
657 (less than 1% increase in memory footprint). This is equivalent to adding
658 "-dMtag" on the command line. This option is enabled in the default build
659 options.
660
661 - -DDEBUG_DONT_SHARE_POOLS: this will keep separate pools for same-sized
662 objects of different types. Using this increases the memory usage a little
663 bit but further reduces the risk of memory management related bugs and will
664 lead to more accurate traces in case of error. It is equivalent to adding
665 "-dMno-merge" on the command line. It is not enabled in the default build
666 options.
667
668 - -DDEBUG_POOL_INTEGRITY: this will enable runtime detection and stopping of
669 a class of bugs known as "use after free", which consists in modifying a
670 memory area after freeing it while it was reused for something else. This
671 option is quite powerful but such bugs are fortunately extremely rare, and
672 it will cause a measurable performance degradation (a few percent). This is
673 equivalent to adding "-dMcold-first,integrity" on the command line. This
674 option is not enabled by default but users running development versions on
675 moderate performance sites in order to participate to reliability testing
676 are encouraged to use it, in combination with -DDEBUG_DONT_SHARE_POOLS and
677 -DDEBUG_MEMORY_POOLS, as this could catch dangerous regressions.
678
679As such, for regular production, "-DDEBUG_STRICT -DDEBUG_MEMORY_POOLS" is
680recommended. For security sensitive environments, it is recommended to use
681"-DDEBUG_STRICT -DDEBUG_STRICT_ACTION=2 -DDEBUG_MEMORY_POOLS \
682-DDEBUG_DONT_SHARE_POOLS". For deployments dedicated to testing new versions or
683when trying to nail a bug down, use "-DDEBUG_STRICT=2 -DDEBUG_STRICT_ACTION=2 \
684-DDEBUG_MEMORY_POOLS -DDEBUG_DONT_SHARE_POOLS -DDEBUG_POOL_INTEGRITY".
685
Willy Tarreau09bdb112022-03-01 07:45:18 +0100686The DEP variable is automatically set to the list of include files and also
687designates a file that contains the last build options used. It is used during
688the build process to compute dependencies and decide whether or not to rebuild
689everything (we do rebuild everything when .h files are touched or when build
690options change). Sometimes when performing fast build iterations on inline
691functions it may be desirable to avoid a full rebuild. Forcing this variable
692to be empty will be sufficient to achieve this. This variable must never be
693forced to produce final binaries, and must not be used during bisect sessions,
694as it will often lead to the wrong commit.
695
Willy Tarreau7f332732018-12-16 22:27:15 +0100696If you need to pass other defines, includes, libraries, etc... then please
697check the Makefile to see which ones will be available in your case, and
698use/override the USE_* variables from the Makefile.
699
700AIX 5.3 is known to work with the generic target. However, for the binary to
701also run on 5.2 or earlier, you need to build with DEFINE="-D_MSGQSUPPORT",
702otherwise __fd_select() will be used while not being present in the libc, but
703this is easily addressed using the "aix52" target. If you get build errors
704because of strange symbols or section mismatches, simply remove -g from
705DEBUG_CFLAGS.
706
Christian Lachnerc1322302020-02-10 10:29:13 +0100707Building on AIX 7.2 works fine using the "aix72-gcc" TARGET. It adds two
Thayne McCombscdbcca92021-01-07 21:24:41 -0700708special CFLAGS to prevent the loading of AIX's xmem.h and var.h. This is done
Christian Lachnerc1322302020-02-10 10:29:13 +0100709by defining the corresponding include-guards _H_XMEM and _H_VAR. Without
710excluding those header-files the build fails because of redefinition errors.
Ilya Shipitsin2a950d02020-03-06 13:07:38 +0500711Furthermore, the atomic library is added to the LDFLAGS to allow for
Christian Lachnerc1322302020-02-10 10:29:13 +0100712multithreading via USE_THREAD.
713
Willy Tarreau7f332732018-12-16 22:27:15 +0100714You can easily define your own target with the GNU Makefile. Unknown targets
715are processed with no default option except USE_POLL=default. So you can very
Willy Tarreau12840be2021-04-22 14:14:22 +0200716well use that property to define your own set of options. USE_POLL and USE_SLZ
717can even be disabled by setting them to an empty string. For example :
Willy Tarreau7f332732018-12-16 22:27:15 +0100718
Willy Tarreau12840be2021-04-22 14:14:22 +0200719 $ gmake TARGET=tiny USE_POLL="" USE_SLZ="" TARGET_CFLAGS=-fomit-frame-pointer
Willy Tarreau7f332732018-12-16 22:27:15 +0100720
721If you need to pass some defines to the preprocessor or compiler, you may pass
722them all in the DEFINE variable. Example:
723
724 $ make TARGET=generic DEFINE="-DDEBUG_DONT_SHARE_POOLS -DDEBUG_MEMORY_POOLS"
725
726The ADDINC variable may be used to add some extra include paths; this is
727sometimes needed when cross-compiling. Similarly the ADDLIB variable may be
728used to specifify extra paths to library files. Example :
729
730 $ make TARGET=generic ADDINC=-I/opt/cross/include ADDLIB=-L/opt/cross/lib64
731
732
7336) How to install HAProxy
734=========================
735
736To install haproxy, you can either copy the single resulting binary to the
737place you want, or run :
738
739 $ sudo make install
740
741If you're packaging it for another system, you can specify its root directory
742in the usual DESTDIR variable.
743
744-- end