* released 1.1.27

* the configurable HTTP health check introduced in 1.1.23 revealed a shameful
  bug : the code still assumed that HTTP requests were the same size as the
  original ones (22 bytes), and failed if they were not.
* added support for pidfiles.
This commit is contained in:
willy tarreau 2005-12-17 14:14:34 +01:00
parent c58fc6943d
commit fe2c5c147b
6 changed files with 120 additions and 15 deletions

View File

@ -1,6 +1,12 @@
ChangeLog :
===========
2003/10/27 : 1.1.27
- the configurable HTTP health check introduced in 1.1.23 revealed a shameful
bug : the code still assumed that HTTP requests were the same size as the
original ones (22 bytes), and failed if they were not.
- added support for pidfiles.
2003/10/22 : 1.1.26
- the fix introduced in 1.1.25 for client timeouts while waiting for servers
broke almost all compatibility with POST requests, because the proxy

View File

@ -1,9 +1,9 @@
H A - P r o x y
---------------
version 1.1.25
version 1.1.27
willy tarreau
2003/10/15
2003/10/27
============
| Abstract |
@ -35,6 +35,8 @@ There are only a few command line options :
-N <high limit for the per-proxy number of simultaneous connections>
-d starts in foregreound with debugging mode enabled
-D starts in daemon mode
-p <pidfile> asks the process to write down each of its children's
pids to this file in daemon mode.
-s shows statistics (only if compiled in)
-l shows even more statistics (implies '-s')
@ -92,6 +94,7 @@ the following ones :
- daemon
- debug
- quiet
- pidfile <file>
1.1) Event logging
------------------
@ -231,6 +234,28 @@ Example :
nbproc 2
1.6) Helping process management
-------------------------------
Haproxy now supports the notion of pidfile. If the '-p' command line argument,
or the 'pidfile' global option is followed with a file name, this file will be
removed, then filled with all children's pids, one per line (only in daemon
mode). This file is NOT within the chroot, which allows to work with a readonly
chroot. It will be owned by the user starting the process, and will have
permissions 0644.
Example :
---------
global
daemon
quiet
nbproc 2
pidfile /var/run/haproxy-private.pid
# to stop only those processes among others :
# kill $(</var/run/haproxy-private.pid)
2) Declaration of a listening service
=====================================

View File

@ -1,9 +1,9 @@
H A - P r o x y
---------------
version 1.1.25
version 1.1.27
willy tarreau
2003/10/15
2003/10/27
================
| Introduction |
@ -37,6 +37,8 @@ Les options de lancement sont peu nombreuses :
-N <nombre maximal de connexions simultanées par proxy>
-d active le mode debug
-D passe en daemon
-p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
fils dans ce fichier en mode démon.
-s affiche les statistiques (si option compilée)
-l ajoute des informations aux statistiques
@ -95,6 +97,7 @@ support
- daemon
- debug
- quiet
- pidfile <fichier>
1.1) Journalisation des événements
----------------------------------
@ -199,7 +202,7 @@ Exemple :
gid 30000
chroot /var/chroot/haproxy
1.4) modes de fonctionnement
1.4) Modes de fonctionnement
----------------------------
Le service peut fonctionner dans plusieurs modes :
- avant- / arrière-plan
@ -222,7 +225,7 @@ probl
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
1.5) Accroissement de la capacité de traitement
-----------------------------------------------
Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
processeur pour effectuer les tâches de relayage, même si les charges
@ -241,6 +244,29 @@ Exemple :
quiet
nbproc 2
1.6) Simplification de la gestion des processus
-----------------------------------------------
Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
paramètre '-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 numéro de PID des processus fils, à raison d'un par ligne (valable
uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
afin de rester compatible avec un répertoire protégé 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)
2) Définition d'un service en écoute
====================================

View File

@ -1,3 +1,6 @@
service haproxy
config /etc/haproxy/haproxy.cfg
service haproxy ext
config /etc/haproxy/haproxy-ext.cfg
service haproxy int
config /etc/haproxy/haproxy-int.cfg

View File

@ -4,7 +4,7 @@
option config standard_option /etc/haproxy/haproxy.cfg
option bin reserved_option /usr/sbin/haproxy
option cmdline reserved_option '$bin -q -D -f ${opt_config}'
option cmdline reserved_option '$bin -f ${opt_config} -p ${pidfile} -D -q'
function do_help {
echo "Usage: ${0##*/} <status|start|stop|help>"
@ -15,6 +15,10 @@ function do_help {
exit 1
}
# assign default values to options and variables before parsing the cfg file
function fct_begin_section {
pidfile="/var/run/haproxy${2:+-$2}.pid"
}
load_config

View File

@ -53,8 +53,8 @@
#include <linux/netfilter_ipv4.h>
#endif
#define HAPROXY_VERSION "1.1.26"
#define HAPROXY_DATE "2003/10/22"
#define HAPROXY_VERSION "1.1.27"
#define HAPROXY_DATE "2003/10/27"
/* this is for libc5 for example */
#ifndef TCP_NODELAY
@ -491,6 +491,7 @@ static struct {
int maxsock; /* max # of sockets */
int mode;
char *chroot;
char *pidfile;
int logfac1, logfac2;
int loglev1, loglev2;
struct sockaddr_in logsrv1, logsrv2;
@ -677,7 +678,7 @@ void usage(char *name) {
#if STATTIME > 0
"sl"
#endif
"D ] [ -n <maxconn> ] [ -N <maxpconn> ]\n"
"D ] [ -n <maxconn> ] [ -N <maxpconn> ] [ -p <pidfile> ]\n"
" -v displays version\n"
" -d enters debug mode\n"
#if STATTIME > 0
@ -687,7 +688,8 @@ void usage(char *name) {
" -D goes daemon ; implies -q\n"
" -q quiet mode : don't display messages\n"
" -n sets the maximum total # of connections (%d)\n"
" -N sets the default, per-proxy maximum # of connections (%d)\n\n",
" -N sets the default, per-proxy maximum # of connections (%d)\n"
" -p writes pids of all children to this file\n\n",
name, DEFAULT_MAXCONN, cfg_maxpconn);
exit(1);
}
@ -2226,7 +2228,7 @@ int event_srv_chk_w(int fd) {
#else
ret = send(fd, s->proxy->check_req, s->proxy->check_len, MSG_DONTWAIT | MSG_NOSIGNAL);
#endif
if (ret == 22) {
if (ret == s->proxy->check_len) {
FD_SET(fd, StaticReadEvent); /* prepare for reading reply */
FD_CLR(fd, StaticWriteEvent); /* nothing more to write */
return 0;
@ -4337,6 +4339,17 @@ int cfg_parse_global(char *file, int linenum, char **args) {
}
global.chroot = strdup(args[1]);
}
else if (!strcmp(args[0], "pidfile")) {
if (global.pidfile != NULL) {
Alert("parsing [%s:%d] : '%s' already specified. Continuing.\n", file, linenum, args[0]);
return 0;
}
if (*(args[1]) == 0) {
Alert("parsing [%s:%d] : '%s' expects a file name as an argument.\n", file, linenum, args[0]);
return -1;
}
global.pidfile = strdup(args[1]);
}
else if (!strcmp(args[0], "log")) { /* syslog server address */
struct sockaddr_in *sa;
int facility, level;
@ -5614,6 +5627,7 @@ void init(int argc, char **argv) {
int arg_mode = 0; /* MODE_DEBUG, ... */
char *old_argv = *argv;
char *tmp;
char *cfg_pidfile = NULL;
int cfg_maxconn = 0; /* # of simultaneous connections, (-n) */
if (1<<INTBITS != sizeof(int)*8) {
@ -5661,6 +5675,7 @@ void init(int argc, char **argv) {
case 'n' : cfg_maxconn = atol(*argv); break;
case 'N' : cfg_maxpconn = atol(*argv); break;
case 'f' : cfg_cfgfile = *argv; break;
case 'p' : cfg_pidfile = *argv; break;
default: usage(old_argv);
}
}
@ -5683,6 +5698,12 @@ void init(int argc, char **argv) {
if (cfg_maxconn > 0)
global.maxconn = cfg_maxconn;
if (cfg_pidfile) {
if (global.pidfile)
free(global.pidfile);
global.pidfile = strdup(cfg_pidfile);
}
if (global.maxconn == 0)
global.maxconn = DEFAULT_MAXCONN;
@ -5802,6 +5823,7 @@ int start_proxies() {
int main(int argc, char **argv) {
FILE *pidfile = NULL;
init(argc, argv);
if (global.mode & MODE_QUIET) {
@ -5824,7 +5846,17 @@ int main(int argc, char **argv) {
if (start_proxies() < 0)
exit(1);
/* open log files */
/* open log & pid files before the chroot */
if (global.mode & MODE_DAEMON && global.pidfile != NULL) {
int pidfd;
unlink(global.pidfile);
pidfd = open(global.pidfile, O_CREAT | O_WRONLY | O_TRUNC, 0644);
if (pidfd < 0) {
Alert("[%s.main()] Cannot create pidfile %s\n", argv[0], global.pidfile);
exit(1);
}
pidfile = fdopen(pidfd, "w");
}
/* chroot if needed */
if (global.chroot != NULL) {
@ -5859,7 +5891,16 @@ int main(int argc, char **argv) {
}
else if (ret == 0) /* child breaks here */
break;
if (pidfile != NULL) {
fprintf(pidfile, "%d\n", ret);
fflush(pidfile);
}
}
/* close the pidfile both in children and father */
if (pidfile != NULL)
fclose(pidfile);
free(global.pidfile);
if (proc == global.nbproc)
exit(0); /* parent must leave */