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 --
|