mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-12 14:35:14 +00:00
253006deed
Released version 1.9-dev2 with the following main changes : - BUG/MINOR: buffers: Fix b_slow_realign when a buffer is realign without output - BUG/MEDIUM: threads: fix the no-thread case after the change to the sync point - BUG/MEDIUM: servers: check the queues once enabling a server - BUG/MEDIUM: queue: prevent a backup server from draining the proxy's connections - MEDIUM: mux: Remove const on the buffer in mux->snd_buf() - CLEANUP: backend: Move mux install to call it at only one place - MINOR: conn_stream: add an tx buffer to the conn_stream - MINOR: conn_stream: add cs_send() as a default snd_buf() function - MINOR: backend: Try to find the best mux for outgoing connections - MEDIUM: backend: don't rely on mux_pt_ops in connect_server() - MINOR: mux: Add info about the supported side in alpn_mux_list structure - MINOR: mux: Unlink ALPN and multiplexers to rather speak of mux protocols - MINOR: mux: Print the list of existing mux protocols during HA startup - MEDIUM: checks: use the new rendez-vous point to spread check result - MEDIUM: haproxy: don't use sync_poll_loop() anymore in the main loop - MINOR: threads: remove the previous synchronization point - MAJOR: server: make server state changes synchronous again - CLEANUP: server: remove the update list and the update lock - BUG/MINOR: threads: Remove the unexisting lock label "UPDATED_SERVERS_LOCK" - BUG/MEDIUM: stream_int: Don't check CO_FL_SOCK_RD_SH flag to trigger cs receive - MINOR: mux: Change get_mux_proto to get an ist as parameter - MINOR: mux: Improve the message with the list of existing mux protocols - MINOR: mux/frontend: Add 'proto' keyword to force the mux protocol - MINOR: mux/server: Add 'proto' keyword to force the multiplexer's protocol - MEDIUM: mux: Use the mux protocol specified on bind/server lines - BUG/MEDIUM: connection/mux: take care of serverless proxies - MINOR: queue: make sure the pendconn is released before logging - MINOR: stream: rename {srv,prx}_queue_size to *_queue_pos - MINOR: queue: store the queue index in the stream when enqueuing - MINOR: queue: replace the linked list with a tree - MEDIUM: add set-priority-class and set-priority-offset - MEDIUM: queue: adjust position based on priority-class and priority-offset - DOC: update the roadmap about priority queues - BUG/MINOR: ssl: empty connections reported as errors. - MINOR: connections: Make rcv_buf mandatory and nuke cs_recv(). - MINOR: connections: Move rxbuf from the conn_stream to the h2s. - MINOR: connections: Get rid of txbuf. - MINOR: tasks: Allow tasklet_wakeup() to wakeup a task. - MINOR: connections/mux: Add the wait reason(s) to wait_list. - MINOR: stream_interface: Don't use si_cs_send() as a task handler. - MINOR: stream_interface: Give stream_interface its own wait_list. - MINOR: mux_h2: Don't use h2_send() as a callback. - MINOR: checks: Add event_srv_chk_io(). - BUG/MEDIUM: tasks: Don't insert in the global rqueue if nbthread == 1 - BUG/MEDIUM: sessions: Don't use t->state. - BUG/MEDIUM: ssl: fix missing error loading a keytype cert from a bundle. - BUG/MEDIUM: ssl: loading dh param from certifile causes unpredictable error. - BUG/MINOR: map: fix map_regm with backref - DOC: dns: explain set server ... fqdn requires resolver - DOC: add documentation for prio_class and prio_offset sample fetches. - DOC: ssl: Use consistent naming for TLS protocols - DOC: update the layering design notes - MINOR: tasks: Don't special-case when nbthreads == 1 - MINOR: fd cache: And the thread_mask with all_threads_mask. - BUG/MEDIUM: lua: socket timeouts are not applied - BUG/MINOR: lua: fix extra 500ms added to socket timeouts - BUG/MEDIUM: server: update our local state before propagating changes - BUG/MEDIUM: cli/threads: protect all "proxy" commands against concurrent updates - DOC: server/threads: document which functions need to be called with/without locks - BUG/MEDIUM: cli/threads: protect some server commands against concurrent operations - BUG/MEDIUM: streams: Don't forget to remove the si from the wait list. - BUG/MEDIUM: tasklets: Add the thread as active when waking a tasklet. - BUG/MEDIUM: stream-int: Check if the conn_stream exist in si_cs_io_cb. - BUG/MEDIUM: H2: Activate polling after successful h2_snd_buf(). - BUG/MEDIUM: stream_interface: Call the wake callback after sending. - BUG/MAJOR: queue/threads: make pendconn_redistribute not lock the server - BUG/MEDIUM: connection: don't forget to always delete the list's head - BUG/MEDIUM: lb/threads: always properly lock LB algorithms on maintenance operations - BUG/MEDIUM: check/threads: do not involve the rendez-vous point for status updates - BUG/MINOR: chunks: do not store -1 into chunk_printf() in case of error - BUG/MEDIUM: http: don't store exp_replace() result in the trash's length - BUG/MEDIUM: http: don't store url_decode() result in the samples's length - BUG/MEDIUM: dns: don't store dns_build_query() result in the trash's length - BUG/MEDIUM: map: don't store exp_replace() result in the trash's length - BUG/MEDIUM: connection: don't store recv() result into trash.data - BUG/MEDIUM: cli/ssl: don't store base64dec() result in the trash's length - MINOR: chunk: remove impossible tests on negative chunk->data - MINOR: sample: remove impossible tests on negative smp->data.u.str.data - DOC: Fix spelling error in configuration doc - REGTEST/MINOR: Missing mandatory "ignore_unknown_macro". - REGTEST/MINOR: Add a new class of regression testing files. - BUG/MEDIUM: unix: provide a ->drain() function - MINOR: connection: make conn_sock_drain() work for all socket families - BUG/MINOR: lua: Bad HTTP client request duration. - REGEST/MINOR: Add reg testing files. - BUG/MEDIUM: mux_pt: dereference the connection with care in mux_pt_wake() - REGTEST/MINOR: Add a reg testing file forb406b87
commit. - BUG/MEDIUM: lua: reset lua transaction between http requests - MINOR: add be_conn_free sample fetch - MINOR: Add srv_conn_free sample fetch - BUG/MEDIUM: hlua: Make sure we drain the output buffer when done. - MINOR: checks: Call wake_srv_chk() when we can finally send data. - BUG/MEDIUM: stream_interface: try to call si_cs_send() earlier. - BUG/MAJOR: thread: lua: Wrong SSL context initialization. - REGTEST/MINOR: Add a reg testing file for3e60b11
. - BUG/MEDIUM: hlua: Don't call RESET_SAFE_LJMP if SET_SAFE_LJMP returns 0. - REGTEST/MINOR: lua: Add reg testing files for70d318c
. - BUG/MEDIUM: dns/server: fix incomatibility between SRV resolution and server state file - BUG/MEDIUM: ECC cert should work with TLS < v1.2 and openssl >= 1.1.1 - MINOR: tools: make date2str_log() take some consts - MINOR: thread: implement HA_ATOMIC_XADD() - BUG/MINOR: stream: use atomic increments for the request counter - BUG/MEDIUM: session: fix reporting of handshake processing time in the logs - BUG/MEDIUM: h2: fix risk of memory leak on malformated wrapped frames - BUG/MAJOR: buffer: fix incorrect check in __b_putblk() - MINOR: log: move the log code to sess_build_logline() to add extra arguments - MINOR: log: make the backend fall back to the frontend when there's no stream - MINOR: log: make sess_build_logline() not dereference a NULL stream for txn - MINOR: log: don't unconditionally pick log info from s->logs - CLEANUP: log: make the low_level lf_{ip,port,text,text_len} functions take consts - MINOR: log: keep a copy of the backend connection early in sess_build_logline() - MINOR: log: do not dereference a null stream to access captures - MINOR: log: be sure not to dereference a null stream for a target - MINOR: log: don't check the stream-int's conn_retries if the stream is NULL - MINOR: log: use NULL for the unique_id if there is no stream - MINOR: log: keep a copy of s->flags early to avoid a dereference - MINOR: log: use zero as the request counter if there is no stream - MEDIUM: log: make sess_build_logline() support being called with no stream - MINOR: log: provide a function to emit a log for a session - MEDIUM: h2: produce some logs on early errors that prevent streams from being created - BUG/MINOR: h1: fix buffer shift after realignment - MINOR: connection: make the initialization more consistent - MINOR: connection: add new function conn_get_proxy() - MINOR: connection: add new function conn_is_back() - MINOR: log: One const should be enough. - BUG/MINOR: dns: check and link servers' resolvers right after config parsing - BUG/MINOR: http/threads: atomically increment the error snapshot ID - MINOR: snapshot: restart on the event ID and not the stream ID - MINOR: snapshot: split the error snapshots into common and proto-specific parts - MEDIUM: snapshot: start to reorder the HTTP snapshot output a little bit - MEDIUM: snapshot: implement a show() callback and use it for HTTP - MINOR: proxy: add a new generic proxy_capture_error() - MINOR: http: make the HTTP error capture rely on the generic proxy code - MINOR: http: remove the pointer to the error snapshot in http_capture_bad_message() - REORG: cli: move the "show errors" handler from http to proxy - BUG/MEDIUM: snapshot: take the proxy's lock while dumping errors - MEDIUM: snapshots: dynamically allocate the snapshots - MEDIUM: snapshot: merge the captured data after the descriptor - MEDIUM: mworker: remove register/unregister signal functions - MEDIUM: mworker: use the haproxy poll loop - BUG/MINOR: mworker: no need to stop peers for each proxy - MINOR: mworker: mworker_cleanlisteners() delete the listeners - MEDIUM: mworker: block SIGCHLD until the master is ready - MEDIUM: mworker: never block SIG{TERM,INT} during reload - MEDIUM: startup: unify signal init between daemon and mworker mode - MINOR: mworker: don't deinit the poller fd when in wait mode - MEDIUM: mworker: master wait mode use its own initialization - MEDIUM: mworker: replace the master pipe by socketpairs - MINOR: mworker: keep and clean the listeners - MEDIUM: threads: close the thread-waker pipe during deinit - MEDIUM: mworker: call per_thread deinit in mworker_reload() - REORG: http: move the HTTP semantics definitions to http.h/http.c - REORG: http: move http_get_path() to http.c - REORG: http: move error codes production and processing to http.c - REORG: http: move the log encoding tables to log.c - REORG: http: move some header value processing functions to http.c - BUG/MAJOR: kqueue: Don't reset the changes number by accident. - MEDIUM: protocol: use a custom AF_MAX to help protocol parser - MEDIUM: protocol: sockpair protocol - TESTS: add a python wrapper for sockpair@ - BUG/MINOR: server: Crash when setting FQDN via CLI. - BUG/MINOR: h2: report asynchronous end of stream on closed connections - BUILD: fix build without thread - BUG/MEDIUM: tasks: Don't forget to decrement task_list_size in tasklet_free(). - MEDIUM: connections: Don't reset the polling flags in conn_fd_handler(). - MEDIUM: connections/mux: Add a recv and a send+recv wait list. - MEDIUM: connections: Get rid of the recv() method. - MINOR: h2: Let user of h2_recv() and h2_send() know xfer has been done. - MEDIUM: h2: always subscribe to receive if allowed. - MEDIUM: h2: Don't use a wake() method anymore. - MEDIUM: stream_interface: Make recv() subscribe when more data is needed. - MINOR: connections: Add a "handle" field to wait_list. - MEDIUM: mux_h2: Revamp the send path when blocking. - MEDIUM: stream_interfaces: Starts receiving from the upper layers. - MINOR: checks: Give checks their own wait_list. - MINOR: conn_streams: Remove wait_list from conn_streams. - REORG: h1: create a new h1m_state - MINOR: h1: add the restart offsets into struct h1m - MINOR: h1: remove the unused states from h1m_state - MINOR: h1: provide a distinct init() function for request and response - MINOR: h1: add a message flag to indicate that a message carries a response - MINOR: h2: make sure h1m->err_pos field is correct on chunk error - MINOR: h1: properly pre-initialize err_pos to -2 - MINOR: mux_h2: replace the req,res h1 messages with a single h1 message - MINOR: h2: pre-initialize h1m->err_pos to -1 on the output path - MEDIUM: h1: consider err_pos before deciding to accept a header name or not - MEDIUM: h1: make the parser support a pointer to a start line - MEDIUM: h1: let the caller pass the initial parser's state - MINOR: h1: make the message parser support a null <hdr> argument - MEDIUM: h1: support partial message parsing - MEDIUM: h1: remove the useless H1_MSG_BODY state - MINOR: h2: store the HTTP status into the H2S, not the H1M - MINOR: h1: remove the HTTP status from the H1M struct - MEDIUM: h1: implement the request parser as well - MINOR: h1: add H1_MF_TOLOWER to decide when to turn header names to lower case - MINOR: connection: pass the proxy when creating a connection - BUG/MEDIUM: h2: Don't forget to empty the wait lists on destroy. - BUG/MEDIUM: h2: Don't forget to set recv_wait_list to NULL in h2_detach. - BUG/MAJOR: h2: reset the parser's state on mux buffer full
329 lines
15 KiB
Plaintext
329 lines
15 KiB
Plaintext
----------------------
|
||
HAProxy how-to
|
||
----------------------
|
||
version 1.9
|
||
willy tarreau
|
||
2018/09/12
|
||
|
||
|
||
1) How to build it
|
||
------------------
|
||
|
||
This is a development version, so it is expected to break from time to time,
|
||
to add and remove features without prior notification and it should not be used
|
||
in production. If you are not used to build from sources or if you are not used
|
||
to follow updates then it is recommended that instead you use the packages provided
|
||
by your software vendor or Linux distribution. Most of them are taking this task
|
||
seriously and are doing a good job at backporting important fixes. If for any
|
||
reason you'd prefer a different version than the one packaged for your system,
|
||
you want to be certain to have all the fixes or to get some commercial support,
|
||
other choices are available at :
|
||
|
||
http://www.haproxy.com/
|
||
|
||
To build haproxy, you will need :
|
||
- GNU make. Neither Solaris nor OpenBSD's make work with the GNU Makefile.
|
||
If you get many syntax errors when running "make", you may want to retry
|
||
with "gmake" which is the name commonly used for GNU make on BSD systems.
|
||
- GCC between 2.95 and 4.8. Others may work, but not tested.
|
||
- GNU ld
|
||
|
||
Also, you might want to build with libpcre support, which will provide a very
|
||
efficient regex implementation and will also fix some badness on Solaris' one.
|
||
|
||
To build haproxy, you have to choose your target OS amongst the following ones
|
||
and assign it to the TARGET variable :
|
||
|
||
- linux22 for Linux 2.2
|
||
- linux24 for Linux 2.4 and above (default)
|
||
- linux24e for Linux 2.4 with support for a working epoll (> 0.21)
|
||
- linux26 for Linux 2.6 and above
|
||
- linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy)
|
||
- solaris for Solaris 8 or 10 (others untested)
|
||
- freebsd for FreeBSD 5 to 10 (others untested)
|
||
- netbsd for NetBSD
|
||
- osx for Mac OS/X
|
||
- openbsd for OpenBSD 5.7 and above
|
||
- aix51 for AIX 5.1
|
||
- aix52 for AIX 5.2
|
||
- cygwin for Cygwin
|
||
- haiku for Haiku
|
||
- generic for any other OS or version.
|
||
- custom to manually adjust every setting
|
||
|
||
You may also choose your CPU to benefit from some optimizations. This is
|
||
particularly important on UltraSparc machines. For this, you can assign
|
||
one of the following choices to the CPU variable :
|
||
|
||
- i686 for intel PentiumPro, Pentium 2 and above, AMD Athlon
|
||
- i586 for intel Pentium, AMD K6, VIA C3.
|
||
- ultrasparc : Sun UltraSparc I/II/III/IV processor
|
||
- native : use the build machine's specific processor optimizations. Use with
|
||
extreme care, and never in virtualized environments (known to break).
|
||
- generic : any other processor or no CPU-specific optimization. (default)
|
||
|
||
Alternatively, you may just set the CPU_CFLAGS value to the optimal GCC options
|
||
for your platform.
|
||
|
||
You may want to build specific target binaries which do not match your native
|
||
compiler's target. This is particularly true on 64-bit systems when you want
|
||
to build a 32-bit binary. Use the ARCH variable for this purpose. Right now
|
||
it only knows about a few x86 variants (i386,i486,i586,i686,x86_64), two
|
||
generic ones (32,64) and sets -m32/-m64 as well as -march=<arch> accordingly.
|
||
|
||
If your system supports PCRE (Perl Compatible Regular Expressions), then you
|
||
really should build with libpcre which is between 2 and 10 times faster than
|
||
other libc implementations. Regex are used for header processing (deletion,
|
||
rewriting, allow, deny). The only inconvenient of libpcre is that it is not
|
||
yet widely spread, so if you build for other systems, you might get into
|
||
trouble if they don't have the dynamic library. In this situation, you should
|
||
statically link libpcre into haproxy so that it will not be necessary to
|
||
install it on target systems. Available build options for PCRE are :
|
||
|
||
- USE_PCRE=1 to use libpcre, in whatever form is available on your system
|
||
(shared or static)
|
||
|
||
- USE_STATIC_PCRE=1 to use a static version of libpcre even if the dynamic
|
||
one is available. This will enhance portability.
|
||
|
||
- with no option, use your OS libc's standard regex implementation (default).
|
||
Warning! group references on Solaris seem broken. Use static-pcre whenever
|
||
possible.
|
||
|
||
If your system doesn't provide PCRE, you are encouraged to download it from
|
||
http://www.pcre.org/ and build it yourself, it's fast and easy.
|
||
|
||
Recent systems can resolve IPv6 host names using getaddrinfo(). This primitive
|
||
is not present in all libcs and does not work in all of them either. Support in
|
||
glibc was broken before 2.3. Some embedded libs may not properly work either,
|
||
thus, support is disabled by default, meaning that some host names which only
|
||
resolve as IPv6 addresses will not resolve and configs might emit an error
|
||
during parsing. If you know that your OS libc has reliable support for
|
||
getaddrinfo(), you can add USE_GETADDRINFO=1 on the make command line to enable
|
||
it. This is the recommended option for most Linux distro packagers since it's
|
||
working fine on all recent mainstream distros. It is automatically enabled on
|
||
Solaris 8 and above, as it's known to work.
|
||
|
||
It is possible to add native support for SSL using the GNU makefile, by passing
|
||
"USE_OPENSSL=1" on the make command line. The libssl and libcrypto will
|
||
automatically be linked with haproxy. Some systems also require libz, so if the
|
||
build fails due to missing symbols such as deflateInit(), then try again with
|
||
"ADDLIB=-lz".
|
||
|
||
Your are strongly encouraged to always use an up-to-date version of OpenSSL, as
|
||
found on https://www.openssl.org/ as vulnerabilities are occasionally found and
|
||
you don't want them on your systems. HAProxy is known to build correctly on all
|
||
currently supported branches (0.9.8, 1.0.0, 1.0.1, 1.0.2 and 1.1.0 at the time
|
||
of writing). Branch 1.0.2 is currently recommended for the best combination of
|
||
features and stability. Asynchronous engines require OpenSSL 1.1.0 though. It's
|
||
worth mentionning that some OpenSSL derivatives are also reported to work but
|
||
may occasionally break. Patches to fix them are welcome but please read the
|
||
CONTRIBUTING file first.
|
||
|
||
To link OpenSSL statically against haproxy, build OpenSSL with the no-shared
|
||
keyword and install it to a local directory, so your system is not affected :
|
||
|
||
$ export STATICLIBSSL=/tmp/staticlibssl
|
||
$ ./config --prefix=$STATICLIBSSL no-shared
|
||
$ make && make install_sw
|
||
|
||
When building haproxy, pass that path via SSL_INC and SSL_LIB to make and
|
||
include additional libs with ADDLIB if needed (in this case for example libdl):
|
||
|
||
$ make TARGET=linux26 USE_OPENSSL=1 SSL_INC=$STATICLIBSSL/include SSL_LIB=$STATICLIBSSL/lib ADDLIB=-ldl
|
||
|
||
It is also possible to include native support for zlib to benefit from HTTP
|
||
compression. For this, pass "USE_ZLIB=1" on the "make" command line and ensure
|
||
that zlib is present on the system. Alternatively it is possible to use libslz
|
||
for a faster, memory less, but slightly less efficient compression, by passing
|
||
"USE_SLZ=1".
|
||
|
||
Zlib is commonly found on most systems, otherwise updates can be retrieved from
|
||
http://www.zlib.net/. It is easy and fast to build. Libslz can be downloaded
|
||
from http://1wt.eu/projects/libslz/ and is even easier to build.
|
||
|
||
By default, the DEBUG variable is set to '-g' to enable debug symbols. It is
|
||
not wise to disable it on uncommon systems, because it's often the only way to
|
||
get a complete core when you need one. Otherwise, you can set DEBUG to '-s' to
|
||
strip the binary.
|
||
|
||
For example, I use this to build for Solaris 8 :
|
||
|
||
$ make TARGET=solaris CPU=ultrasparc USE_STATIC_PCRE=1
|
||
|
||
And I build it this way on OpenBSD or FreeBSD :
|
||
|
||
$ gmake TARGET=freebsd USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1
|
||
|
||
And on a classic Linux with SSL and ZLIB support (eg: Red Hat 5.x) :
|
||
|
||
$ make TARGET=linux26 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1
|
||
|
||
And on a recent Linux >= 2.6.28 with SSL and ZLIB support :
|
||
|
||
$ make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1
|
||
|
||
In order to build a 32-bit binary on an x86_64 Linux system with SSL support
|
||
without support for compression but when OpenSSL requires ZLIB anyway :
|
||
|
||
$ make TARGET=linux26 ARCH=i386 USE_OPENSSL=1 ADDLIB=-lz
|
||
|
||
The SSL stack supports session cache synchronization between all running
|
||
processes. This involves some atomic operations and synchronization operations
|
||
which come in multiple flavors depending on the system and architecture :
|
||
|
||
Atomic operations :
|
||
- internal assembler versions for x86/x86_64 architectures
|
||
|
||
- gcc builtins for other architectures. Some architectures might not
|
||
be fully supported or might require a more recent version of gcc.
|
||
If your architecture is not supported, you willy have to either use
|
||
pthread if supported, or to disable the shared cache.
|
||
|
||
- pthread (posix threads). Pthreads are very common but inter-process
|
||
support is not that common, and some older operating systems did not
|
||
report an error when enabling multi-process mode, so they used to
|
||
silently fail, possibly causing crashes. Linux's implementation is
|
||
fine. OpenBSD doesn't support them and doesn't build. FreeBSD 9 builds
|
||
and reports an error at runtime, while certain older versions might
|
||
silently fail. Pthreads are enabled using USE_PTHREAD_PSHARED=1.
|
||
|
||
Synchronization operations :
|
||
- internal spinlock : this mode is OS-independant, light but will not
|
||
scale well to many processes. However, accesses to the session cache
|
||
are rare enough that this mode could certainly always be used. This
|
||
is the default mode.
|
||
|
||
- Futexes, which are Linux-specific highly scalable light weight mutexes
|
||
implemented in user-space with some limited assistance from the kernel.
|
||
This is the default on Linux 2.6 and above and is enabled by passing
|
||
USE_FUTEX=1
|
||
|
||
- pthread (posix threads). See above.
|
||
|
||
If none of these mechanisms is supported by your platform, you may need to
|
||
build with USE_PRIVATE_CACHE=1 to totally disable SSL cache sharing. Then
|
||
it is better not to run SSL on multiple processes.
|
||
|
||
If you need to pass other defines, includes, libraries, etc... then please
|
||
check the Makefile to see which ones will be available in your case, and
|
||
use the USE_* variables in the Makefile.
|
||
|
||
AIX 5.3 is known to work with the generic target. However, for the binary to
|
||
also run on 5.2 or earlier, you need to build with DEFINE="-D_MSGQSUPPORT",
|
||
otherwise __fd_select() will be used while not being present in the libc, but
|
||
this is easily addressed using the "aix52" target. If you get build errors
|
||
because of strange symbols or section mismatches, simply remove -g from
|
||
DEBUG_CFLAGS.
|
||
|
||
You can easily define your own target with the GNU Makefile. Unknown targets
|
||
are processed with no default option except USE_POLL=default. So you can very
|
||
well use that property to define your own set of options. USE_POLL can even be
|
||
disabled by setting USE_POLL="". For example :
|
||
|
||
$ gmake TARGET=tiny USE_POLL="" TARGET_CFLAGS=-fomit-frame-pointer
|
||
|
||
|
||
1.1) Device Detection
|
||
---------------------
|
||
|
||
HAProxy supports several device detection modules relying on third party
|
||
products. Some of them may provide free code, others free libs, others free
|
||
evaluation licenses. Please read about their respective details in the
|
||
following files :
|
||
|
||
doc/DeviceAtlas-device-detection.txt for DeviceAtlas
|
||
doc/51Degrees-device-detection.txt for 51Degrees
|
||
doc/WURFL-device-detection.txt for Scientiamobile WURFL
|
||
|
||
|
||
2) How to install it
|
||
--------------------
|
||
|
||
To install haproxy, you can either copy the single resulting binary to the
|
||
place you want, or run :
|
||
|
||
$ sudo make install
|
||
|
||
If you're packaging it for another system, you can specify its root directory
|
||
in the usual DESTDIR variable.
|
||
|
||
|
||
3) How to set it up
|
||
-------------------
|
||
|
||
There is some documentation in the doc/ directory :
|
||
|
||
- intro.txt : this is an introduction to haproxy, it explains what it is
|
||
what it is not. Useful for beginners or to re-discover it when planning
|
||
for an upgrade.
|
||
|
||
- architecture.txt : this is the architecture manual. It is quite old and
|
||
does not tell about the nice new features, but it's still a good starting
|
||
point when you know what you want but don't know how to do it.
|
||
|
||
- configuration.txt : this is the configuration manual. It recalls a few
|
||
essential HTTP basic concepts, and details all the configuration file
|
||
syntax (keywords, units). It also describes the log and stats format. It
|
||
is normally always up to date. If you see that something is missing from
|
||
it, please report it as this is a bug. Please note that this file is
|
||
huge and that it's generally more convenient to review Cyril Bont<6E>'s
|
||
HTML translation online here :
|
||
|
||
http://cbonte.github.io/haproxy-dconv/configuration-1.6.html
|
||
|
||
- management.txt : it explains how to start haproxy, how to manage it at
|
||
runtime, how to manage it on multiple nodes, how to proceed with seamless
|
||
upgrades.
|
||
|
||
- gpl.txt / lgpl.txt : the copy of the licenses covering the software. See
|
||
the 'LICENSE' file at the top for more information.
|
||
|
||
- the rest is mainly for developers.
|
||
|
||
There are also a number of nice configuration examples in the "examples"
|
||
directory as well as on several sites and articles on the net which are linked
|
||
to from the haproxy web site.
|
||
|
||
|
||
4) How to report a bug
|
||
----------------------
|
||
|
||
It is possible that from time to time you'll find a bug. A bug is a case where
|
||
what you see is not what is documented. Otherwise it can be a misdesign. If you
|
||
find that something is stupidly design, please discuss it on the list (see the
|
||
"how to contribute" section below). If you feel like you're proceeding right
|
||
and haproxy doesn't obey, then first ask yourself if it is possible that nobody
|
||
before you has even encountered this issue. If it's unlikely, the you probably
|
||
have an issue in your setup. Just in case of doubt, please consult the mailing
|
||
list archives :
|
||
|
||
http://marc.info/?l=haproxy
|
||
|
||
Otherwise, please try to gather the maximum amount of information to help
|
||
reproduce the issue and send that to the mailing list :
|
||
|
||
haproxy@formilux.org
|
||
|
||
Please include your configuration and logs. You can mask your IP addresses and
|
||
passwords, we don't need them. But it's essential that you post your config if
|
||
you want people to guess what is happening.
|
||
|
||
Also, keep in mind that haproxy is designed to NEVER CRASH. If you see it die
|
||
without any reason, then it definitely is a critical bug that must be reported
|
||
and urgently fixed. It has happened a couple of times in the past, essentially
|
||
on development versions running on new architectures. If you think your setup
|
||
is fairly common, then it is possible that the issue is totally unrelated.
|
||
Anyway, if that happens, feel free to contact me directly, as I will give you
|
||
instructions on how to collect a usable core file, and will probably ask for
|
||
other captures that you'll not want to share with the list.
|
||
|
||
|
||
5) How to contribute
|
||
--------------------
|
||
|
||
Please carefully read the CONTRIBUTING file that comes with the sources. It is
|
||
mandatory.
|
||
|
||
-- end
|