File: haproxy-fr.txt

package info (click to toggle)
haproxy 1.4.8-1%2Bsqueeze1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 5,220 kB
  • ctags: 4,072
  • sloc: ansic: 34,590; perl: 543; sh: 415; makefile: 377; xml: 124
file content (2891 lines) | stat: -rw-r--r-- 132,432 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
                           -------------------
                                 HAProxy
                           Manuel de rfrence
                           -------------------
                              version 1.3.2
                              willy tarreau
                                2006/09/03


 !!!!  NOTE: CE DOCUMENT EST PERIME  !!!!

 Veuillez utiliser le fichier "configuration.txt" situ dans le mme
 rpertoire, ou tlcharger une version  jour  l'emplacement ci-dessous :

        http://haproxy.1wt.eu/download/1.4/doc/configuration.txt


================
| Introduction |
================

HAProxy est un relais TCP/HTTP offrant des facilits d'intgration en
environnement hautement disponible. En effet, il est capable de :
  - effectuer un aiguillage statique dfini par des cookies ;
  - effectuer une rpartition de charge avec cration de cookies pour assurer
    la persistence de session ; 
  - fournir une visibilit externe de son tat de sant ;
  - s'arrter en douceur sans perte brutale de service ;
  - modifier/ajouter/supprimer des en-ttes dans la requte et la rponse ;
  - interdire des requtes qui vrifient certaines conditions ;
  - utiliser des serveurs de secours lorsque les serveurs principaux sont hors
    d'usage.
  - maintenir des clients sur le bon serveur serveur d'application en fonction
    de cookies applicatifs.
  - fournir des rapports d'tat en HTML  des utilisateurs authentifis, 
    travers des URI de l'application interceptes.

Il requiert peu de ressources, et son architecture vnementielle mono-
processus lui permet facilement de grer plusieurs milliers de connexions
simultanes sur plusieurs relais sans effondrer le systme.


===========================
| Paramtres de lancement |
===========================

Les options de lancement sont peu nombreuses :

    -f <fichier de configuration>
    -n <nombre maximal total de connexions simultanes>
       = 'maxconn' dans la section 'global'
    -N <nombre maximal de connexions simultanes par instance>
       = 'maxconn' dans les sections 'listen' ou 'default'
    -d active le mode debug
    -D passe en daemon
    -q dsactive l'affichage de messages sur la sortie standard.
    -V affiche les messages sur la sortie standard, mme si -q ou 'quiet' sont
       spcifis.
    -c vrifie le fichier de configuration puis quitte avec un code de retour 0
       si aucune erreur n'a t trouve, ou 1 si une erreur de syntaxe a t
       dtecte.
    -p <fichier> indique au processus pre qu'il doit crire les PIDs de ses
       fils dans ce fichier en mode dmon.
    -sf specifie une liste de PIDs auxquels envoyer un signal FINISH
    -st specifie une liste de PIDs auxquels envoyer un signal TERMINATE
    -s affiche les statistiques (si option compile)
    -l ajoute des informations aux statistiques
    -dk dsactive l'utilisation de kqueue()
    -ds dsactive l'utilisation de epoll() speculatif
    -de dsactive l'utilisation de epoll()
    -dp dsactive l'utilisation de poll()
    -db dsactive la mise en arrire-plan (utile pour dbugger)
    -m <megs> applique une limitation de <megs> Mo d'utilisation mmoire

Le nombre maximal de connexion simultanes par proxy est le paramtre par
dfaut pour les proxies pour lesquels ce paramtre n'est pas prcis dans le
fichier de configuration. Il s'agit du paramtre 'maxconn' dans les sections
'listen'.

Le nombre maximal total de connexions simultanes limite le nombre de
connexions TCP utilisables  un instant donn par le processus, tous proxies
confondus. Ce paramtre remplace le paramtre 'maxconn' de la section 'global'.

Le mode debug correspond  l'option 'debug' de la section 'global'. Dans ce
mode, toutes les connexions, dconnexions, et tous les changes d'en-ttes HTTP
sont affichs.

Pour debugger, l'option '-db' est trs pratique car elle dsactive
temporairement le mode daemon et le mode multi-processus. Le service peut alors
tre arrt par un simple appui sur Ctrl-C, sans avoir  modifier la
configuration ni  activer le mode debug complet.

Les statistiques ne sont disponibles que si le programme a t compil avec
l'option "STATTIME". Il s'agit principalement de donnes brutes n'ayant
d'utilit que lors de benchmarks par exemple, et sont amenes  disparaitre.

Les paramtres '-st' et '-sf' sont utiliss pour la reconfiguration  chaud.
Voir la section  ce sujet.

============================
| Fichier de configuration |
============================

Structure
=========

L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
pas prcd d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.

Le fichier de configuration est dcoup en sections rpres par des mots cls
tels que :

  - 'global'
  - 'listen'
  - 'defaults'

Tous les paramtres font rfrence  la section dfinie par le dernier mot cl
reconnu.


1) Paramtres globaux
=====================

Il s'agit des paramtres agissant sur le processus, ou bien sur l'ensemble des
proxies. Ils sont tous spcifis dans la section 'global'. Les paramtres
supports sont :

  - log <adresse> <catgorie> [niveau_max]
  - maxconn <nombre>
  - uid <identifiant>
  - gid <identifiant>
  - user <nom d'utilisateur>
  - group <nom de groupe>
  - chroot <rpertoire>
  - nbproc <nombre>
  - daemon
  - debug
  - nokqueue
  - nosepoll
  - noepoll
  - nopoll
  - quiet
  - pidfile <fichier>
  - ulimit-n <nombre>
  - tune.maxpollevents <nombre>


1.1) Journalisation des vnements
----------------------------------
La plupart des vnements sont journaliss : dmarrages, arrts, disparition et
apparition de serveurs, connexions, erreurs. Tous les messages sont envoys en
syslog vers un ou deux serveurs. La syntaxe est la suivante :

    log <adresse_ip> <catgorie> [niveau_max]

Les connexions sont envoyes en niveau "info". Les dmarrages de service et de
serveurs seront envoys en "notice", les signaux d'arrts en "warning" et les
arrts dfinitifs de services et de serveurs en "alert". Ceci est valable aussi
bien pour les proxies que pour les serveurs tests par les proxies. Le
paramtre optionnel <niveau_max> dfinit le niveau maximal de traces mises
parmi les 8 valeurs suivantes  :
    emerg, alert, crit, err, warning, notice, info, debug

Par compatibilit avec les versions 1.1.16 et antrieures, la valeur par dfaut
est "debug" si l'option n'est pas prcise.

Les catgories possibles sont :
    kern, user, mail, daemon, auth, syslog, lpr, news,
    uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
    local0, local1, local2, local3, local4, local5, local6, local7

Conformment  la RFC3164, les messages mis sont limits  1024 caractres.

Exemple :
---------
    global
        log 192.168.2.200 local3
        log 127.0.0.1     local4 notice

1.2) limitation du nombre de connexions
---------------------------------------
Il est possible et conseill de limiter le nombre global de connexions par
processus  l'aide du mot cl global 'maxconn'. Les connexions sont comprises
au sens 'acceptation de connexion', donc il faut s'attendre en rgle gnral 
avoir un peu plus du double de sessions TCP que le maximum de connexions fix.
C'est important pour fixer le paramtre 'ulimit -n' avant de lancer le proxy.
Pour comptabiliser le nombre de sockets ncessaires, il faut prendre en compte
ces paramtres :

  - 1 socket par connexion entrante
  - 1 socket par connexion sortante
  - 1 socket par couple adresse/port d'coute par proxy
  - 1 socket pour chaque serveur en cours de health-check
  - 1 socket pour les logs (tous serveurs confondus)

Dans le cas o chaque proxy n'coute que sur un couple adresse/port,
positionner la limite du nombre de descripteurs de fichiers (ulimit -n)  
(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
il est possible de spcifier cette limite dans la configuration  l'aide du
mot-cl global 'ulimit-n',  condition bien entendu que le proxy ait t
dmarr sous le compte root (ou avec des droits suffisants pour lever le
nombre de descripteurs de fichiers). Cette solution met un terme au problme
rcurrent d'incertitude de l'adquation entre les limites systmes lors de la
dernire relance du proxessus et les limites en nombre de connexions. Noter que
cette limite s'applique par processus.

Exemple :
---------
    global
        maxconn 32000
        ulimit-n 65536


1.3) Diminution des privilges
------------------------------
Afin de rduire les risques d'attaques dans le cas o une faille non identifie
serait exploite, il est possible de diminuer les privilges du processus, et
de l'isoler dans un rpertoire sans risque.

Dans la section 'global', le paramtre 'uid' permet de spcifier un identifiant
numrique d'utilisateur. La valeur 0, correspondant normalement au super-
utilisateur, possde ici une signification particulire car elle indique que
l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
C'est la valeur par dfaut. De la mme manire, le paramtre 'gid' correspond 
un identifiant de groupe, et utilise par dfaut la valeur 0 pour ne rien
changer. Dans le cas o il ne serait pas possible de spcifier un identifiant
numrique pour l'uid, il est possible de spcifier un nom d'utilisateur aprs
le mot-cl 'user'. De la mme manire, il est possible de prciser un nom de
groupe aprs le mot-cl 'group'.

Il est particulirement dconseill d'utiliser des comptes gnriques tels que
'nobody' car cette pratique revient  utiliser 'root' si d'autres processus
utilisent les mmes identifiants.

Le paramtre 'chroot' autorise  changer la racine du processus une fois le
programme lanc, de sorte que ni le processus, ni l'un de ses descendants ne
puissent remonter de nouveau  la racine. Ce type de cloisonnement (chroot) est
gnralement contournable sur certains OS (Linux, Solaris) pour peu que
l'attaquant possde des droits 'root' et soit en mesure d'utiliser ou de crer
un rpertoire. Aussi, il est important d'utiliser un rpertoire spcifique au
service pour cet usage, et de ne pas mutualiser un mme rpertoire pour
plusieurs services de nature diffrente. Pour rendre l'isolement plus robuste,
il est conseill d'utiliser un rpertoire vide, sans aucun droit, et de changer
l'uid du processus de sorte qu'il ne puisse rien faire dans ledit rpertoire.

Remarque importante :
---------------------
Dans le cas o une telle faille serait mise en vidence, il est fort probable
que les premires tentatives de son exploitation provoquent un arrt du
programme,  cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
encore 'Illegal Instruction'. Mme s'il est vrai que faire tourner le serveur
en environnement limit rduit les risques d'intrusion, il est parfois bien
utile dans ces circonstances de connatre les conditions d'apparition du
problme, via l'obtention d'un fichier 'core'. La plupart des systmes, pour
des raisons de scurit, dsactivent la gnration du fichier 'core' aprs un
changement d'identifiant pour le processus. Il faudra donc soit lancer le
processus  partir d'un compte utilisateur aux droits rduits (mais ne pouvant
pas effectuer le chroot), ou bien le faire en root sans rduction des droits
(uid 0). Dans ce cas, le fichier se trouvera soit dans le rpertoire de
lancement, soit dans le rpertoire spcifi aprs l'option 'chroot'. Ne pas
oublier la commande suivante pour autoriser la gnration du fichier avant de
lancer le programme :

# ulimit -c unlimited

Exemple :
---------

    # with uid/gid
    global
        uid        30000
        gid        30000
        chroot  /var/chroot/haproxy

    # with user/group
    global
        user    haproxy
        group   public
        chroot  /var/chroot/haproxy


1.4) Modes de fonctionnement
----------------------------
Le service peut fonctionner dans plusieurs modes :
  - avant- / arrire-plan
  - silencieux / normal / debug

Le mode par dfaut est normal, avant-plan, c'est  dire que le programme ne
rend pas la main une fois lanc. Il ne faut surtout pas le lancer comme ceci
dans un script de dmarrage du systme, sinon le systme ne finirait pas son
initialisation. Il faut le mettre en arrire-plan, de sorte qu'il rende la main
au processus appelant. C'est ce que fait l'option 'daemon' de la section
'global', et qui est l'quivalent du paramtre '-D' de la ligne de commande.

Le paramtre de ligne de commande '-db' inhibe les options globales 'daemon'
et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.

Par ailleurs, certains messages d'alerte sont toujours envoys sur la sortie
standard, mme en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
Cette option n'a pas d'quivalent en ligne de commande.

Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
problmes en affichant les connexions, dconnexions et changes d'en-ttes HTTP
entre les clients et les serveurs. Ce mode est incompatible avec les options
'daemon' et 'quiet' pour des raisons de bon sens.

1.5) Accroissement de la capacit de traitement
-----------------------------------------------
Sur des machines multi-processeurs, il peut sembler gch de n'utiliser qu'un
processeur pour effectuer les tches de relayage, mme si les charges
ncessaires  saturer un processeur actuel sont bien au-del des ordres de
grandeur couramment rencontrs. Cependant, pour des besoins particuliers, le
programme sait dmarrer plusieurs processus se rpartissant la charge de
travail. Ce nombre de processus est spcifi par le paramtre 'nbproc' de la
section 'global'. Sa valeur par dfaut est naturellement 1. Ceci ne fonctionne
qu'en mode 'daemon'. Un usage dj rencontr pour ce paramtre fut de dpasser
la limite de nombre de descripteurs de fichiers alloue par processus sous
Solaris.

Exemple :
---------

    global
        daemon
        quiet
        nbproc        2

1.6) Simplification de la gestion des processus
-----------------------------------------------
Haproxy supporte dornavant la notion de fichiers de pid (-> pidfiles). Si le
paramtre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
d'un nom de fichier, alors ce fichier sera supprim puis recr et contiendra
le numro de PID des processus fils,  raison d'un par ligne (valable
uniquement en mode dmon). Ce fichier n'est PAS relatif au cloisonnement chroot
afin de rester compatible avec un rpertoire protg en lecture seule. Il
appartiendra  l'utilisateur ayant lanc le processus, et disposera des droits
0644.

Exemple :
---------

    global
        daemon
        quiet
        nbproc 2
        pidfile /var/run/haproxy-private.pid

    # pour stopper seulement ces processus parmi d'autres :
    # kill $(</var/run/haproxy-private.pid)

    # pour recharger une configuration avec un impact minimal sur le service,
    # et sans casser les sessions existantes :
    # haproxy -f haproxy.cfg -p /var/run/haproxy-private.pid -sf $(</var/run/haproxy-private.pid)

1.7) Mcanismes de traitements des vnements
---------------------------------------------
A partir de la version 1.2.5, haproxy supporte les mcanismes poll() et
epoll(). Sur les systems o select() est limit par FD_SETSIZE (comme Solaris),
poll() peut tre une alternative intressante. Des tests de performance
montrent que les performances de poll() ne dcroissent pas aussi vite que le
nombre de sockets augmente, ce qui en fait une solution sre pour les fortes
charges. Cela dit, Soalris utilise dj poll() pour muler select(), donc tant
que le nombre de sockets ne dpasse pas FD_SETSIZE, poll() ne devrait pas
apporter de performances supplmentaires. Sur les systmes  base Linux
incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
qui est extrmement rapide indpendamment du nombre de sockets. Les tests sur
haproxy ont montr une performance constante de 1  40000 sessions simultanes.
La version 1.3.9 a introduit le support de kqueue() pour FreeBSD/OpenBSD, ainsi
qu'une variante appele "speculative epoll()" consistant  tenter d'effectuer
les oprations d'entres/sorties avant de chaner les vnements par les appels
systme.

Afin d'optimiser la latence, il est dsormais possible de limiter le nombre
d'vnements remonts  chaque appel. La limite par dfaut est fixe  200. Si
une latence plus petite est recherche, il peut tre justifi d'abaisser cette
limite par l'utilisation du paramtre 'tune.maxpollevents' dans la section
'global'. L'augmenter permettra d'conomiser un peu le processeur en prsence
de trs grands nombres de connexions simultanes.

Haproxy utilisera kqueue() ou speculative epoll() lorsque ce sera disponible,
puis epoll(), et se repliera sur poll(), puis en dernier lieu sur select().
Cependant, si pour une raison quelconque il s'avrait ncessaire de dsactiver
epoll() ou poll() (p.ex:  cause d'un bug ou juste pour comparer les
performances), de nouvelles options globales ont t ajoutes dans ce but :
'nosepoll', 'nokqueue', 'noepoll' et 'nopoll'.

Exemple :
---------
    global
        # utiliser seulement select()
        noepoll
        nopoll
        tune.maxpollevents 100

Remarque :
----------
Dans le but d'assurer une portabilit maximale des configurations, ces options
sont acceptes et ignores si les mcanismes poll() ou epoll() n'ont pas t
activs lors de la compilation.

Afin de simplifier la rsolution de problmes, le paramtre '-de' en ligne de
commande dsactive epoll(), le paramtre '-dp' dsactive poll(), '-dk' kqueue()
et '-ds' dsactive speculative epoll(). Ils sont respectivement quivalents 
'noepoll', 'nopoll', 'nokqueue' et 'nosepoll'.


2) Dfinition d'un service en coute
====================================

Les sections de service dbutent par le mot cl "listen" :

    listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]

- <nom_instance> est le nom de l'instance dcrite. Ce nom sera envoy dans les
  logs, donc il est souhaitable d'utiliser un nom relatif au service relay.
  Aucun test n'est effectu concernant l'unicit de ce nom, qui n'est pas
  obligatoire, mais fortement recommande.

- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
  L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
  pourront s'effectuer sur toutes les adresses de la machine.

- <plage_ports> correspond soit  un port, soit  une plage de ports sur
  lesquels le relais acceptera des connexions pour l'adresse IP spcifie.
  Cette plage peut tre :
    - soit un port numrique (ex: '80')
    - soit une plage constitue de deux valeurs spares par un tiret
      (ex: '2000-2100') reprsentant les extrmits incluses dans la
      plage.
  Il faut faire attention  l'usage des plages, car chaque combinaison
  <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
  Le couple <adresse_IP>:<port> doit tre unique pour toutes les  instances
  d'une mme machine. L'attachement  un port infrieur  1024 ncessite un
  niveau de privilge particulier lors du lancement du programme
  (indpendamment du paramtre 'uid' de la section 'global').

- le couple <adresse_IP>:<plage_ports> peut tre rpt indfiniment pour
  demander au relais d'couter galement sur d'autres adresses et/ou d'autres
  plages de ports. Pour cela, il suffit de sparer les couples par une virgule.

Exemples :
---------
    listen http_proxy :80
    listen x11_proxy 127.0.0.1:6000-6009
    listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
    listen ldap_proxy :389,:663

Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
rajouter  l'aide du mot cl 'bind'. Dans ce cas, il n'est mme pas ncessaire
de spcifier la premire adresse sur la ligne listen, ce qui facilite parfois
l'criture de configurations :

    bind [ <adresse_IP>:<plage_ports>[,...] ]

Exemples :
----------
    listen http_proxy
        bind :80,:443
        bind 10.0.0.1:10080,10.0.0.1:10443

2.1) Inhibition d'un service
----------------------------
Un service peut tre dsactiv pour des besoins de maintenance, sans avoir 
commenter toute une partie du fichier. Il suffit de positionner le mot cl
"disabled" dans sa section :

    listen smtp_proxy 0.0.0.0:25
        disabled

Remarque: le mot cl 'enabled' permet de ractiver un service pralablement
          dsactiv par le mot cl 'disabled', par exemple  cause d'une
          configuration par dfaut.

2.2) Mode de fonctionnement
---------------------------
Un service peut fonctionner dans trois modes diffrents :
  - TCP
  - HTTP
  - tat de sant

Mode TCP
--------
Dans ce mode, le service relaye, ds leur tablissement, les connexions TCP
vers un ou plusieurs serveurs. Aucun traitement n'est effectu sur le flux. Il
s'agit simplement d'une association
     source<adresse:port> -> destination<adresse:port>.
Pour l'utiliser, prciser le mode TCP sous la dclaration du relais.

Exemple :
---------
    listen smtp_proxy 0.0.0.0:25
        mode tcp

Mode HTTP
---------
Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
dcision. Les en-ttes HTTP sont analyss pour y trouver un ventuel cookie, et
certains d'entre-eux peuvent tre modifis par le biais d'expressions
rgulires. Pour activer ce mode, prciser le mode HTTP sous la dclaration du
relais.

Exemple :
---------
    listen http_proxy 0.0.0.0:80
        mode http

Mode supervision
----------------
Il s'agit d'un mode offrant  un composant externe une visibilit de l'tat de
sant du service. Il se contente de retourner "OK"  tout client se connectant
sur son port. Il peut tre utilis avec des rpartiteurs de charge volus pour
dterminer quels sont les services utilisables. Si l'option 'httpchk' est
active, alors la rponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
attentes de composants sachant tester en HTTP. Pour activer ce mode, prciser
le mode HEALTH sous la dclaration du relais.

Exemple :
---------
    # rponse simple : 'OK'
    listen health_check 0.0.0.0:60000
        mode health

    # rponse HTTP : 'HTTP/1.0 200 OK'
    listen http_health_check 0.0.0.0:60001
        mode health
        option httpchk


2.2.1 Supervision
-----------------
Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
bon fonctionnement du proxy sans perturber le service. Le mot-cl 'monitor-net'
a t cr dans le butd de spcifier un rseau d'quipements qui ne PEUVENT PAS
utiliser le service pour autre chose que des tests de fonctionnement. C'est
particulirement adapt aux proxies TCP, car cela empche le proxy de relayer
des tablissements de connexion mis par un outil de surveillance.

Lorsque c'est utilis sur un proxy TCP, la connexion est accepte puis referme
et rien n'est logu. C'est suffisant pour qu'un rpartiteur de charge en amont
dtecte que le service est disponible.

Lorsque c'est utilis sur un proxy HTTP, la connexion est accepte, rien n'est
logu, puis la rponse suivante est envoye et la session referme :
"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un rpartiteur de charge
HTTP en amont dtecte le service comme oprationnel, aussi bien  travers des
tests TCP que HTTP.

Les proxies utilisant le mot-cl 'monitor-net' peuvent accessoirement se passer
de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
mises depuis d'autres adresses que celles du rseau de tests.

Exemple :
---------

    listen tse-proxy
       bind :3389,:1494,:5900  # TSE, ICA and VNC at once.
       mode tcp
       balance roundrobin
       server tse-farm 192.168.1.10
       monitor-net 192.168.1.252/31   # L4 load-balancers on .252 and .253


Lorsque le systme effectuant les tests est situ derrire un proxy, le mot-cl
'monitor-net' n'est pas utilisable du fait que haproxy verra toujours la mme
adresse pour le proxy. Pour pallier  cette limitation, la version 1.2.15 a
apport le mot-cl 'monitor-uri'. Il dfinit une URI qui ne sera ni retransmise
ni loge, mais pour laquelle haproxy retournera immdiatement une rponse
"HTTP/1.0 200 OK". Cela rend possibles les tests de validit d'une chane
reverse-proxy->haproxy en une requte HTTP. Cela peut tre utilis pour valider
une combinaision de stunnel+haproxy  l'aide de tests HTTPS par exemple. Bien
entendu, ce mot-cl n'est valide qu'en mode HTTP, sinon il n'y a pas de notion
d'URI. Noter que la mthode et la version HTTP sont simplement ignores.

Exemple :
---------

    listen stunnel_backend :8080
       mode http
       balance roundrobin
       server web1 192.168.1.10:80 check
       server web2 192.168.1.11:80 check
       monitor-uri /haproxy_test


2.3) Limitation du nombre de connexions simultanes
---------------------------------------------------
Le paramtre "maxconn" permet de fixer la limite acceptable en nombre de
connexions simultanes par proxy. Chaque proxy qui atteint cette valeur cesse
d'couter jusqu' libration d'une connexion. Voir plus loin concernant les
limitations lies au systme.

Exemple :
---------
    listen tiny_server 0.0.0.0:80
        maxconn 10


2.4) Arrt en douceur
---------------------
Il est possible d'arrter les services en douceur en envoyant un signal
SIGUSR1 au processus relais. Tous les services seront alors mis en phase
d'arrt, mais pourront continuer d'accepter des connexions pendant un temps
dfini par le paramtre 'grace' (en millisecondes). Cela permet par exemple,
de faire savoir rapidement  un rpartiteur de charge qu'il ne doit plus
utiliser un relais, tout en continuant d'assurer le service le temps qu'il
s'en rende compte.

Remarque :
----------
Les connexions actives ne sont jamais casses. Dans le pire des cas, il faudra
attendre en plus leur expiration avant l'arrt total du processus, ou bien tuer
manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par dfaut
du paramtre 'grace' est 0 (pas de grce, arrt immdiat de l'coute).

Exemple :
---------
    # arrter en douceur par 'killall -USR1 haproxy'
    # le service tournera encore 10 secondes aprs la demande d'arrt
    listen http_proxy 0.0.0.0:80
        mode http
        grace 10000

    # ce port n'est test que par un rpartiteur de charge.
    listen health_check 0.0.0.0:60000
        mode health
        grace 0

A partir de la version 1.2.8, un nouveau mcanisme de reconfiguration  chaud
a t introduit. Il est dsormais possible de mettre les proxies en "pause" en
envoyant un signal SIGTTOU aux processus. Cela dsactivera les sockets d'coute
sans casser les sessions existantes. Suite  cela, l'envoi d'un signal SIGTTIN
ractivera les sockets d'coute. Ceci est trs pratique pour tenter de charger
une nouvelle configuration ou mme une nouvelle version de haproxy sans casser
les connexions existantes. Si le rechargement s'effectue correctement, il ne
reste plus qu' envoyer un signal SIGUSR1 aux anciens processus, ce qui
provoquera leur arrt immdiat ds que leurs connexions seront termines ; en
revanche, si le rechargement choue, il suffit d'envoyer un signal SIGTTIN pour
remettre les ports en coute et rtablir le service immdiatement. Veuillez
noter que le paramtre 'grace' est ignor pour le signal SIGTTOU ainsi que le
signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avrer trs
utile de sauver le fichier de pid avant de dmarrer une nouvelle instance.

Ce mcanisme est pleinement exploit  partir de la version 1.2.11 avec les
options '-st' et '-sf' (voir ci-dessous).

2.4) Reconfiguration  chaud
----------------------------
Les paramtres '-st' et '-sf' sont utiliss pour informer des processus
existants que la configuration va tre recharge. Ils recevront le signal
SIGTTOU, leur demandant de librer les ports en coute afin que le nouveau
processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
se remettre en coute et continuer leur travail. En revanche, si la
configuration se charge correctement, alors ils recevront un signal de demande
de fin de travail en douceur (-sf), ou de terminaison immdiate (-st) qui
coupera les sessions en cours. Un usage typique tel que celui-ci permet de
recharger une configuration sans interruption de service :

 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)


2.5) Temps d'expiration des connexions
--------------------------------------
Il est possible de paramtrer certaines dures d'expiration au niveau des
connexions TCP. Trois temps indpendants sont configurables et acceptent des
valeurs en millisecondes. Si l'une de ces trois temporisations est dpasse, la
session est termine  chaque extrmit.

  - temps d'attente d'une donne de la part du client, ou de la
    possibilit de lui envoyer des donnes : "clitimeout" :

        # time-out client  2mn30.
        clitimeout        150000

  - temps d'attente d'une donne de la part du serveur, ou de la
    possibilit de lui envoyer des donnes : "srvtimeout" :

        # time-out serveur  30s.
        srvtimeout        30000

  - temps d'attente de l'tablissement d'une connexion vers un serveur
    "contimeout" :

        # on abandonne si la connexion n'est pas tablie aprs 4 secondes
        contimeout        4000

Remarques :
-----------
  - "contimeout" et "srvtimeout" n'ont pas d'utilit dans le cas du serveur de
    type "health".
  - sous de fortes charges, ou sur un rseau satur ou dfectueux, il est
    possible de perdre des paquets. Du fait que la premire retransmission
    TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
    infrieur  3 secondes ne permet pas de se rattraper sur la perte
    de paquets car la session aura t abandonne avant la premire
    retransmission. Une valeur de 4 secondes rduira considrablement
    le nombre d'checs de connexion.
  - A compter de la version 1.3.14, il est possible de spcifier les dures
    d'expiration dans des units de temps arbitraires  choisir parmi
    { us, ms, s, m, h, d }. Pour cela, la valeur entire doit tre suffixe
    de l'unit.

2.6) Tentatives de reconnexion
------------------------------
Lors d'un chec de connexion vers un serveur, il est possible de
retenter (potentiellement vers un autre serveur, en cas de rpartition
de charge). Le nombre de nouvelles tentatives infructueuses avant
abandon est fourni par le paramtre "retries".

Exemple :
---------
        # on essaie encore trois fois maxi
        retries 3

Il est  noter que la tentative de reconnexion peut amener  utiliser un autre
serveur si le premier a disparu entre deux tentatives de connexion.


2.7) Adresse du serveur
-----------------------
Le serveur vers lequel sont rediriges les nouvelles connexions est dfini par
le paramtre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond  un
serveur d'assignation de cookie dans le cas o le service consiste  assurer
uniquement une persistence HTTP, ou bien simplement au serveur destination dans
le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'tat
du serveur distant, et il est maintenant recommand d'utiliser de prfrence
le mode 'balance'.

Exemple :
---------
           # on envoie toutes les nouvelles connexions ici
        dispatch 192.168.1.2:80

Remarque :
----------
Ce paramtre n'a pas d'utilit pour un serveur en mode 'health', ni en mode
'balance'.


2.8) Adresse de sortie
----------------------
Il est possible de forcer l'adresse utilise pour tablir les connexions vers
les serveurs  l'aide du paramtre "source". Il est mme possible de forcer le
port, bien que cette fonctionnalit se limite  des usages trs spcifiques.
C'est particulirement utile en cas d'adressage multiple, et plus gnralement
pour permettre aux serveurs de trouver le chemin de retour dans des contextes
de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
librement par le systme. Il est  noter que depuis la version 1.1.18, les
tests de bon fonctionnement des serveurs seront aussi effectus  partir de la
source spcifie par ce paramtre.

Exemples :
----------
    listen http_proxy *:80
           # toutes les connexions prennent l'adresse 192.168.1.200
        source 192.168.1.200:0

    listen rlogin_proxy *:513
           # utiliser l'adresse 192.168.1.200 et le port rserv 900
        source 192.168.1.200:900


2.9) Dfinition du nom du cookie
--------------------------------
En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
vers quel serveur aiguiller la requte utilisateur. Le nom du cookie est donn
par le paramtre "cookie".

Exemple :
---------
    listen http_proxy :80
        mode http
        cookie SERVERID

On peut modifier l'utilisation du cookie pour la rendre plus intelligente
vis--vis des applications relayes. Il est possible, notamment de supprimer ou
rcrire un cookie retourn par un serveur accd en direct, et d'insrer un
cookie dans une rponse HTTP adresse  un serveur slectionn en rpartition
de charge, et mme de signaler aux proxies amont de ne pas cacher le cookie
insr.

Exemples :
----------

Pour ne conserver le cookie qu'en accs indirect, donc  travers le
dispatcheur, et supprimer toutes ses ventuelles occurences lors des accs
directs :

        cookie SERVERID indirect

Pour remplacer la valeur d'un cookie existant par celle attribue  un serveur,
lors d'un accs direct :

        cookie SERVERID rewrite

Pour crer un cookie comportant la valeur attribue  un serveur lors d'un
accs en rpartition de charge interne. Dans ce cas, il est souhaitable que
tous les serveurs aient un cookie renseign. Un serveur non assign d'un cookie
retournera un cookie vide (cookie de suppression) :

        cookie SERVERID insert

Pour rutiliser un cookie applicatif et lui prfixer l'identifiant du serveur,
puis le supprimer dans les requtes suivantes, utiliser l'option 'prefix'. Elle
permet d'insrer une instance de haproxy devant une application sans risquer
d'incompatibilits des  des clients qui ne supporteraient pas d'apprendre
plus d'un cookie :

       cookie JSESSIONID prefix

Pour insrer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
ajouter le mot cl 'nocache' aprs 'insert' :

        cookie SERVERID insert nocache

Pour insrer un cookie seulement suite aux requtes de type POST, ajouter le
mot cl 'postonly' aprs 'insert' :

        cookie SERVERID insert postonly


Remarques :
-----------
- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
  s'adapter  des applications gnrant dj le cookie, avec un contenu
  invalide. Il suffit pour cela de les spcifier sur la mme ligne.

- dans le cas o 'insert' et 'indirect' sont spcifis, le cookie n'est jamais
  transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
  comprendre.

- il est particulirement recommand d'utiliser 'nocache' en mode insertion si
  des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
  le cas contraire, un cache HTTP 1.0 pourrait cacher la rponse, incluant le
  cookie de persistence insr, donc provoquer des changements de serveurs pour
  des clients partageant le mme cache.

- le mode 'prefix' ne ncessite pas d'utiliser 'indirect', 'nocache', ni
  'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
  prsent par l'application qui est cense savoir  quel moment il peut
  tre mis sans risque. Toutefois, comme il ncessite de rectifier le cookie
  prsent par le client dans chaque requte ultrieure, il est indispensable
  de s'assurer que le client et le serveur communiqueront sans "keep-alive
  HTTP". Dans le doute, il est recommand d'utiliser l'option "httpclose".

- lorsque l'application est bien connue, et que les parties ncessitant de la
  persistence sont systmatiquement accdes par un formulaire en mode POST,
  il est plus efficace encore de combiner le mot cl "postonly" avec "insert"
  et "indirect", car la page d'accueil reste cachable, et c'est l'application
  qui gre le 'cache-control'.

2.10) Assignation d'un serveur  une valeur de cookie
----------------------------------------------------
En mode HTTP, il est possible d'associer des valeurs de cookie  des serveurs
par le paramtre 'server'. La syntaxe est :

    server <identifiant> <adresse_ip>:<port> cookie <valeur>

- <identifiant> est un nom quelconque de serveur utilis pour l'identifier dans la
  configuration et les logs.
- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur coute.
- <valeur> est la valeur  reconnatre ou positionner dans le cookie.

Exemple : le cookie SERVERID peut contenir server01 ou server02
---------
    listen http_proxy :80
        mode http
        cookie SERVERID
        dispatch 192.168.1.100:80
        server web1 192.168.1.1:80 cookie server01
        server web2 192.168.1.2:80 cookie server02

Attention : la syntaxe a chang depuis la version 1.0.
-----------

3) Rpartiteur de charge autonome
=================================

Le relais peut effectuer lui-mme la rpartition de charge entre les diffrents
serveurs dfinis pour un service donn, en mode TCP comme en mode HTTP. Pour
cela, on prcise le mot cl 'balance' dans la dfinition du service,
ventuellement suivi du nom d'un algorithme de rpartition. Jusqu' la version
1.2.11, seul 'roundrobin' tait gr, et c'est aussi la valeur implicite par
dfaut. Avec la version 1.2.12, le nouveau mot cl 'source' est apparu. La
version 1.3.10 a galement apport le mot cl 'uri'. Il est vident qu'en cas
d'utilisation du rpartiteur interne, il ne faudra pas spcifier d'adresse de
dispatch, et qu'il faudra au moins un serveur.

Exemple : mme que prcdemment en rpartition interne
---------

    listen http_proxy :80
        mode http
        cookie SERVERID
        balance roundrobin
        server web1 192.168.1.1:80 cookie server01
        server web2 192.168.1.2:80 cookie server02

Depuis la version 1.1.22, il est possible de dterminer automatiquement le port
du serveur vers lequel sera envoye la connexion, en fonction du port d'coute
sur lequel le client s'est connect. En effet, il y a 4 possibilits pour le
champ <port> de l'adresse serveur :

  - non spcifi ou nul :
    la connexion sera envoye au serveur sur le mme port que celui sur
    lequel le relais a reu la connexion.

  - valeur numrique (seul cas support pour les versions antrieures) :
    le serveur recevra la connexion sur le port dsign.

  - valeur numrique prcde d'un signe '+' :
    la connexion sera envoye au serveur sur le mme port que celui sur
    lequel le relais a reu la connexion, auquel on ajoute la valeur dsigne.
    
  - valeur numrique prcde d'un signe '-' :
    la connexion sera envoye au serveur sur le mme port que celui sur
    lequel le relais a reu la connexion, duquel on soustrait la valeur
    dsigne.
    
Exemples :
----------

# mme que prcdemment

    listen http_proxy :80
        mode http
        cookie SERVERID
        balance roundrobin
        server web1 192.168.1.1 cookie server01
        server web2 192.168.1.2 cookie server02

# relayage simultan des ports 80 et 81 et 8080-8089

    listen http_proxy :80,:81,:8080-8089
        mode http
        cookie SERVERID
        balance roundrobin
        server web1 192.168.1.1 cookie server01
        server web2 192.168.1.2 cookie server02

# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663

    listen http_proxy :25,:389,:663
        mode tcp
        balance roundrobin
        server srv1 192.168.1.1:+1000
        server srv2 192.168.1.2:+1000

Comme indiqu prcdemment, la version 1.2.12 apporta le nouveau mot cl
'source'. Lorsque celui-ci est utilis, l'adresse IP du client est hache et
distribue de manire homogne parmi les serveurs disponibles, de sorte qu'une
mme adresse IP aille toujours sur le mme serveur tant qu'il n'y a aucun
changement dans le nombre de serveurs disponibles. Ceci peut tre utilis par
exemple pour attacher le HTTP et le HTTPS sur un mme serveur pour un mme
client. Cela peut galement tre utilis pour amliorer la persistance
lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
ce cas, seuls ces derniers seront perturbs par la perte d'un serveur.

NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
      naviguent  travers des fermes de proxies qui assignent des adresses IP
      diffrentes  chaque requte. D'autres internautes utilisent des liens 
      la demande et obtiennent une adresse IP diffrente  chaque connexion. De
      ce fait, le paramtre 'source' doit tre utilis avec une extrme
      prcaution.

Exemples :
----------

# assurer qu'une mme adresse IP ira sur le mme serveur pour tout service

    listen http_proxy
        bind :80,:443
        mode http
        balance source
        server web1 192.168.1.1
        server web2 192.168.1.2

# amliorer la persistance par l'utilisation de la source en plus du cookie :

    listen http_proxy :80
        mode http
        cookie SERVERID
        balance source
        server web1 192.168.1.1 cookie server01
        server web2 192.168.1.2 cookie server02

De plus, tel qu'indiqu ci-dessus, la version 1.3.10 a introduit le mot cl
'uri'. Il est trs pratique dans le cas de rpartition de charge entre des
reverse-proxy-caches, parce qu'il utilisera le rsultat d'un hachage de l'URI
pour choisir un serveur, ce qui aura pour effet d'optimiser le taux de cache
du fait que la mme URI sera toujours envoye au mme cache. Ce mot-cl n'est
autoris qu'en mode HTTP.

Example :
---------

# Envoie toujours une URI donne au mme serveur

    listen http_proxy
        bind :3128
        mode http
        balance uri
        server squid1 192.168.1.1
        server squid2 192.168.1.2

La version 1.3.14 a apport une nouvelle mthode 'balance url_param'. Elle
consiste  se baser sur un paramtre pass dans l'URL pour effectuer un hachage
utilis pour dterminer le serveur  utiliser. Ceci est principalement utile
pour des applications n'ayant pas une exigence stricte de persistance, mais
pour lesquelles elle procure un gain de performance notable dans des
environnements o il n'est pas toujours possible d'utiliser des cookies. En cas
d'absence du paramtre dans l'URL, alors une rpartition de type 'round robin'
est effectue.

Example :
---------

# hache le paramtre "basket_id" dans l'URL pour dterminer le serveur

    listen http_proxy
        bind :3128
        mode http
        balance url_param basket_id
        server ebiz1 192.168.1.1
        server ebiz2 192.168.1.2


3.1) Surveillance des serveurs
------------------------------
Il est possible de tester l'tat des serveurs par tablissement de connexion
TCP ou par envoi d'une requte HTTP. Un serveur hors d'usage ne sera pas
utilis dans le processus de rpartition de charge interne. Pour activer la
surveillance, ajouter le mot cl 'check'  la fin de la dclaration du serveur.
Il est possible de spcifier l'intervalle (en millisecondes) sparant deux
tests du serveur par le paramtre "inter", le nombre d'checs accepts par le
paramtre "fall", et le nombre de succs avant reprise par le paramtre "rise".
Les paramtres non prciss prennent les valeurs suivantes par dfaut :

 - inter : 2000
 - rise  : 2
 - fall  : 3
 - port  : port de connexion du serveur
 - addr  : adresse de connexion du serveur (par defaut: adresse du serveur)
 
Le mode par dfaut consiste  tablir des connexions TCP uniquement. Dans
certains cas de pannes, des serveurs peuvent continuer  accepter les
connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
d'envoyer des requtes HTTP courtes et trs peu coteuses. Les versions 1.1.16
et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18  1.1.20,
les requtes ont t changes en "OPTIONS * HTTP/1.0" pour des raisons de
contrle d'accs aux ressources. Cependant, cette requte documente dans la
RFC2068 n'est pas comprise par tous les serveurs. Donc  partir de la version
1.1.21, la requte par dfaut est revenue  "OPTIONS / HTTP/1.0", mais il est
possible de paramtrer la partie URI. Les requtes OPTIONS prsentent
l'avantage d'tre facilement extractibles des logs, et de ne pas induire
d'accs aux fichiers ct serveur. Seules les rponses 2xx et 3xx sont
considres valides, les autres (y compris non-rponses) aboutissent  un
chec. Le temps maximal imparti pour une rponse est gal  l'intervalle entre
deux tests (paramtre "inter"). Pour activer ce mode, spcifier l'option
"httpchk", ventuellement suivie d'une mthode et d'une URI. L'option "httpchk"
accepte donc 4 formes :

  - option httpchk               -> OPTIONS / HTTP/1.0
  - option httpchk URI           -> OPTIONS <URI> HTTP/1.0
  - option httpchk METH URI      -> <METH> <URI> HTTP/1.0
  - option httpchk METH URI VER  -> <METH> <URI> <VER>

HAProxy est souvent utilis pour relayer divers protocoles reposant sur TCP,
tels que HTTPS, SMTP ou LDAP, le plus commun tant HTTPS. Un problme assez
couramment rencontr dans les data centers est le besoin de relayer du trafic
vers des serveurs lointains tout en maintenant la possibilit de basculer sur
un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
ces situations car l'on trouve souvent, dans la chane, des proxies, firewalls
ou rpartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
n'atteigne le serveur. La seule solution  ce problme est d'envoyer des tests
applicatifs. Comme la demande pour les tests HTTPS est leve, ce test a t
implment en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
CLIENT HELLO aux serveurs, en annonant un support pour la majorit des
algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble 
une rponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
rponse sera considre comme valide. Noter qu'Apache ne produit pas de log
lorsqu'il reoit des messages HELLO, ce qui en fait un type de message
parfaitement adapt  ce besoin.

La version 1.3.10 est accompagne d'un nouveau test d'tat pour le SMTP. Par
dfaut, il consiste  envoyer "HELO localhost" aux serveurs, et  attendre le
message "250" en retour. Notez qu'il peut aussi envoyer une requte plus
spcifique :

  - option smtpchk                         -> envoie "HELO localhost"
  - option smtpchk EHLO mail.mydomain.com  -> envoie ce message ESMTP

Voir les exemples ci-aprs.        

Depuis la version 1.1.17, il est possible de dfinir des serveurs de secours,
utiliss uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
ajouter le mot cl "backup" sur la ligne de dfinition du serveur. Un serveur
de secours n'est appel que lorsque tous les serveurs normaux, ainsi que tous
les serveurs de secours qui le prcdent sont hors d'usage. Il n'y a donc pas
de rpartition de charge entre des serveurs de secours par dfaut. A partir
de la version 1.2.9, il est possible de les utiliser simultanment grce 
l'option 'allbackups'. Ce type de serveurs peut servir  retourner des pages
d'indisponibilit de service. Dans ce cas, il est prfrable de ne pas affecter
de cookie, afin que les clients qui le rencontrent n'y soient pas affects
dfinitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
qui a pour effet de supprimer un ventuel cookie affect prcdemment.

Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
vers un port diffrent de celui de service. C'est ncessaire principalement
pour les configurations o le serveur n'a pas de port prdfini, par exemple
lorsqu'il est dduit du port d'acceptation de la connexion. Pour cela, utiliser
le paramtre 'port' suivi du numro de port devant rpondre aux requtes. Il
est possible d'envoyer les tests de fonctionnement vers une adresse diffrente 
de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
HAproxy, un dmon permettant des tests specifiques ( REGEX sur un rsultat et
basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).

Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
l'tat courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
SIGHUP au processus proxy. L'tat de tous les serveurs de tous les proxies est
envoy dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
local en niveau notice.

Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoy dans les
logs en niveau 'emerg' si tous les serveurs d'une mme instance sont tombs,
afin de notifier l'administrateur qu'il faut prendre une action immdiate.

Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
mme valeur de cookie. C'est particulirement utile en mode backup, pour
slectionner des chemins alternatifs pour un serveur donn, pour mettre en
oeuvre l'arrt en douceur d'un serveur, ou pour diriger les clients
temporairement vers une page d'erreur en attendant le redmarrage d'une
application. Le principe est que lorsqu'un serveur est dtect comme inoprant,
le proxy cherchera le prochain serveur possdant la mme valeur de cookie pour
chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
pour plus d'informations.

Exemples :
----------
# conf du paragraphe 3) avec surveillance TCP
    listen http_proxy 0.0.0.0:80
        mode http
        cookie SERVERID
        balance roundrobin
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2

# mme que prcdemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
    listen http_proxy 0.0.0.0:80
        mode http
        cookie SERVERID
        balance roundrobin
        option httpchk
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2

# mme que prcdemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
    listen http_proxy 0.0.0.0:80
        mode http
        cookie SERVERID
        balance roundrobin
        option httpchk /index.html
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2

# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
    listen http_proxy 0.0.0.0:80
        mode http
        cookie SERVERID
        balance roundrobin
        option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2

# rpartition avec persistence base sur le prfixe de cookie, et arrt en
# douceur utilisant un second port (81) juste pour les health-checks.
    listen http_proxy 0.0.0.0:80
       mode http
       cookie JSESSIONID prefix
       balance roundrobin
       option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
       server web1-norm 192.168.1.1:80 cookie s1 check port 81
       server web2-norm 192.168.1.2:80 cookie s2 check port 81
       server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
       server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup

# Insertion automatique de cookie dans la rponse du serveur, et suppression
# automatique dans la requte, tout en indiquant aux caches de ne pas garder
# ce cookie.
    listen web_appl 0.0.0.0:80
        mode http
        cookie SERVERID insert nocache indirect
        balance roundrobin
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check

# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
    listen web_appl 0.0.0.0:80
        mode http
        cookie SERVERID insert nocache indirect
        balance roundrobin
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check
        server web-backup 192.168.2.1:80 cookie server03 check backup
        server web-excuse 192.168.3.1:80 check backup

# relayage SMTP+TLS avec test du serveur et serveur de backup

    listen http_proxy :25,:587
        mode tcp
        balance roundrobin
        server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
        server srv2 192.168.1.2 backup

# relayage HTTPS avec test du serveur et serveur de backup

    listen http_proxy :443
        mode tcp
	option ssl-hello-chk
        balance roundrobin
        server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
        server srv2 192.168.1.2 backup

# Utilisation d'un groupe de serveurs pour le backup (ncessite haproxy 1.2.9)
    listen http_proxy 0.0.0.0:80
        mode http
        balance roundrobin
        option httpchk
        server inst1 192.168.1.1:80 cookie s1 check
        server inst2 192.168.1.2:80 cookie s2 check
        server inst3 192.168.1.3:80 cookie s3 check
        server back1 192.168.1.10:80 check backup
        server back2 192.168.1.11:80 check backup
        option allbackups  # all backups will be used


3.2) Reconnexion vers un rpartiteur en cas d'chec direct
----------------------------------------------------------
En mode HTTP, si un serveur dfini par un cookie ne rpond plus, les clients
seront dfinitivement aiguills dessus  cause de leur cookie, et de ce fait,
dfinitivement privs de service. La spcification du paramtre 'redispatch'
autorise dans ce cas  renvoyer les connexions choues vers le rpartiteur
(externe ou interne) afin d'assigner un nouveau serveur  ces clients.

Exemple :
---------
    listen http_proxy 0.0.0.0:80
        mode http
        cookie SERVERID
        dispatch 192.168.1.100:80
        server web1 192.168.1.1:80 cookie server01
        server web2 192.168.1.2:80 cookie server02
        redispatch # renvoyer vers dispatch si refus de connexion.

Par dfaut (et dans les versions 1.1.16 et antrieures), le paramtre
redispatch ne s'applique qu'aux checs de connexion au serveur. Depuis la
version 1.1.17, il s'applique aussi aux connexions destines  des serveurs
identifis comme hors d'usage par la surveillance. Si l'on souhaite malgr
tout qu'un client disposant d'un cookie correspondant  un serveur dfectueux
tente de s'y connecter, il faut prciser l'option "persist" :

    listen http_proxy 0.0.0.0:80
        mode http
        option persist
        cookie SERVERID
        dispatch 192.168.1.100:80
        server web1 192.168.1.1:80 cookie server01
        server web2 192.168.1.2:80 cookie server02
        redispatch # renvoyer vers dispatch si serveur HS.


3.3) Assignation de poids diffrents  des serveurs
---------------------------------------------------
Parfois il arrive d'ajouter de nouveaux serveurs pour accrotre la capacit
d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
que les autres (dans le cas d'un ajout d'urgence de matriel de rcupration),
soit plus puissant (lors d'un investissement dans du matriel neuf). Pour cette
raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
plus gros serveurs. Jusqu' la version 1.2.11, il tait ncessaire de rpliquer
plusieurs fois les dfinitions des serveurs pour augmenter leur poids. Depuis
la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
une vue des serveurs disponibles la plus homogne possible en se basant sur
leur poids de sorte que la charge se distribue de la manire la plus lisse
possible. Le poids compris entre 1 et 256 doit reflter la capacit d'un
serveur par rapport aux autres. Le poids de 1 donne la frquence d'apparition
la plus faible, et 256 la frquence la plus leve. De cette manire, si un
serveur disparait, les capacits restantes sont toujours respectes.


Exemple :
---------
# distribution quitable sur 2 opteron and un ancien pentium3

    listen web_appl 0.0.0.0:80
        mode http
        cookie SERVERID insert nocache indirect
        balance roundrobin
        server pentium3-800 192.168.1.1:80 cookie server01 weight  8 check
        server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
        server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
        server web-backup1 192.168.2.1:80 cookie server04 check backup
        server web-excuse 192.168.3.1:80 check backup

Notes :
-------
  - lorsque le poids n'est pas spcifi, la valeur par dfaut est  1

  - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
    est plus propre d'utiliser les poids que de rpliquer le mme serveur
    plusieurs fois.

  - les poids s'appliquent galement aux serveurs de backup si l'option
    'allbackups' est positionne.

  - le poids s'applique aussi  la rpartition selon la source
    ('balance source').

  - quels que soient les poids, le premier serveur sera toujours assign en
    premier. Cette rgle facilite les diagnostics.

  - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
    une priorit aux premiers serveurs, donc la vue est la plus uniforme si les
    serveurs sont dclars dans l'ordre croissant de leurs poids.

La distribution du trafic suivra exactement le squencement suivant :

        Request|                   1 1 1 1
        number | 1 2 3 4 5 6 7 8 9 0 1 2 3
       --------+---------------------------
        p3-800 | X . . . . . . X . . . . .
        opt-20 | . X . X . X . . . X . X .
        opt-24 | . . X . X . X . X . X . X


3.4) Limitation du nombre de sessions concurrentes par serveur
--------------------------------------------------------------
Certains serveurs web multi-processus tels qu'Apache souffrent ds qu'il y a
trop de sessions concurrentes, parce qu'il est trs coteux de faire
fonctionner des centaines ou des milliers de processus sur un systme. Une
solution consiste  augmenter le nombre de serveurs et de rpartir la charge
entre eux, mais cela pose un problme lorsque le but est uniquement de rsister
 des pics de charge occasionnels.

Pour rsoudre ce problme, une nouvelle fonctionnalit a t implmente dans
HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associe  une
file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
de diminuer la valeur maxconn amliorera notablement les performances des
serveurs et diminuera les temps de rponse simplement parce que les serveurs
seront moins congestionns.

Quand une requte cherche  joindre n'importe quel serveur, le premier serveur
non satur est utilis, en respectant l'algorithme de rpartition de charge. Si
tous les serveurs sont saturs, alors la requte sera mise dans la file
d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
toutes les requtes prcdentes auront t libres et qu'un serveur aura t
libr d'une connexion pour la traiter.

Si une requte fait rfrence  un serveur en particulier (p.ex: hachage d'IP
source, ou persistance par cookie), et que ce server est satur, alors la
requte sera mise dans la file d'attente ddie  ce serveur. Cette file
d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent dj
que pour les nouveaux utilisateurs.

Pour cela, les logs ont d tre enrichis pour indiquer le nombre de sessions
par serveur, la position de la requte dans les files d'attentes, et le temps
pass en file d'attente. Ceci aide considrablement  faire de la prvision de
capacit. Voir la section 'logs' plus bas pour plus d'informations.

Exemple :
---------
    # Prendre soin du P3 qui n'a que 256 Mo de RAM.
    listen web_appl 0.0.0.0:80
        maxconn 10000
        mode http
        cookie SERVERID insert nocache indirect
        balance roundrobin
        server pentium3-800 192.168.1.1:80 cookie s1 weight  8 maxconn 100 check
        server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
        server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
        server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
        server web-excuse 192.168.3.1:80 check backup

Cette option se montra si efficace pour rduire les temps de rponse des
serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
pour amliorer les performances de leurs serveurs. Seulement, ils n'taient
alors plus en mesure de supporter de trs fortes charges parce qu'il n'tait
plus possible de les saturer. Pour cette raison, la version 1.2.14 a apport la
limitation dynamique de connexions avec l'addition du paramtre "minconn".
Lorsque ce paramtre est associ  "maxconn", il active la limitation dynamique
base sur la charge de l'instance. Le nombre maximal de sessions concurrentes
sur un serveur devient alors proportionnel au nombre de sessions de l'instance
par rapport  son 'maxconn'. Un minimum de <minconn> sessions sera toujours
permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
au meilleur de leurs performances sous des charges normales, et qu'ils seront
tout de mme capables de supporter de fortes pointes lorsque ncessaire. La
limite dynamique est calcule comme ceci :

    srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)

Exemple :
---------
    # Prendre soin du P3 qui n'a que 256 Mo de RAM.
    listen web_appl 0.0.0.0:80
        maxconn 10000
        mode http
        cookie SERVERID insert nocache indirect
        balance roundrobin
        server pentium3-800 192.168.1.1:80 cookie s1 weight  8 minconn 10 maxconn 100 check
        server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
        server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
        server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
        server web-excuse 192.168.3.1:80 check backup

Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
connexions simultanes lorsque l'instance du proxy en atteindra 10000, et
recevra seulement 10 connexions simultanes tant que le proxy sera sous les 1000
sessions.

Il est possible de limiter la taille de la file d'attente dans le but de
redistribuer les connexions destines  un serveur en particulier qui sont trop
loin pour avoir une chance d'tre servies en un temps raisonnable. Ceci n'est
acceptable que dans le cas o l'affinit entre le client et le serveur n'est
pas obligatoire, mais motive uniquement par des raisons de performances, par
exemple, par l'utilisation d'un cache local au serveur. L'option 'maxqueue'
permet de prciser la limite par serveur, tel que dans l'exemple ci-dessous :

... (mme exemple que prcdemment)
        server pentium3-800 192.168.1.1:80 cookie s1 weight  8 minconn 10 maxconn 100 check maxqueue 50
        server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check maxqueue 200
        server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check

En l'absence du paramtre 'maxqueue', la file d'un serveur n'a pas de limite
dfinie. Dans le cas contraire, lorsque la file atteint la limite fixe par
'maxqueue', les clients sont dplacs vers la file globale.

Notes :
-------
  - la requte ne restera pas indfiniment en file d'attente, elle est
    assujtie au paramtre 'contimeout', et si une requte ne peut pas
    sortir de la file avant ce time-out, soit parce que le serveur est
    satur, soit parce qu'il y a trop de requtes en file d'attente,
    alors elle expirera avec une erreur 503.

  - si seul <minconn> est spcifi, il a le mme effet que <maxconn>

  - positionner des valeurs trop basses pour 'maxconn' peut amliorer les
    performances mais aussi permettre  des utilisateurs trop lents de bloquer
    un serveur pour les autres utilisateurs.


3.5) Abandon des requtes abortes
----------------------------------
En prsence de trs fortes charges, les serveurs mettront un certain temps 
rpondre. La file d'attente du proxy se remplira, et les temps de rponse
suivront une croissance proportionnelle  la taille de file d'attente fois
le temps moyen de rponse par session. Lorsque les clients attendront plus de
quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
navigateur, laissant des requtes inutiles en file d'attente et ralentissant
donc les autres utilisateurs.

Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
doivent tre conservateurs et considrer que le client n'a probablement ferm
que le canal de sortie en attendant la rponse. Toutefois, ceci introduit des
risques de congestion lorsque beaucoup d'utilisateurs font de mme, et s'avre
aujourd'hui compltement inutile car probablement aucun client ne referme la
session en attendant la rponse. Certains agents HTTP supportent ceci (Squid,
Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
rpartiteurs de charge matriels). Donc la probabilit pour qu'une notification
de fermeture d'un canal d'entre ct client reprsente un utilisateur cliquant
sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
requte prmaturment sans polluer les serveurs.

Pour cette raison, une nouvelle option "abortonclose" a t introduite en
version 1.2.14. Par dfaut (sans l'option), le comportement reste conforme 
HTTP. Mais lorsque l'option est spcifie, une session dont le canal entrant
est ferm sera aborte si cela est possible, c'est  dire que la requte est
soit en file d'attente, soit en tentative de connexion. Ceci rduit
considrablement la longueur des files d'attentes et la charge sur les serveurs
saturs lorsque les utilisateurs sont tents de cliquer sur 'STOP', ce qui 
son tour, rduit les temps de rponse pour les autres utilisateurs.

Exemple :
---------
    listen web_appl 0.0.0.0:80
        maxconn 10000
        mode http
        cookie SERVERID insert nocache indirect
        balance roundrobin
        server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
        server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
        server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
        server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
        option abortonclose


4) Fonctionnalits additionnelles
=================================

D'autres fonctionnalits d'usage moins courant sont disponibles. Il s'agit
principalement du mode transparent, de la journalisation des connexions, de la
rcriture des en-ttes, et du statut sous forme de page HTML.


4.1) Fonctionnalits rseau
---------------------------
4.1.1) Fonctionnement en mode transparent
---------------------------------------
En mode HTTP, le mot cl 'transparent' permet d'intercepter des sessions
routes  travers la machine hbergeant le proxy. Dans ce mode, on ne prcise
pas l'adresse de rpartition 'dispatch', car celle-ci est tire de l'adresse
destination de la session dtourne. Le systme doit permettre de rediriger les
paquets vers un processus local.

Exemple :
---------
    listen http_proxy 0.0.0.0:65000
        mode http
        transparent
        cookie SERVERID
        server server01 192.168.1.1:80
        server server02 192.168.1.2:80

    # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
      --dport 80 -j REDIRECT --to-ports 65000

Remarque :
----------
Si le port n'est pas spcifi sur le serveur, c'est le port auquel s'est
adress le client qui sera utilis. Cela permet de relayer tous les ports TCP
d'une mme adresse avec une mme instance et sans utiliser directement le mode
transparent.

Exemple :
---------
    listen http_proxy 0.0.0.0:65000
        mode tcp
        server server01 192.168.1.1 check port 60000
        server server02 192.168.1.2 check port 60000

    # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
      -j REDIRECT --to-ports 65000


4.1.2) Choix d'une adresse source par serveur
---------------------------------------------------
Avec les versions 1.1.30 et 1.2.3, il devient possible de spcifier une adresse
IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
backup  partir d'un LAN diffrent, ou pour utiliser des chemins alternatifs
pour joindre le mme serveur. C'est galement utilisable pour faciliter une
rpartition de charge selon l'adresse IP source pour des connexions sortantes.
Bien entendu, la mme adresse est utilise pour les health-checks.

Exemple :
---------
    # utiliser une adresse particulire pour joindre les 2 serveur
    listen http_proxy 0.0.0.0:65000
       mode http
       balance roundrobin
       server server01 192.168.1.1:80 source 192.168.2.13
       server server02 192.168.1.2:80 source 192.168.2.13

Exemple :
---------
    # utiliser une adresse particulire pour joindre chaque serveur
    listen http_proxy 0.0.0.0:65000
       mode http
       balance roundrobin
       server server01 192.168.1.1:80 source 192.168.1.1
       server server02 192.168.2.1:80 source 192.168.2.1

Exemple :
---------
    # faire une rpartition d'adresse sources pour joindre le mme proxy 
    # travers deux liens WAN 
    listen http_proxy 0.0.0.0:65000
       mode http
       balance roundrobin
       server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
       server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1

Exemple :
---------
    # forcer une connexion TCP  s'attacher  un port particulier
    listen http_proxy 0.0.0.0:2000
       mode tcp
       balance roundrobin
       server srv1 192.168.1.1:80 source 192.168.2.1:20
       server srv2 192.168.1.2:80 source 192.168.2.1:20

4.1.3) Maintien de session TCP (keep-alive)
-------------------------------------------
Avec la version 1.2.7, il devient possible d'activer le maintien de session
TCP (TCP keep-alive)  la fois ct client et ct serveur. Cela permet
d'empcher des sessions longues d'expirer sur des quipements de niveau 4
externes tels que des firewalls ou des rpartiteurs de charge. Cela permet
aussi au systme de dtecter et terminer des sessions figes lorsqu'aucun
time-out n'a t positionn (fortement dconseill). Le proxy ne peut pas
positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
vous rfrer au manuel du systme d'exploitation pour cela. Il existe 3 options
pour activer le maintien de session TCP :

	option tcpka	# active le keep-alive ct client et ct serveur
	option clitcpka	# active le keep-alive ct client
	option srvtcpka	# active le keep-alive ct serveur

4.1.4) Rmanence des donnes TCP (lingering)
--------------------------------------------
Il est possible de dsactiver la conservation de donnes non acquittes par un
client  la fin d'une session. Cela peut parfois s'avrer ncessaire lorsque
haproxy est utilis en face d'un grand nombre de clients non fiables et qu'un
nombre lev de sockets en tat FIN_WAIT est observ sur la machine. L'option
peut tre utilise dans un frontend pour ajuster les connexions vers les
clients, et dans un backend pour ajuster les connexions vers les serveurs :

	option nolinger	# dsactive la conservation de donnes


4.2) Journalisation des connexions
----------------------------------

L'un des points forts de HAProxy est indniablement la prcision de ses logs.
Il fournit probablement le plus fin niveau d'information disponible pour un
tel outil, ce qui est trs important pour les diagnostics en environnements
complexes. En standard, les informations journalises incluent le port client,
les chronomtrages des tats TCP/HTTP, des tats de session prcis au moment de
la terminaison et sa cause, des informations sur les dcisions d'aiguillage du
trafic vers un serveur, et bien sr la possibilit de capturer des en-ttes
arbitraires.

Dans le but d'amliorer la ractivit des administrateurs, il offre une grande
transparence sur les problmes rencontrs,  la fois internes et externes, et
il est possible d'envoyer les logs vers des serveurs diffrents en mme temps
avec des niveaux de filtrage diffrents :

  - logs globaux au niveau processus (erreurs systme, arrts/dmarrages, ...)
  - erreurs systme et internes par instance (manque de ressources, bugs, ...)
  - problmes externes par instance (arrts/relance serveurs, limites, ...)
  - activit par instance (connexions clients), aussi bien lors de leur
    tablissement qu' leur terminaison.

La possibilit de distribuer diffrents niveaux de logs  diffrents serveurs
permet  plusieurs quipes de production d'intragir et de corriger leurs
problmes le plus tt possible. Par exemple, l'quipe systme peut surveiller
occasionnellement les erreurs systme, pendant que l'quipe application
surveille les alertes d'arrts/dmarrages de ses serveurs en temps rel, et
que l'quipe scurit analyse l'activit en diffr d'une heure.


4.2.1) Niveaux de log
---------------------
Les connexions TCP et HTTP peuvent donner lieu  une journalisation sommaire ou
dtaille indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
source, le serveur destination, la dure de la connexion, les temps de rponse,
la requte HTTP, le code de retour, la quantit de donnes transmises, et mme
dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
Tous les messages sont envoys en syslog vers un ou deux serveurs. Se rfrer 
la section 1.1 pour plus d'information sur les catgories de logs.  La syntaxe
est la suivante :

    log <adresse_ip_1> <catgorie_1> [niveau_max_1]
    log <adresse_ip_2> <catgorie_2> [niveau_max_2]
ou
    log global

Remarque :
----------
La syntaxe spcifique 'log global' indique que l'on souhaite utiliser les
paramtres de journalisation dfinis dans la section 'global'.

Exemple :
---------
    listen http_proxy 0.0.0.0:80
        mode http
        log 192.168.2.200 local3
        log 192.168.2.201 local4

4.2.2) Format des logs
----------------------
Par dfaut, les connexions sont journalises au niveau TCP ds l'tablissement
de la session entre le client et le relais. En prcisant l'option 'tcplog',
la connexion ne sera journalise qu'en fin de session, ajoutant des prcisions
sur son tat lors de la dconnexion, ainsi que le temps de connexion et la
dure totale de la session. Le nombre de sessions restantes aprs la
dconnexion est galement indiqu (pour le serveur, l'instance et le process).

Exemple de journalisation TCP :
-------------------------------
    listen relais-tcp 0.0.0.0:8000
        mode tcp
        option tcplog
        log 192.168.2.200 local3

>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/0/5007 0 -- 1/1/1 0/0
  
    Champ  Format / Description                          Exemple

        1  nom_processus '[' pid ']:'                    haproxy[18989]:
        2  ip_client ':' port_client                     127.0.0.1:34550
        3  '[' date ']'                                  [15/Oct/2003:15:24:28]
        4  nom_instance                                  relais-tcp
        5  nom_serveur                                   Srv1
        6  temps_file '/' temps_connect '/' temps_total  0/0/5007
        7  octets lus                                    0
        8  etat_terminaison                              --
        9  conn_srv '/' conns_inst '/' conns_processus   1/1/1
       10  position en file d'attente srv '/' globale    0/0

Une autre option, 'httplog', fournit plus de dtails sur le protocole HTTP,
notamment la requte et l'tat des cookies. Dans les cas o un mcanisme de
surveillance effectuant des connexions et dconnexions frquentes, polluerait
les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
ligne de log pour les sessions n'ayant pas donn lieu  un change de donnes
(requte ou rponse).

Exemple de journalisation HTTP :
--------------------------------
    listen http_proxy 0.0.0.0:80
        mode http
        option httplog
        option dontlognull
        log 192.168.2.200 local3

>>> haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 9/0/7/147/723 200 243 - - ---- 2/3/3 0/0 "HEAD / HTTP/1.0"

Exemple plus complet :

    haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 137/202/205 0/0 {w.ods.org|Mozilla} {} "HEAD / HTTP/1.0" 

    Champ  Format / Description                          Exemple

        1  nom_processus '[' pid ']:'                    haproxy[18989]:
        2  ip_client ':' port_client                     10.0.0.1:34552
        3  '[' date ']'                                  [15/Oct/2003:15:26:31]
        4  nom_instance                                  relais-http
        5  nom_serveur                                   Srv1
        6  Tq '/' Tw '/' Tc '/' Tr '/' Tt                3183/-1/-1/-1/11215
        7  Code_retour_HTTP                              503
        8  octets lus                                    0
        9  cookies_requte_capturs                      -
       10  cookies_reponse_capturs                      -
       11  etat_terminaison                              SC--
       12  conns_srv '/' conns_inst '/' conns_processus  137/202/205
       13  position file serveur '/' globale             0/0
       14  '{' entetes_requte_capturs '}'              {w.ods.org|Mozilla}
       15  '{' entetes_reponse_capturs '}'              {}
       16  '"' requte_HTTP '"'                          "HEAD / HTTP/1.0"
  
Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
                                   commence par un guillemet '"'.

Le problme de loguer uniquement en fin de session, c'est qu'il est impossible
de savoir ce qui se passe durant de gros transferts ou des sessions longues.
Pour pallier  ce problme, une nouvelle option 'logasap' a t introduite dans
la version 1.1.28 (1.2.1). Lorsqu'elle est active, le proxy loguera le plus
tt possible, c'est  dire juste avant que ne dbutent les transferts de
donnes. Cela signifie, dans le cas du TCP, qu'il loguera toujours le rsultat
de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
traitement des en-ttes de la rponse du serveur, auquel cas le nombre d'octets
reprsentera la taille des en-ttes retourns au client.

Afin d'viter toute confusion avec les logs normaux, le temps total de
transfert et le nombre d'octets transfrs sont prfixs d'un signe '+'
rappelant que les valeurs relles sont certainement plus leves.

Exemple :
---------

    listen http_proxy 0.0.0.0:80
        mode http
        option httplog
        option dontlognull
        option logasap
        log 192.168.2.200 local3

>>> haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/7/14/+30 200 +243 - - ---- 3/3 "GET /image.iso HTTP/1.0"


4.2.3) Chronomtrage des vnements
-----------------------------------
Pour dceler des problmes rseau, les mesures du temps coul entre certains
vnements sont d'une trs grande utilit. Tous les temps sont mesurs en
millisecondes (ms). En mode HTTP, quatre points de mesure sont rapports sous
la forme Tq/Tw/Tc/Tr/Tt :

  - Tq: temps total de rception de la requte HTTP de la part du client.
    C'est le temps qui s'est coul entre le moment o le client a tabli
    sa connexion vers le relais, et le moment o ce dernier a reu le dernier
    en-tte HTTP validant la fin de la requte. Une valeur '-1' ici indique
    que la requte complte n'a jamais t reue.

  - Tw: temps total pass dans les files d'attente avant d'obtenir une place
    vers un serveur. Ceci tient compte  la fois de la file d'attente globale
    et de celle du serveur, et dpend du nombre de requtes dans la file et du
    temps ncessaire au serveur pour complter les sessions prcdentes. La
    valeur '-1' indique que la requte a t dtruite avant d'atteindre une
    file.

  - Tc: temps d'tablissement de la connexion TCP du relais vers le serveur.
    C'est le temps coul entre le moment ou le relais a initi la demande de
    connexion vers le serveur, et le moment o ce dernier l'a acquitte, c'est
     dire le temps entre l'envoi du paquet TCP SYN la rception du SYN/ACK.
    Une valeur '-1' ici indique que la connexion n'a jamais pu tre tablie
    vers le serveur.

  - Tr: temps de rponse du serveur. C'est le temps que le serveur a mis pour
    renvoyer la totalit des en-ttes HTTP  partir du moment o il a acquitt
    la connexion. Ca reprsente exactement le temps de traitement de la
    transaction sans le transfert des donnes associes. Une valeur '-1'
    indique que le serveur n'a pas envoy la totalit de l'en-tte HTTP.

  - Tt: dure de vie totale de la session, entre le moment o la demande de
    connexion du client a t acquitte et le moment o la connexion a t
    referme aux deux extrmits (client et serveur). La signification change
    un peu si l'option 'logasap' est prsente. Dans ce cas, le temps correspond
    uniquement  (Tq + Tw + Tc + Tr), et se trouve prfix d'un signe '+'. On
    peut donc dduire Td, le temps de transfert des donnes, en excluant les
    autres temps :

        Td = Tt - (Tq + Tw + Tc + Tr)

    Les temps rapports  '-1' sont simplement  liminer de cette quation.

En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
rapports.

Ces temps fournissent de prcieux renseignement sur des causes probables de
problmes. Du fait que le protocole TCP dfinisse des temps de retransmission
de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
de 3 secondes indique pratiquement toujours des pertes de paquets lis  un
problme rseau (cble ou ngociation). De plus, si <Tt> est proche d'une
valeur de time-out dans la configuration, c'est souvent qu'une session a t
abandonne sur expiration d'un time-out.

Cas les plus frquents :

  - Si Tq est proche de 3000, un paquet a trs certainement t perdu entre
    le client et le relais.
  - Si Tc est proche de 3000, un paquet a trs certainement t perdu entre
    le relais et le serveur durant la phase de connexion. Cet indicateur
    devrait normalement toujours tre trs bas (moins de quelques dizaines).
  - Si Tr est presque toujours infrieur  3000, et que certaines valeurs
    semblent proches de la valeur moyenne majore de 3000, il y a peut-tre
    de pertes entre le relais et le serveur.
  - Si Tt est lgrement suprieur au time-out, c'est souvent parce que le
    client et le serveur utilisent du keep-alive HTTP entre eux et que la
    session est maintenue aprs la fin des changes. Voir plus loin pour
    savoir comment dsactiver le keep-alive HTTP.

Autres cas ('xx' reprsentant une valeur quelconque  ignorer) :
  -1/xx/xx/xx/Tt: le client n'a pas envoy sa requte dans le temps imparti ou
                  a referm sa connexion sans complter la requte.
  Tq/-1/xx/xx/Tt: Il n'tait pas possible de traiter la request, probablement
                  parce que tous les serveurs taient hors d'usage.
  Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'tablir vers le serveur (refus ou
                  time-out au bout de Tt-(Tq+Tw) ms).
  Tq/Tw/Tc/-1/Tt: le serveur a accept la connexion mais n'a pas rpondu dans
                  les temps ou bien a referm sa connexion trop tt, au bout
                  de Tt-(Tq+Tw+Tc) ms.
     
4.2.4) Conditions de dconnexion
--------------------------------
Les logs TCP et HTTP fournissent un indicateur de compltude de la session dans
le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
un champ long de 2 caractres en TCP et de 4 caractres en HTTP, chacun ayant
une signification prcise :

  - sur le premier caractre, un code prcisant le premier vnement qui a caus
    la terminaison de la session :

        C : fermeture inattendue de la session TCP de la part du client.

        S : fermeture inattendue de la session TCP de la part du serveur, ou
            refus explicite de connexion de la part de ce dernier.

        P : terminaison prmature des sessions par le proxy, pour cause
            d'imposition d'une limite sur le nombre de connexions, pour cause
            de configuration (ex: filtre d'URL), ou parce qu'un contrle de
            scurit a dtect et bloqu une anomalie dans la rponse du
            serveur qui aurait pu causer une fuite d'informations (par exemple,
            un cookie cachable).

        R : une ressource sur le proxy a t puise (mmoire, sockets, ports
            source, ...). Gnralement, cela arrive au cours de l'tablissement
            d'une connexion, et les logs systme doivent contenir une copie de
            l'rreur prcise.

        I : une erreur interne a t identifie par le proxy  la suite d'un
            auto-contrle. Ceci ne doit JAMAIS arriver, et vous tes encourags
             remonter n'importe quel log contenant ceci car il s'agira un bug.

        c : le dlai maximal d'attente du client a expir (clitimeout).

        s : le dlai maximal d'attente du serveur a expir (srvtimeout et contimeout)

        - : terminaison normale de session.

  - sur le second caractre, l'tat d'avancement de la session TCP/HTTP lors de
    la fermeture :

        R : attente d'une REQUETE HTTP complte de la part du client. Rien n'a
            t transmis au serveur.

        Q : attente en file d'attente (QUEUE) d'une place pour avoir une
            connexion vers un serveur. Ne peut apparatre que sur un serveur
            possdant un paramtre 'maxconn'. Aucune connexion n'a t envoye
            au serveur.

        C : attente de l'tablissement d'une CONNEXION vers le serveur. Le
            serveur peut au plus avoir vu la tentative de connexion, mais
            aucune donne n'a t change.

        H : attente, rception ou traitement des en-ttes HTTP ("HEADERS").

        D : transfert des DONNEES du serveur vers le client.

        L : transfert des dernires ("LAST") donnes du proxy vers le client,
            alors que le serveur a dj fini.

        T : requte bloque en mode "tarpit" par le proxy. Elle a t maintenue
            ouverte vers le client pendant toute la dure du contimeout ou
            jusqu' l'abandon de la part du client.

        - : terminaison normale, aprs fin de transfert des donnes.

  - le troisime caractre indique l'ventuelle identification d'un cookie de
    persistence (uniquement en mode HTTP) :

        N : aucun cookie de persistence n'a t prsent. C'est gnralement le
            cas sur les NOUVELLES connexions clients.

        I : le client a prsent un cookie INVALIDE ne correspondant  aucun
            serveur connu. Ceci peut tre d  un changement de configuration
            rcent,  des mlanges de noms de cookies entre sites HTTP/HTTPS,
            ou  une attaque.

        D : le client a prsent un cookie correspondant  un serveur hors
            d'usage ("DOWN"). Suivant l'option 'persist', il a t renvoy vers
            un autre serveur ou a tout de mme tent de se connecter sur celui
            correspondant au cookie.

        V : le client a prsent un cookie VALIDE et a pu se connecter au
            serveur correspondant.

        - : non appliquable (pas de cookie positionn dans la configuration).

  - le dernier caractre indique l'ventuel traitement effectu sur un cookie de
    persistence retrourn par le serveur (uniquement en mode HTTP) :

        N : aucun cookie de persistance n'a t fourni par le serveur, et aucun
            n'a t insr.

        I : aucun cookie de persistance n'a t fourni par le serveur, et le
            proxy en a INSERE un.

        P : un cookie de persistence a t fourni par le serveur et transmis
            tel quel ("PASSIF").

        R : le cookie retourn par le serveur a t REECRIT par le proxy.

        D : le cookie prsent par le serveur a t DETRUIT par le proxy pour
            ne pas tre retourn au client.

        - : non appliquable


La combinaison des deux premiers indicateurs fournit une grande quantiti
d'informations sur ce qui se passait lorsque la session s'est termine. Cela
peut notamment aider  dtecter une saturation de serveur, des troubles rseau,
des puisements de ressources systme locales, des attaques, etc...

Les combinaisons d'indicateurs les plus frquentes sont numres ici.

   Indic  Raison
      CR  Le client a abandonn avant d'mettre une requte complte. Il est
          trs probable que la requte ait t tape  la main dans un client
          telnet et aborte trop tt.

      cR  Le temps imparti au client a expir avant rception d'une requte
          complte. Ceci est parfois caus par un paramtre TCP MSS trop lev
          sur le client pour des rseaux PPPoE sur ADSL qui ne peuvent pas
          transporter des paquets entiers, ou par des clients qui nvoient des
          requtes  la main et ne tapent pas assez vite.

      SC  Le serveur a explicitement refus la connexion (le proxy a reu un
          RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
          tre la couche rseau qui indique au proxy que le serveur n'est pas
          joignable (p.ex: pas de route, pas de rponse ARP en local, etc...)

      sC  La connexion au serveur n'a pas pu s'tablir dans le temps imparti.

      PC  Le proxy a refus d'tablir une connexion au serveur parce que le
          nombre de connexions a atteint la limite 'maxconn' (global ou de
          l'instance). Le paramtre 'maxconn' de l'instance pourrait tre
          augment, tout comme le paramtre 'maxconn' global.

      RC  Une ressource locale a t puise (mmoire, sockets, ports source),
          empchant la connexion au serveur de s'tablir. Les logs d'erreurs
          diront prcisment ce qui manquait. Dans tous les cas, le seul remde
          consiste  affiner le paramtrage systme.

      cH  Le temps imparti au client a expir au cours d'une requte POST. Ceci
          est parfois caus par un paramtre TCP MSS trop lev sur le client
          pour des rseaux PPPoE sur ADSL qui ne peuvent pas transporter des
          paquets entiers.

      CH  Le client a abandonn alors qu'il attendait un dbut de rponse de la
          part du serveur. Cela peut tre caus par le serveur qui mettait trop
          de temps  rpondre, ou par un client cliquant prcipitamment sur le
          bouton 'Stop'.

      CQ  Le client a abandonn alors que sa session tait mise en file
          d'attente pour obtenir un serveur avec suffisamment de connexions
          libres pour l'accepter. Cela signifie soit que l'ensemble des
          serveurs taient saturs, soit que le serveur assign a mis trop de
          temps  rpondre.

      CT  Le client a abandonn alors que sa session tait bloque en mode
          tarpit.

      sQ  La session a attendu trop longtemps en file d'attente et a t
          expire.

      SH  Le serveur a abort brutalement alors qu'il devait envoyer ses
          en-ttes. En gnral, cela indique qu'il a crash.

      sH  Le serveur n'a pas pu rpondre durant le temps imparti, ce qui montre
          des transactions trop longues, probablement causes par un back-end
          satur. Les seules solutions sont de corriger le problme sur
          l'application, d'accrotre le paramtre 'srvtimeout' pour supporter
          des attentes plus longues au risque que les clients abandonnent 
          leur tour, ou bien d'ajouter des serveurs.
      
      PR  Le proxy a bloqu une requte du client, soit  cause d'une syntaxe
          HTTP invalide, auquel cas il a renvoy une erreur HTTP 400 au client,
          soit  cause d'une requte validant un filtre d'interdiction, auquel
          cas le proxy a renvoy une erreur HTTP 403.

      PH  Le proxy a bloqu la rponse du serveur parce qu'elle tait invalide,
          incomplte, dangereuse ('cache control'), ou parce qu'elle validait
          un filtre de scurit. Dans tous les cas, une erreur HTTP 502 est
          renvoye au client.

      PT  Le proxy a bloqu une requte du client et a maintenu sa connection
          ouverte avant de lui retourner une erreur "500 server error". Rien
          n'a t envoy au serveur.

      cD  Le client n'a pas lu de donnes pendant le temps qui lui tait
          imparti. Ceci est souvent caus par des problmes rseau ct client.

      CD  Le client a abort sa connection de manire inattendue pendant le
          transfert des donnes. Ceci est provoqu soit par le crash d'un
          navigateur, ou par une session en HTTP keep-alive entre le serveur
          et le client termine en premier par le client.

      sD  Le serveur n'a rien fait durant le temps imparti par le paramtre
          'srvtimeout'. Ceci est souvent caus par des timeouts trop courts
          sur des quipements de niveau 4 (firewalls, rpartiteurs de charge)
          situs entre le proxy et le serveur.

4.2.5) Caractres non-imprimables
---------------------------------
Depuis la version 1.1.29, les caractres non-imprimables ne sont plus envoys
tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
hexadcimaux, prfixs du caractre d'chappement '#'. Les seuls caractres
dornavant logus tels quels sont compris entre 32 et 126. Bien videmment, le
caractre d'chappement '#' est lui-mme encod afin de lever l'ambiguit. Il en
est de mme pour le caractre '"', ainsi que les caractres '{', '|' et '}' pour
les en-ttes.

4.2.6) Capture d'en-ttes HTTP et de cookies
--------------------------------------------
La version 1.1.23 a apport la capture des cookies, et la version 1.1.29 la
capture d'en-ttes. Tout ceci est effectu en utilisant le mot-cl 'capture'.

Les captures de cookies facilitent le suivi et la reconstitution d'une session
utilisateur. La syntaxe est la suivante :

    capture cookie <prfixe_cookie> len <longueur_capture>

Ceci activera la capture de cookies  la fois dans les requtes et dans les
rponses. De cette manire, il devient facile de dtecter lorsqu'un utilisateur
bascule sur une nouvelle session par exemple, car le serveur lui rassignera un
nouveau cookie.

Le premier cookie dont le nom commencera par <prfixe_cookie> sera captur, et
transmis sous la forme "NOM=valeur", sans toutefois, excder <longueur_capture>
caractres (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
place dans les logs.

Exemples :
----------
    # capture du premier cookie dont le nom commence par "ASPSESSION"
    capture cookie ASPSESSION len 32

    # capture du premier cookie dont le nom est exactement "vgnvisitor"
    capture cookie vgnvisitor= len 32

Dans les logs, le champ prcdant l'indicateur de compltude contient le cookie
positionn par le serveur, prcd du cookie positionn par le client. Chacun
de ces champs est remplac par le signe "-" lorsqu'aucun cookie n'est fourni
par le client ou le serveur, ou lorsque l'option est dsactive..

Les captures d'en-ttes ont un rle compltement diffrent. Elles sont utiles
pour suivre un identifiant de requte globalement unique positionn par un
autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
de clients web, la longueur des POST, les 'referrers', etc. Dans la rponse, on
peut chercher des informations relatives  la longueur annonce de la rponse,
le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
de redirection. Tout comme pour les captures de cookies, il est possible
d'inclure les en-ttes de requtes et de rponse simultanment. La syntaxe est
la suivante :

    capture request  header <nom> len <longueur max>
    capture response header <nom> len <longueur max>

Note: Les noms d'en-ttes ne sont pas sensibles  la casse.

Exemples:
---------
    # conserver le nom du serveur virtuel accd par le client
    capture request  header Host len 20
    # noter la longueur des donnes envoyes dans un POST
    capture request  header Content-Length len 10

    # noter le fonctionnement attendu du cache par le serveur
    capture response header Cache-Control len 8
    # noter l'URL de redirection
    capture response header Location len 20

Les en-ttes non trouvs sont logus  vide, et si un en-tte apparait plusieurs
fois, seule la dernire occurence sera conserve. Les en-ttes de requte sont
regroups entre deux accolades '{' et '}' dans l'ordre de leur dclaration, et
chacun spars par une barre verticale '|', sans aucun espace. Les en-ttes de
rponse sont prsents de la mme manire, mais aprs un espace suivant le bloc
d'en-tte de requte. Le tout prcde la requte HTTP. Exemple :

  Config:

    capture request  header Host len 20
    capture request  header Content-Length len 10
    capture request  header Referer len 20
    capture response header Server len 20
    capture response header Content-Length len 10
    capture response header Cache-Control len 8
    capture response header Via len 20
    capture response header Location len 20

  Log :

    Aug  9 20:26:09 localhost haproxy[2022]: 127.0.0.1:34014 [09/Aug/2004:20:26:09] relais-http netcache 0/0/0/162/+162 200 +350 - - ---- 0/0/0 0/0 {fr.adserver.yahoo.co||http://fr.f416.mail.} {|864|private||} "GET http://fr.adserver.yahoo.com/"
    Aug  9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34020 [09/Aug/2004:20:30:46] relais-http netcache 0/0/0/182/+182 200 +279 - - ---- 0/0/0 0/0 {w.ods.org||} {Formilux/0.1.8|3495|||} "GET http://w.ods.org/sytadin.html HTTP/1.1" 
    Aug  9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34028 [09/Aug/2004:20:30:46] relais-http netcache 0/0/2/126/+128 200 +223 - - ---- 0/0/0 0/0 {www.infotrafic.com||http://w.ods.org/syt} {Apache/2.0.40 (Red H|9068|||} "GET http://www.infotrafic.com/images/live/cartesidf/grandes/idf_ne.png HTTP/1.1" 

4.2.7) Exemples de logs
-----------------------
- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/0/7/147/6723 200 243 - - ---- 1/3/5  0/0"HEAD / HTTP/1.0"
  => requte longue (6.5s) saisie  la main avec un client telnet. Le serveur a
     rpondu en 147 ms et la session s'est termine normalement ('----')

- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/1230/7/147/6870 200 243 - - ---- 99/239/324 0/9 "HEAD / HTTP/1.0"
  => Idem, mais la requte a t mise en attente dans la file globale derrire
     9 autres requtes dj prsentes, et y a attendu 1230 ms.

- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/0/7/14/+30 200 +243 - - ---- 1/3/3 0/0 "GET /image.iso HTTP/1.0"
  => requte pour un long transfert. L'option 'logasap' tait spcifie donc le
     log a t gnr juste avant le transfert de donnes. Le serveur a rpondu
     en 14 ms, 243 octets d'en-ttes ont t transfrs au client, et le temps
     total entre l'accept() et le premier octet de donne est de 30 ms.

- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/0/7/14/30 502 243 - - PH-- 0/2/3 0/0 "GET /cgi-bin/bug.cgi? HTTP/1.0"
  => le proxy a bloqu une rponse du serveur soit  cause d'un filtre 'rspdeny'
     ou 'rspideny', soit parce qu'il a dtect un risque de fuite sensible
     d'informations risquant d'tre caches. Dans ce cas, la rponse est
     remplace par '502 bad gateway'.

- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/-1/8490 -1 0 - - CR-- 0/2/2 0/0 "" 
  => Le client n'a pas envoy sa requte et a referm la connexion lui-mme
     ('C---') au bout de 8.5s, alors que le relais attendait l'en-tte ('-R--').
     Aucune connexion n'a t envoye vers le serveur.

- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/-1/50001 408 0 - - cR-- 0/2/2 0/0 "" 
  => Le client n'a pas envoy sa requte et son time-out a expir ('c---') au
     bout de 50s, alors que le relais attendait l'en-tte ('-R--'). Aucune
     connexion n'a t envoye vers le serveur, mais le relais a tout de mme
     pu renvoyer un message 408 au client.

- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
  => log en mode 'tcplog'. Expiration du time-out ct client ('cD') au bout de
     5s.

- haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 115/202/205 0/0 "HEAD / HTTP/1.0" 
  => La requte client met 3s  entrer (peut-tre un problme rseau), et la
     connexion ('SC--') vers le serveur choue au bout de 4 tentatives de 2
     secondes (retries 3 dans la conf), puis un code 503 est retourn au
     client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
     instance, et 205 sur l'ensemble des instances pour ce processus. Il est
     possible que le serveur ait refus la connexion parce qu'il y en avait
     dj trop d'tablies.


4.3) Modification des en-ttes HTTP
----------------------------------
En mode HTTP uniquement, il est possible de remplacer certains en-ttes dans la
requte et/ou la rponse  partir d'expressions rgulires. Il est galement
possible de bloquer certaines requtes en fonction du contenu des en-ttes ou
de la requte. Une limitation cependant : les en-ttes fournis au milieu de
connexions persistentes (keep-alive) ne sont pas vus car ils sont considrs
comme faisant partie des changes de donnes conscutifs  la premire requte.
Les donnes ne sont pas affectes, ceci ne s'applique qu'aux en-ttes. 

La syntaxe est :
   reqadd    <string>             pour ajouter un en-tte dans la requte
   reqrep    <search> <replace>   pour modifier la requte
   reqirep   <search> <replace>   idem sans distinction majuscules/minuscules
   reqdel    <search>             pour supprimer un en-tte dans la requte
   reqidel   <search>             idem sans distinction majuscules/minuscules
   reqallow  <search>             autoriser la requte si un en-tte valide <search>
   reqiallow <search>             idem sans distinction majuscules/minuscules
   reqdeny   <search>             interdire la requte si un en-tte valide <search>
   reqideny  <search>             idem sans distinction majuscules/minuscules
   reqpass   <search>             inhibe ces actions sur les en-ttes validant <search>
   reqipass  <search>             idem sans distinction majuscules/minuscules
   reqtarpit <search>             bloquer et maintenir une request validant <search>
   reqitarpit <search>            idem sans distinction majuscules/minuscules

   rspadd   <string>              pour ajouter un en-tte dans la rponse
   rsprep   <search> <replace>    pour modifier la rponse
   rspirep  <search> <replace>    idem sans distinction majuscules/minuscules
   rspdel   <search>              pour supprimer un en-tte dans la rponse
   rspidel  <search>              idem sans distinction majuscules/minuscules
   rspdeny  <search>              remplace la rponse par un HTTP 502 si un
                                  en-tte valide <search>
   rspideny <search>              idem sans distinction majuscules/minuscules


<search> est une expression rgulire compatible POSIX regexp supportant le
groupage par parenthses (sans les '\'). Les espaces et autres sparateurs
doivent tres prcds d'un '\' pour ne pas tre confondus avec la fin de la
chane. De plus, certains caractres spciaux peuvent tre prcds d'un
backslach ('\') :

  \t   pour une tabulation
  \r   pour un retour charriot
  \n   pour un saut de ligne
  \    pour diffrencier un espace d'un sparateur
  \#   pour diffrencier un dise d'un commentaire
  \\   pour utiliser un backslash dans la regex
  \\\\ pour utiliser un backslash dans le texte
  \xXX pour un caractre spcifique XX (comme en C)


<replace> contient la chane remplaant la portion vrifie par l'expression.
Elle peut inclure les caractres spciaux ci-dessus, faire rfrence  un
groupe dlimit par des parenthses dans l'expression rgulire, par sa
position numrale. Les positions vont de 0  9, et sont codes par un '\'
suivi du chiffre dsir (0 dsignant la ligne complte). Il est galement
possible d'insrer un caractre non imprimable (utile pour le saut de ligne)
inscrivant '\x' suivi du code hexadcimal de ce caractre (comme en C).

<string> reprsente une chane qui sera ajoute systmatiquement aprs la
dernire ligne d'en-tte.

Remarques :
-----------
  - la premire ligne de la requte et celle de la rponse sont traites comme
    des en-ttes, ce qui permet de rcrire des URL et des codes d'erreur.
  - 'reqrep' est l'quivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
    'srvexp'. Ces noms sont toujours supports mais dconseills.
  - pour des raisons de performances, le nombre total de caractres ajouts sur
    une requte ou une rponse est limit  4096 depuis la version 1.1.5 (cette
    limite tait  256 auparavant). Cette valeur est modifiable dans le code.
    Pour un usage temporaire, on peut gagner de la place en supprimant quelques
    en-ttes inutiles avant les ajouts.
  - une requte bloque produira une rponse "HTTP 403 forbidden" tandis qu'une
    rponse bloque produira une rponse "HTTP 502 Bad gateway".
  - une requte bloque par 'reqtarpit' sera maintenue pendant une dure gale
    au paramtre 'contimeout', ou jusqu' l'abandon du client. Rien ne sera
    envoy au serveur. Lorsque le temps allou expire, le proxy rpondra avec
    une rponse "500 server error" de sorte que l'attaquant ne suspecte pas
    qu'il ait t bloqu. Les logs rapporteront aussi ce code 500, mais les
    flags de terminaison indiqueront "PT".

Exemples :
----------
        ###### a few examples ######

        # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
        reqrep        ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
        reqrep        ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3

        # force proxy connections to close
        reqirep        ^Proxy-Connection:.*        Proxy-Connection:\ close
        # rewrite locations
        rspirep        ^(Location:\ )([^:]*://[^/]*)(.*) \1\3

        ###### A full configuration being used on production ######

        # Every header should end with a colon followed by one space.
        reqideny        ^[^:\ ]*[\ ]*$

        # block Apache chunk exploit
        reqideny        ^Transfer-Encoding:[\ ]*chunked
        reqideny        ^Host:\ apache-

        # block annoying worms that fill the logs...
        reqideny        ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
        reqideny        ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
        reqideny        ^[^:\ ]*\ .*<script
        reqideny        ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)

	# tarpit attacks on the login page.
        reqtarpit     ^[^:\ ]*\ .*\.php?login=[^0-9]

        # allow other syntactically valid requests, and block any other method
        reqipass        ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
        reqipass        ^OPTIONS\ \\*\ HTTP/1\.[01]$
        reqideny        ^[^:\ ]*\ 

        # force connection:close, thus disabling HTTP keep-alive
        option                httpclos

        # change the server name
        rspidel         ^Server:\ 
        rspadd          Server:\ Formilux/0.1.8


De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
'X-Forwarded-For' de la requte, ce qui permet  un serveur web final de
connatre l'adresse IP du client initial. Depuis la version 1.3.8, il est
possible de prciser le mot-cl "except" suivi d'une adresse ou un rseau
IP source pour lequel l'entte ne sera pas ajout. C'est trs pratique dans le
cas o un autre reverse-proxy ajoutant dj l'entte est install sur la mme
machine ou dans une DMZ connue. Le cas le plus frquent est li  l'utilisation
de stunnel en local.

Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
en-tte de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
Ceci simplifie la dsactivation du keep-alive HTTP par rapport  l'ancienne
mthode impliquant 4 rgles.

Exemple :
---------
    listen http_proxy 0.0.0.0:80
        mode http
        log  global
        option httplog
        option dontlognull
        option forwardfor except 127.0.0.1/8
        option httpclose

Notons que certains serveurs HTTP ne referment pas ncessairement la session
TCP en fin de traitement lorsqu'ils reoivent un entte 'Connection: close',
ce qui se traduit par des grands nombres de sessions tablies et des temps
globaux trs longs sur les requtes. Pour contourner ce problme, la version
1.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
vers le serveur ds qu'il commence  rpondre et seulement si le tampon de
requte est vide. Attention toutefois  ne PAS utiliser cette option si des
mthodes CONNECT sont attendues entre le client et le serveur. L'option
'forceclose' implique l'option 'httpclose'.

Exemple :
---------
    listen http_proxy 0.0.0.0:80
        mode http
        log  global
        option httplog
        option dontlognull
        option forwardfor
        option forceclose


4.4) Rpartition avec persistence
---------------------------------
La combinaison de l'insertion de cookie avec la rpartition de charge interne
permet d'assurer une persistence dans les sessions HTTP d'une manire
pratiquement transparente pour les applications. Le principe est simple :
  - attribuer une valeur d'un cookie  chaque serveur
  - effectuer une rpartition interne
  - insrer un cookie dans les rponses issues d'une rpartition uniquement,
    et faire en sorte que des caches ne mmorisent pas ce cookie.
  - cacher ce cookie  l'application lors des requtes ultrieures.

Exemple :
---------
    listen application 0.0.0.0:80
        mode http
        cookie SERVERID insert nocache indirect
        balance roundrobin
        server srv1 192.168.1.1:80 cookie server01 check
        server srv2 192.168.1.2:80 cookie server02 check

L'autre solution apporte par les versions 1.1.30 et 1.2.3 est de rutiliser un
cookie en provenance du serveur et de lui prfixer l'identifiant du serveur.
Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empcher le
client et le serveur de travailler en mode "keep-alive" afin que le proxy
puisse corriger le nom du cookie dans toutes les futures requtes.

    listen application 0.0.0.0:80
       mode http
       cookie JSESSIONID prefix
       balance roundrobin
       server srv1 192.168.1.1:80 cookie srv1 check
       server srv2 192.168.1.2:80 cookie srv2 check
       option httpclose


4.5) Protection contre les fuites d'informations du serveur
-----------------------------------------------------------
Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a t
cre. Elle sert  inspecter minutieusement les en-ttes 'Cache-control',
'Pragma', et 'Set-cookie' dans les rponses serveur pour dterminer s'il y a
un risque de cacher un cookie sur un proxy ct client. Quand cette option est
active, les seules rponses qui peuvent tre retournes au client sont :
  - toutes celles qui n'ont pas d'en-tte 'Set-cookie' ;
  - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301, 
    410, sauf si le serveur a positionn un en-tte 'Cache-control: public' ;
  - celles qui font suite  une requte POST, sauf si le serveur a positionn
    un en-tte 'Cache-control: public' ;
  - celles qui ont un en-tte 'Pragma: no-cache' ;
  - celles qui ont un en-tte 'Cache-control: private' ; 
  - celles qui ont un en-tte 'Cache-control: no-store' ; 
  - celles qui ont un en-tte 'Cache-control: max-age=0' ;
  - celles qui ont un en-tte 'Cache-control: s-maxage=0' ;
  - celles qui ont un en-tte 'Cache-control: no-cache' ;
  - celles qui ont un en-tte 'Cache-control: no-cache="set-cookie"' ;
  - celles qui ont un en-tte 'Cache-control: no-cache="set-cookie,'
    (autorisant d'autres champs aprs set-cookie).

Si une rponse ne respecte pas ces pr-requis, alors elle sera bloque de la
mme manire que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
message "HTTP 502 bad gateway". L'tat de session montre "PH--" ce qui veut
dire que c'est le proxy qui a bloqu la rponse durant le traitement des
en-ttes. De plus, un message d'alerte sera envoy dans les logs de sorte que
l'administrateur sache qu'il y a une action correctrice  entreprendre.

4.6) Personalisation des erreurs
--------------------------------
Certaines situations conduisent  retourner une erreur HTTP au client :
  - requte invalide ou trop longue => code HTTP 400
  - requte mettant trop de temps  venir => code HTTP 408
  - requte interdite (bloque par un reqideny) => code HTTP 403
  - erreur interne du proxy => code HTTP 500
  - le serveur a retourn une rponse incomplte ou invalide => code HTTP 502
  - aucun serveur disponible pour cette requte => code HTTP 503
  - le serveur n'a pas rpondu dans le temps imparti => code HTTP 504

Un message d'erreur succint tir de la RFC accompagne ces codes de retour.
Cependant, en fonction du type de clientle, on peut prfrer retourner des
pages personnalises. Ceci est possible de deux manires, l'une reposant sur
une redirection vers un serveur connu, et l'autre consistant  retourner un
fichier local.

4.6.1) Redirection
------------------
Une redirection d'erreur est assure par le biais de la commande "errorloc" :

    errorloc <code_HTTP> <location>

Au lieu de gnrer une erreur HTTP <code_HTTP> parmi les codes cits ci-dessus,
le proxy gnrera un code de redirection temporaire (HTTP 302) vers l'adresse
d'une page prcise dans <location>. Cette adresse peut tre relative au site,
ou absolue. Comme cette rponse est trate par le navigateur du client
lui-mme, il est indispensable que l'adresse fournie lui soit accessible.

Exemple :
---------
    listen application 0.0.0.0:80
        errorloc 400 /badrequest.html
        errorloc 403 /forbidden.html
        errorloc 408 /toolong.html
        errorloc 500 http://haproxy.domain.net/bugreport.html
        errorloc 502 http://192.168.114.58/error50x.html
        errorloc 503 http://192.168.114.58/error50x.html
        errorloc 504 http://192.168.114.58/error50x.html

Note: la RFC2616 stipule qu'un client doit rutiliser la mme mthode pour
accder  l'URL de redirection que celle qui l'a retourne, ce qui pose des
problmes avec les requtes POST. Le code de retour 303 a t cr exprs pour
rgler ce problme, indiquant au client qu'il doit accder  l'URL retourne
dans le champ Location avec la mthode GET uniquement. Seulement, certains
navigateurs antrieurs  HTTP/1.1 ne connaissent pas ce code de retour. De
plus, la plupart des navigateurs se comportent dj avec le code 302 comme ils
devraient le faire avec le 303. Donc, dans le but de laisser le choix 
l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
visant  remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.

Leur usage non ambig est recommand  la place de la commande 'errorloc' (qui
utilise toujours 302). Dans le doute, prfrez l'utilisation de 'errorloc303'
ds que vous savez que vos clients supportent le code de retour HTTP 303.

4.6.2) Fichiers locaux
----------------------
Parfois il est souhaitable de changer l'erreur retourne sans recourir  des
redirections. La seconde mthode consiste  charger des fichiers locaux lors
du dmarrage et  les envoyer en guise de pur contenu HTTP en cas d'erreur.
C'est ce que fait le mot cl 'errorfile'.

Attention, il y a des piges  prendre en compte :
 - les fichiers sont chargs durant l'analyse de la configuration, avant de
   faire le chroot(). Donc ils sont relatifs au systme de fichiers rel. Pour
   cette raison, il est recommand de toujours passer un chemin absolu vers ces
   fichiers.

 - le contenu de ces fichiers n'est pas du HTML mais vraiment du protocole HTTP
   avec potentiellement un corps HTML. Donc la premire ligne et les en-ttes
   sont obligatoires. Idalement, chaque ligne dans la partie HTTP devrait se
   terminer par un CR-LF pour un maximum de compatibilit.

 - les rponses sont limites  une taille de buffer (BUFSIZE), gnralement 8
   ou 16 ko.

 - les rponses ne devraient pas inclure de rfrences aux serveurs locaux,
   afin de ne pas risquer de crer des boucles infinies sur le navigateur dans
   le cas d'une panne locale.

Exemple :
---------
        errorfile 400 /etc/haproxy/errorfiles/400badreq.http
        errorfile 403 /etc/haproxy/errorfiles/403forbid.http
        errorfile 503 /etc/haproxy/errorfiles/503sorry.http


4.7) Changement des valeurs par dfaut
--------------------------------------
Dans la version 1.1.22 est apparue la notion de valeurs par dfaut, ce qui
vite de rpter des paramtres communs  toutes les instances, tels que les
timeouts, adresses de log, modes de fonctionnement, etc.

Les valeurs par dfaut sont positionnes dans la dernire section 'defaults'
prcdent l'instance qui les utilisera. On peut donc mettre autant de sections
'defaults' que l'on veut. Il faut juste se rappeler que la prsence d'une telle
section implique une annulation de tous les paramtres par dfaut positionns
prcdemment, dans le but de les remplacer.

La section 'defaults' utilise la mme syntaxe que la section 'listen', aux
paramtres prs qui ne sont pas supports. Le mot cl 'defaults' peut accepter
un commentaire en guise paramtre.

Dans la version 1.1.28/1.2.1, seuls les paramtres suivants peuvent tre
positionns dans une section 'defaults' :
  - log (le premier et le second)
  - mode { tcp, http, health }
  - balance { roundrobin }
  - disabled (pour dsactiver toutes les instances qui suivent)
  - enabled (pour faire l'opration inverse, mais c'est le cas par dfaut)
  - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
  - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
             checkcache, httplog, tcplog, dontlognull, persist, httpchk }
  - redispatch, redisp, transparent, source { addr:port }
  - cookie, capture
  - errorloc

Ne sont pas supports dans cette version, les adresses de dispatch et les
configurations de serveurs, ainsi que tous les filtres bass sur les
expressions rgulires :
  - dispatch, server,
  - req*, rsp*

Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramtre boolen
positionn par dfaut. Donc si une option est spcifie dans les paramtres par
dfaut, le seul moyen de la dsactiver pour une instance, c'est de changer les
paramtres par dfaut avant la dclaration de l'instance.

Exemples :
----------
    defaults applications TCP
        log global
        mode tcp
        balance roundrobin
        clitimeout 180000
        srvtimeout 180000
        contimeout 4000
        retries 3
        redispatch

    listen app_tcp1 10.0.0.1:6000-6063
        server srv1 192.168.1.1 check port 6000 inter 10000
        server srv2 192.168.1.2 backup

    listen app_tcp2 10.0.0.2:6000-6063
        server srv1 192.168.2.1 check port 6000 inter 10000
        server srv2 192.168.2.2 backup
    
    defaults applications HTTP
        log global
        mode http
        option httplog
        option forwardfor
        option dontlognull
        balance roundrobin
        clitimeout 20000
        srvtimeout 20000
        contimeout 4000
        retries 3

    listen app_http1 10.0.0.1:80-81
        cookie SERVERID postonly insert indirect
        capture cookie userid= len 10
        server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
        server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000

    defaults
        # section vide qui annule tous les paramtes par dfaut.


4.8) Rapport d'tat sous forme de page HTML
-------------------------------------------
Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
requtes pour une URI particulire et de retourner un rapport complet d'tat de
l'activit du proxy, et des statistiques sur les serveurs. Ceci est disponible
via le mot cl "stats" associ  n'importe laquelle de ces options :

   - stats enable
   - stats uri <uri prefix>
   - stats realm <authentication realm>
   - stats auth <user:password>
   - stats scope <proxy_id> | '.'


Par dfaut, le rapport est dsactiv. Le fait de spcifier une des combinaision
ci-dessus active le rapport pour l'instance de proxy qui le rfrence. La
solution la plus simple est d'utiliser "stats enable" qui activera le rapport
avec les paramtres par dfaut suivant :

   - default URI   : "/haproxy?stats"        (CONFIG_STATS_DEFAULT_URI)
   - default auth  : non spcifi (pas d'authentication)
   - default realm : "HAProxy Statistics"    (CONFIG_STATS_DEFAULT_REALM)
   - default scope : non specifi (accs  toutes les instances)

L'option "stats uri <uri_prefix>" permet d'intercepter un autre prfixe d'URI
que celui par dfaut. Noter que n'importe quelle URI qui COMMENCE avec cette
chane sera valide. Par exemple, une instance pourrait tre ddie  la page
d'tat seulement et rpondre  toute URI.

Example :
---------
    # intercepte n'importe quelle URI et retourne la page d'tat.
    listen stats :8080
        mode http
        stats uri /


L'option "stats auth <user:password>" active l'authentification "Basic" et
ajoute un couple "user:password" valide  la liste des comptes autoriss.
L'utilisateur <user> et le mot de passe <password> doivent tre prciss
en clair dans le fichier de configuration, et comme ceci est de
l'authentification HTTP "Basic", il faut tre conscient qu'ils transitent en
clair sur le rseau, donc il ne faut pas utiliser de compte sensible. La liste
est illimite dans le but de pouvoir fournir des accs facilement  des
dveloppeurs ou  des clients.

L'option "stats realm <realm>" dfinit le "domaine" ("realm") de validit du
mot de passe qui sera prsent dans la bote de dialogue du navigateur
lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
de s'assurer que celui-ci soit diffrent de ceux utiliss par l'application,
autrement le navigateur tentera d'en utiliser un cach depuis l'application.
Noter que les espaces dans le nom de "realm" doivent tre protgs par un
backslash ('\').

L'option "stats scope <proxy_id>" limite la porte du rapport d'tat. Par
dfaut, toutes les instances proxy sont listes. Mais dans certaines
circonstances, il serait prfrable de ne lister que certains proxies ou
simplement le proxy courant. C'est ce que fait cette option. Le nom spcial "."
(un simple point) rfrence le proxy courant. Cette option peut tre rpte
autant de fois que ncessaire pour autoriser d'autres proxies, mme pour des
noms rfrencs plus loin dans la configuration ou bien des noms qui n'existent
pas encore. Le nom prcis est celui qui apparait aprs le mot cl "listen".

Exemple :
---------
    # simple application embarquant la page d'tat authentifie
    listen app1 192.168.1.100:80
        mode http
        option httpclose
        balance roundrobin
        cookie SERVERID postonly insert indirect
        server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
        server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
        stats uri /my_stats
        stats realm Statistics\ for\ MyApp1-2
        stats auth guest:guest
        stats auth admin:AdMiN123
        stats scope .
        stats scope app2

    # simple application embarquant la page d'tat sans authentification
    listen app2 192.168.2.100:80
        mode http
        option httpclose
        balance roundrobin
        cookie SERVERID postonly insert indirect
        server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
        server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
        stats uri /my_stats
        stats realm Statistics\ for\ MyApp2
        stats scope .

    listen admin_page :8080
        mode http
        stats uri /my_stats
        stats realm Global\ statistics
        stats auth admin:AdMiN123

Notes :
-------
  - les options "stats" peuvent aussi tre spcifies dans une section
    "defaults", auquel cas la mme configuration exactement sera fournie 
    toutes les instances suivantes, d'o l'utilit du scope ".". Toutefois, si
    une instance redfinit n'importe quel paramtre "stats", alors les dfauts
    ne lui seront pas appliqus.

  - l'authentification "Basic" est trs simpliste et non scurise contre la
    capture rseau. Aucun mot de passe sensible ne doit tre utilis, et il
    est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
    aprs usage, donc il sera envoy tel quel  l'application au cours des
    accs successifs.

  - Il est trs important de prciser l'option "httpclose", sinon le proxy ne
    sera pas en mesure de dtecter les URI dans les sessions keep-alive
    maintenues entre le navigateur et les serveurs, donc les URI de stats
    seront transmises telles quelles aux serveurs comme si l'option n'tait
    pas prcise.


5) Listes d'accs
=================

Avec la version 1.3.10, un nouveau concept de listes d'accs (ACL) a vu le
jour. Comme il n'tait pas ncessaire de rinventer la roue, et du fait que
toutes les rflexions passes aboutissaient  des propositions non
satisfaisantes, il a finalement t dcid que quelque chose de proche de ce
que Squid offre serait un bon compromis entre une richesse fonctionnelle et une
facilit d'utilisation

Le principe est trs simple : les ACLs sont dclares avec un nom, un test et
une liste de valeurs valides  tester. Des conditions sont appliques sur
diverses actions, et ces conditions effectuent un ET logique entre les ACLs. La
condition n'est donc valide que si toutes les ACLs sont vraies.

Il est galement possible d'utiliser le mot rserv "OR" dans les conditions,
et il est possible pour une ACL d'tre spcifie plusieurs fois, mme avec des
tests diffrents, auquel cas le premier test russi validera l'ACL.

Au stade de la version 1.3.12, seuls les tests suivants ont t implments :

   Niveaux 3/4 :
     src       <ipv4_address>[/mask] ... : match IPv4 source address
     dst       <ipv4_address>[/mask] ... : match IPv4 destination address
     src_port  <range> ...               : match source port range
     dst_port  <range> ...               : match destination port range
     dst_conn  <range> ...               : match #connections on frontend

   Niveau 7 :
     method    <HTTP method> ...  : match HTTP method
     req_ver   <1.0|1.1> ...      : match HTTP request version
     resp_ver  <1.0|1.1> ...      : match HTTP response version
     status    <range> ...        : match HTTP response status code in range
     url       <string> ... : exact string match on URI
     url_reg   <regex>  ... : regex string match on URI
     url_beg   <string> ... : true if URI begins with <string>
     url_end   <string> ... : true if URI ends with <string>
     url_sub   <string> ... : true if URI contains <string>
     url_dir   <string> ... : true if URI contains <string> between slashes
     url_dom   <string> ... : true if URI contains <string> between slashes or dots

Une plage ('range') est constitue d'un ou deux entiers qui peuvent tre
prfixs d'un oprateur. La syntaxe est :

  [<op>] <min>[:<max>]

Avec <op> pouvant tre :
  'eq' : la valeur doit galer <min> ou tre comprise entre <min> et <max>
  'le' : la valeur doit tre infrieure ou gale  <min>
  'lt' : la valeur doit tre strictement infrieure  <min>
  'ge' : la valeur doit tre suprieure ou gale  <min>
  'gt' : la valeur doit tre strictement suprieure  <min>

Lorsqu'aucun oprateur n'est dfini, 'eq' est employ. Noter que lorsqu'un
oprateur est spcifi, il s'applique  toutes les plages de valeurs suivantes
jusqu' la fin de la ligne ou bien jusqu' ce qu'un nouvel oprateur soit
prcis. Exemple :

  acl status_error  status   400:599
  acl saturated_frt dst_conn ge 1000
  acl invalid_ports src_port lt 512 ge 65535

D'autres tests arrivent (enttes, cookies, heure, authentification), c'est
juste une question de temps. Il est aussi prvu de permettre de lire les
valeurs depuis un fichier, ainsi que d'ignorer la casse pour certains tests.

La seule commande supportant les conditions d'ACL  ce jour est la nouvelle
commande "block" qui bloque une requte et retourne un statut 403 si sa
condition est valide (cas du "if") ou invalide (cas du "unless").

Exemple :
---------

    acl options_uris  url *
    acl meth_option   method OPTIONS
    acl http_1.1      req_ver 1.1
    acl allowed_meth  method GET HEAD POST OPTIONS CONNECT
    acl connect_meth  method CONNECT
    acl proxy_url     url_beg http://

    # block if reserved URI "*" used with a method other than "OPTIONS"
    block if options_uris !meth_option

    # block if the OPTIONS method is used with HTTP 1.0
    block if meth_option !http_1.1

    # allow non-proxy url with anything but the CONNECT method
    block if !connect_meth !proxy_url

    # block all unknown methods
    block unless allowed_meth

Note: Cette documentation est embryonnaire mais doit permettre de dmarrer et
surtout d'avancer sur le projet sans tre trop ralenti par la documentation.


=======================
| Paramtrage systme |
=======================

Sous Linux 2.4
==============

-- cut here --
#!/bin/sh
# set this to about 256/4M (16384 for 256M machine)
MAXFILES=16384
echo $MAXFILES > /proc/sys/fs/file-max
ulimit -n $MAXFILES

if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
        echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
fi

if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
        # 30 seconds for fin, 15 for time wait
        echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
        echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
        echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
        echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
fi

echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 0 > /proc/sys/net/ipv4/tcp_ecn
echo 1 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_dsack

# auto-tuned on 2.4
#echo 262143 > /proc/sys/net/core/rmem_max
#echo 262143 > /proc/sys/net/core/rmem_default

echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem

-- cut here --

Sous FreeBSD
============

Un port de HA-Proxy sous FreeBSD est dsormais disponible, grce 
Clement Laforet <sheepkiller@cultdeadsheep.org>.

Pour plus d'informations :
http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
http://www.freshports.org/net/haproxy


-- fin --